python弹球游戏编写过程
python实现坦克大战游戏 附详细注释本文实例为大家分享了python实现坦克大战的具体代码,供大家参考,具体内容如下
|
#功能实现游戏主窗口 import pygame,time,random #导入模块 _display = pygame.display #赋值给一个变量 调用时方便 color_red = pygame.color( 255 , 0 , 0 ) #同上 v class maingame( object ): screen_width = 900 #游戏界面宽度 screen_height = 550 #界面的高度 tank_p1 = none #坦克对象 window = none #窗口对象 enemytank_list = [] # 存储所有敌方坦克 enemtank_count = 10 # 要创建的敌方坦克的数量 bullet_list = [] #创建我方子弹列表 enemytank_bullet_list = [] explode_list = [] wall_list = [] def startgame( self ): pygame.display.init() #初始化游戏模块的显示 maingame.window = _display.set_mode([maingame.screen_width,maingame.screen_height]) #生成并加载游戏窗口、\ #pygame.display模块及set_mode方法和pygame相关方法调用设置 # 见<<https://www.pygame.org/docs/ref/display.html#pygame.display.set_mode>> uc浏览器实现自动翻译 pygame.display.set_caption( "坦克大战v1.0" ) #s设置游戏标题 self .createnemytank() #类中调用初始敌方坦克方法 self .creatmytank() #创建我方坦克 self .creatwalls() #创建障碍物 while true: #无限循环 所有行为方法都要无限制的显示 maingame.window.fill(pygame.color( 0 , 0 , 0 )) #窗口颜色设置 window在开始方法已设置为游戏窗口 self .getevent() #死循环中 获取事件的值 对其进行相应处理 maingame.window.blit( self .drawtext( "剩余敌方数量%d" % len (maingame.enemytank_list)),( 7 , 7 )) #循环游戏窗口加载文本 bilt方法在页面写入另一个 self .blitwalls() if maingame.tank_p1 and maingame.tank_p1.alive: maingame.tank_p1.displaytank() #循环调用生成的坦克对象(显示)方法 self .blitenemytank() # 此类中用self 循环展示敌方坦克 if maingame.tank_p1 and not maingame.tank_p1.stop: maingame.tank_p1.move() # 移动 maingame.tank_p1.hitwall() #撞击墙壁 maingame.tank_p1.hitenemytank() #撞击敌方坦克方法 self .blitenemybullet() #显示敌方坦克子弹 self .blitbullet() #显示炮弹 self .blitexplode() #显示爆炸效果 time.sleep( 0.02 ) _display.update() #获取更新 #将带有文字的surface 绘制到窗口中 循环 # 创建敌方坦克 def createnemytank( self ): #创建敌方坦克 top = 100 for i in range (maingame.enemtank_count): #maingame.enemtank_count=5 五次循环创建敌方坦克 speed = random.randint( 3 , 6 ) # 随机模块 random.randint # 每次都随机生成一个left值 left = random.randint( 1 , 7 ) etank = enemytank(left * 100 , top, speed) #生成敌方坦克类对象 传入参数 left为随机 maingame.enemytank_list.append(etank) #将创建的每一个敌方坦克添加到列表 # 将坦克加入到窗口中 def creatmytank( self ): maingame.tank_p1 = mytank( 400 , 480 ) # 生成一个坦克类的实例对象 music = music( "img/start.wav" ) music.play() def creatwalls( self ): for i in range ( 1 , 10 ): wall = wall( 60 * i, 250 ) maingame.wall_list.append(wall) def blitwalls( self ): for wall in maingame.wall_list: if wall.live = = true: wall.displaywall() else : maingame.wall_list.remove(wall) def blitenemytank( self ): #显示敌方坦克 若出现坦克图片重叠也是符合逻辑 for etank in maingame.enemytank_list: if etank.live : etank.displaytank() #将列表中每一个进行显示 etank为敌方坦克类对象 调用父类tank类中显示方法 etank.randmove() etank.hitwall() etank.hitmytank() ebullet = etank.shot() if ebullet: #如果不为空 maingame.enemytank_bullet_list.append(ebullet) else : maingame.enemytank_list.remove(etank) def blitenemybullet( self ): #将敌方坦克加入到窗口中 for ebullet in maingame.enemytank_bullet_list: if ebullet.alive: ebullet.display_bullet() ebullet.bulletmove() ebullet.hitwalls() if maingame.tank_p1.alive: ebullet.hitmytank() else : maingame.enemytank_bullet_list.remove(ebullet) def blitbullet( self ): #显示子弹 for bullet in maingame.bullet_list: #事件中获的子弹的列表进行遍历 类似显示坦克方法 逐个展示 if bullet.alive: #bullet类中设置的标签 来判断子弹的存活 true为生 根据炮弹移动方法bulletmove()中所加限制条件 bullet.display_bullet() #调用列表中子弹对象的显示方法 bullet.bulletmove() #子弹的移动 bullet.hitenemytank() #调用与敌方坦克的碰撞检测方法 bullet.hitwalls() #d调用子弹碰撞墙壁 else : maingame.bullet_list.remove(bullet) #如果为false bulletmove()中触碰墙壁就是false 就从列表删除 循环执行 def blitexplode( self ): for explode in maingame.explode_list: if explode.live: explode.display_explode() music = music( "img/blast.wav" ) music.play() else : maingame.explode_list.remove(explode) def drawtext( self ,content): #文本 写入游戏窗口 pygame.font.init() #初始化字体 font = pygame.font.sysfont( "kaiti" , 18 ) #创建字体对象 text_sf = font.render(content,true,color_red) #字体样式对象 return text_sf #返回内容的surface def getevent( self ): #获取所有事件 eventlist = pygame.event.get() #所有事件列表 for event in eventlist: #遍历每一个事件进行判断 键盘输入的字符 #type属性 if event. type = = pygame.quit: #如果是quit(就是点击窗口的退出按钮 叉号) print ( "退出游戏" ) self .gameover() #退出方法 if event. type = = pygame.keyup: #如果键盘按钮抬起 并且是上下左右键 if event.key = = pygame.k_left or event.key = = pygame.k_right or event.key = = pygame.k_up\ or event.key = = pygame.k_down: if maingame.tank_p1 and maingame.tank_p1.alive: maingame.tank_p1.stop = true #stop为true 按钮抬起就停止 start方法中的开关 实现坦克按住按钮持续移动 if event. type = = pygame.keydown: #如果事件的类型为按下按键进行如下判断 if event.key = = pygame.k_escape : self .creatmytank() if maingame.tank_p1 and maingame.tank_p1.alive: if event.key = = pygame.k_left: #如果为左方向键 如下为同一类型 print ( "向左移动" ) maingame.tank_p1.direction = "l" #设置坦克方向进行判断向左就是l, # 并设置游戏窗口的界限 还可以利用方向作为字典的键获取坦克图片 坦克的移动方向 #就是加载不同方向的坦克图片 呈现出移动的效果 maingame.tank_p1.stop = false #坦克移动的开关 循环使用 false为移动 if event.key = = pygame.k_right: print ( "向右移动" ) maingame.tank_p1.direction = "r" maingame.tank_p1.stop = fa
|