本文实例为大家分享了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属性
im04(H4(5菚V3Z/j?r4(zsV4(ZGj?rD4(7V(v/ZR`4(V??(СР4( С4(}С5Q}4) С %菞
}}|хq嵥4(4(C(4(Р:jvC>_J3v4(Cw/2[v/ZGV>R\4(TC/j6(Cj6(4(ййхйй(ййй(ййхйй(ййй(0ййхйй(ййхйй(Hййхй(ййхйй(("Z4(菞
4(Tй菢C"\Crй_>Zйй4(^jB3g^j(й5}йcCc(й4(4(0й4(й4(4(Hй5}йй4(4(菚"GZ疶C;V3Z/n(х5}菚V3Z/"_4(}Схjn{T4(хR"
#zp4(5}4(4(х4(}С5Q}5Q}4(5}4(5Q}4(4(5}}С4((4(4(С菚bCT4(5СФ_>g4)菞"
#zp4(}}|х((坅4(4(4(4(й4(4(4(t4(4(4(菚b"
#zp4(5СФ4(4((4()]}}|б4(Р4(4(й(й(4((菚bjs7&4(5СФ4(4)5菦~V 4(}}|4(РB#fj"w,4(*Z(JR(4)54(nk"?j
r/c4(нMх}ZZ_"?nB 4(нMх}?"?4(нMх}"?nB 4(brZj3ro疒j惚r'&*rokkR2 |