用python编写星际入侵者游戏--Turtle的应用

之前在python中用Turtle编写了一个打乒乓的游戏,是对Turtle的基本应用,这次再编写一个更加复杂的游戏–星际入侵者(一个打飞碟的游戏)

在存放.py文件的文件夹中放入图片和音频可以使游戏更加的生动有趣。
图片的话turtle自带bgpic这个方法直接调用,具体的注意事项在后面代码里;而音频的话需要simpleaudio,我的电脑不知道为什么不能装,不过它的用法更调用turtle差不多,大同小异。

这里面使用了列表把敌方装了进去,然后用for循环遍历,相当于一个花名册,比较方便。

对于分数的显示,同样地,先初始化一个,再在满足条件时刷新并重新显示。

话不多说上代码,里面我分了很多小节,有相应的注释:

(这个游戏其实还是有不足的:敌方不能单独地移动,使可玩性降低 (希望大佬提出意见!))

#显示窗口
import turtle
import random
game = turtle.Screen()  #建立窗口
game.setup(700.700)  #设置窗口的大小--最基本的设置--后续的坐标轴以此为依据
game.title("space invader")
game.bgpic('bgpic.gif')   #据说turtle常用的格式是gif,所以在.py文件的文件夹里面加一张gif格式的背景图
#总的来说,turtle显示窗口最最的基本步骤就是上述的代码

#创建玩家--即创建一个图标
turtle.addshape('player.gif')  #在非窗口的内容加上图片不能直接加,需要先添加至图片库
player = turtle.Turtle()     #创建一个非窗口的内容,一律如此创建--意思是图形库下的一个物体
player.speed(0)  #速度为瞬移
player.up()    #抬起笔
player.ht()    #隐藏
player.shape('player.gif')  #设置形状
player.setposition(0,-300)  #初始位置设定(但已经被移动过)
player.st()    #移动好了后显示

#创建敌人--常见多个图标
turtle.addshape('inv.gif')
num = 8
invader_list = []    #放在列表里
for i in range(6):
    inv = turtle.Turtle()
    invader_list.append(inv)  #把敌人放进列表(花名册)
    inv.ht()
    inv.speed(0)
    inv.up()
    inv.shape('inv.gif')
    x = random.randint(-300,300)
    y = random.randint(100,220)
    inv.setposition(x,y)
    inv.st()       #循环到这里时,六个敌人就都放在了(00)位子上了,所以要做随机处理,所以加上上面的随机处理

#添加分数
score = 0    #初始化得分
pen = turtle.Turtle()
pen.color('white')
pen.speed(0)
pen.up()
pen.ht()
pen.setpos(-340,260)
score_str = 'score : %s'%score
pen.write(score_str,align='left',font=('Arial',20,'normal'))     #font = 字体类别,大小,加粗等类型



#创建子弹--简单的一颗子弹
bomb = turtle.Turtle()
bomb.speed(0)
bomb.ht()
bomb.up()
bomb.shape('triangle')
bomb.color('yellow')
bomb.shapesize(0.5,0.5)
bomb.seth(90)    #逆时针旋转


#发射子弹
is_fired = False    #所有具有可变状态的量都设置一个flag便于控制状态的变化
def fire():
    global is_fired    #否则无法应用到下面的while True中
    if is_fired == False:     #没有发射才能发射,否则一直按发射键一直重复
        bomb.setpos(player.xcor(),player.ycor()+20)
        bomb.st()
        is_fired = True
turtle.onkey(fire,'W')




#让玩家动起来
player_step = 13    #单独定义一个方便改
def go_left():
    x = player.xcor()
    x = x - player_step
    if x < -300 :     #防止出界,当到达边界时再按移动键不发生移动
        x = -320
    player.setx(x)

def go_right():
    x = player.xcor()
    x = x + player_step
    if x > 300:
        x = 320
    player.setx(x)


turtle.listen()  #现在听从玩家的指挥
turtle.onkey(go_left,'A')    #设置键位--实质是当什么键是turtle做什么,此步骤对应的方法必须提前定义
turtle.onkey(go_right,'D')


#让敌人动起来        但是介于我的能力有限,所有的invader都是同步的,因为列表被统一修改了
inv_step = 6
bomb_step = 16
go_back = False
end = False
while True:    #始终在动
    if end:
        pen2 = turtle.Turtle()
        pen2.color('red')
        pen2.ht()
        pen2.write('GAME 0VER!',align='center',font=('Arial',30,'bold'))
        turtle.mainloop()
        break


    for inv in invader_list:
        x = inv.xcor()
        x += inv_step
        inv.setx(x)
        if x > 320 or x < -320:
            go_back = True
        if inv.distance(bomb)  < 15:
            inv.setpos(0,230)
            is_fired = False
            bomb.setpos(-350,-350)
            bomb.ht()
            pen.clear()  #刷新避免重叠
            score += 10
            score_str = 'score : %s' % score
            pen.write(score_str, align='left', font=('Arial', 20, 'normal'))
        if inv.ycor() < -280:
            end = True
    if go_back:
        inv_step *= -1
        go_back = False        #这个go_back的作用是使转向只触发一次,否则会在原地罚站
        for inv in invader_list:
            y = inv.ycor()
            y -= 40
            inv.sety(y)
    if is_fired:
        y = bomb.ycor()
        y += bomb_step
        bomb.sety(y)
        if y > 350:
            is_fired = False
            bomb.setpos(-350,-350)
            bomb.ht()        #把已经飞出去的子弹隐藏起来



#当入侵者到达玩家的同一高度时游戏结束

你可能感兴趣的:(小项目,python,游戏)