以下是部分代码预览:
"""坦克大战,小坦克被一群大坦克包围,情况十分危急。 小坦克的优势在于速度快,能连续发射。制作日期:2018年10月。 这是一个用python的海龟画图模块制作的射击小游戏,需要用鼠标指针操作小坦克突围! 制作日期:2018年10月,作者:李兴球。 """ #从海龟模块导入所有命令 from turtle import * import math from random import randint def load_sound(): """加载声音与播放背景音乐""" sound_normal = True explode_sound= None shoot_sound = None return sound_normal,explode_sound,shoot_sound def init_screen(): """初始化屏幕,注册坦克形状""" screen = Screen() screen.setup(width,height) p = ((0,0),(50,0),(50,80),(10,80),(10,150),(-10,150),(-10,80),(-50,80),(-50,0)) screen.addshape("tank",p) # 注册tank形状 screen.bgcolor("blue") # 屏幕背景色 screen.title(gametitle) # 设定屏幕标题 screen.colormode(255) # 设定颜色模式 screen.delay(0) # 屏幕延时为0 screen.bgpic("封面设计.png") # 封面加载 class Bullet(Turtle): """炮弹类,炮弹生成后会自己移动,直到碰到边缘。""" def __init__(self,x,y,h): Turtle.__init__(self,visible=False,shape="circle") self.penup() self.dead = False self.goto(x,y) self.setheading(h) self.showturtle() self.move() def move(self): """炮弹移动,碰到边缘就‘死亡’""" self.fd(10) if self.bumpedge():self.dead = True def bumpedge(self): """碰到边缘返回True,否则False""" return abs(self.xcor())>width/2 or abs(self.ycor())>height/2 class NPCtank(Turtle): deadcount = 0 #统计数量的类变量 def __init__(self,mytank,my_bullet): """敌方坦克的敌人就是mytank,my_bullet是我方炮弹列表""" Turtle.__init__(self,shape='tank',visible=False) self.shapesize(0.3,0.3) color1 = randint(0,255),randint(0,255),randint(0,255) self.color("black",color1) self.penup() self.setheading(randint(1,360)) self.fd(randint(200,height*0.4)) # 配合随机方向让npc随机移到一个地方 self.enemy = mytank self.enemy_bullet = my_bullet self.face_enemy() # 一出生就面向mytank self.dead = False self.move() def move(self): """移动npc坦克,有时会面向mytank""" self.fd(1) self.shoot() # 设置一定的机率发射炮弹 self.bumpedge() # 碰到屏幕边缘就向后转 self.bumpenemy() # 碰到敌人(mytank)后会爆炸,mytank当然也会爆炸,游戏结束 self.bumpbullet() # 碰到我方炮弹就爆炸 def bumpenemy(self): """碰到敌人就两方都死亡,npc的敌人就是mytank""" r = self.distance(self.enemy) def bumpbullet(self): """碰到我方炮弹就死亡""" def bumpedge(self): """bumpedge就掉头""" faraway = abs(self.xcor())>width/2 or abs(self.ycor())>height/2 if faraway:self.right(180) # 掉转头 def face_enemy(self): """面向敌人,NPC的敌人就是mytank,可以增加代码让转向更平滑""" self.setheading(self.towards(self.enemy.position())) def shoot(self): """敌坦克的发射方法,同时把‘死了’的炮弹移去""" class Bomb(Turtle): """炸弹类,它实例化后,自己就会切换造型,从而“爆炸”""" def __init__(self,x,y,images): """x,y是爆炸的坐标,images是已注册到屏幕形状列表的造型图片""" Turtle.__init__(self,visible=False) self.penup() self.goto(x,y) self.index = 0 # 造型索引编号从0开始 self.amount = len(images) # 造型数量 self.images = images # 造型列表 self.showturtle() # 显示 if snd_normal: explode_sound.play() self.next_costume() # 利用屏幕的定时器功能使之循环一定的次数 def next_costume(self): if self.index < self.amount: # 小于总数量就换造型 self.shape(self.images[self.index]) # 从列表取指定索引的图片,设为海龟的形状 self.index = self.index + 1 screen.ontimer(self.next_costume,50) def make_mytank(): """生成我方坦克对象,并返回到主程序""" def mytank_wait_bump_enemybullet(): """我方坦克每隔10豪秒等待是否碰到敌方炮弹""" def follow_mouse(event): """本函数让小海龟面朝鼠标指针移动""" def shoot(x,y): """mytank发射函数,被绑定在screen.onclick事件上""" class Writer(Turtle): """用来在屏幕上写字的海龟对象""" def __init__(self,y): Turtle.__init__(self,visible = False) self.penup() self.sety(y) self.color("cyan") self.font = ("黑体",20,"normal") def print(self,string): self.clear() self.write(string,align='center',font=self.font) def start_game(): screen.bgpic("草地.png") if __name__ =="__main__": gametitle = "坦克大战_海龟画图版_作者:李兴球" tanksamount = 20 # 坦克数量 width,height=800,700 # 屏幕宽度,高度 enemybullet = [] # 敌方炮弹列表 mybullet = [] # 我方炮弹列表 """声音是否正常,爆炸声,射击声""" snd_normal,explode_sound,shoot_sound = load_sound() # 加载声音 screen,explosion_images = init_screen() # 初始化屏幕,显示封面,返回screen和爆炸造型列表 mytank = make_mytank() # 我方坦克 top_turtle = Writer(310) # 顶部写字龟 top_turtle.print("当前击毁敌方坦克数:0") # 在顶部写些字 bottom_turtle = Writer(-330) # 底部写字龟 screen.onkeypress(start_game,"space") # 注册按空格事件,生成敌方坦克等等 mytank_wait_bump_enemybullet() # 等待碰到敌方炮弹 screen.listen() # 给屏幕设置焦点 screen.mainloop() # 进入主循环
下载完整源代码与素材,请
需要浏览更多吗?
成为会员后,登陆才能继续浏览!联系微信scratch8即可办理会员。
(会员专属:能浏览所有文章,下载所有带链接的Python资源。)