1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > python图形界面化编程GUI(五)坦克大战(一)

python图形界面化编程GUI(五)坦克大战(一)

时间:2021-08-31 03:20:41

相关推荐

python图形界面化编程GUI(五)坦克大战(一)

坦克大战(一)

需要先安装pygame库,通过pygame来实现游戏的设计,可以通过官方网站提供的文档进行学习。

需求分析

了解项目开发需要的内容,设计需要的类,如坦克类(敌方、我方)、子弹类(可以移动)、障碍物类(可破坏、不可破坏)、被击中时的爆炸效果、游戏声音、主类(开始、结束游戏)每个类中有哪些需要实现的方法 坦克类都能移动、发射子弹、显示坦克在窗口上子弹类有移动效果、显示子弹的方法障碍物类,有显示的方法,是否可以通过的属性爆炸效果类,显示爆炸效果,子弹击中物体都会触发音效类,插入播放音乐主类,开始、结束游戏

框架搭建

import pygame# 主类class MainGame():def __init__(self): # 属性pass# 开始游戏def startGame(self): # 方法pass# 结束游戏def endGame(self):pass# 坦克类class Tank():def __init__(self):pass# 移动def move(self):pass# 射击def shot(self):pass# 显示坦克def displayTank(self):pass# 我方坦克class MyTank(Tank): # 继承自坦克类def __init__(self):pass# 敌方坦克class EnemyTank(Tank):def __init__(self):pass# 子弹类class Buttet():def __init__(self):pass# 移动def move(self):pass# 显示子弹def displayButtet(self):pass# 障碍物类class Wall():def __init__(self):pass# 显示障碍物def displayWall(self):pass# 爆炸类class Explode():def __init__(self):pass# 显示爆炸效果def displayExplode(self):pass# 音效类class Music():def __init__(self):pass# 播放音乐def play(self):pass

加载主窗口

# 定义全局变量SCREEN_WIDTH = 900 # 窗口的宽度SCREEN_HEIGHT = 700 # 窗口的高度BG_COLOR = pygame.Color(0, 0, 255) # 设置背景颜色# 主类class MainGame():window = Nonedef __init__(self): # 属性pass# 开始游戏def startGame(self): # 方法# 加载主窗口、初始化pygame.display.init()# 设置窗口大小以及显示窗口,用类属性进行接收MainGame.window = pygame.display.set_mode([SCREEN_WIDTH, SCREEN_HEIGHT])# 设置窗口的标题pygame.display.set_caption('坦克大战')# 此时的窗口一闪而过,可以用死循环的方法进行窗口的显示while True:# 给窗口添加颜色MainGame.window.fill(BG_COLOR)# 让页面一直刷新pygame.display.update()if __name__ == '__main__':MainGame().startGame()

添加事件

把需要的内容放到窗口上,比如坦克、障碍物等以及实现的功能

1.点击关闭,关闭窗口

2.按下键盘的时候,判断按下的是什么键,分别对不同的键做处理,比如上下作用

class MainGame():# 开始游戏def startGame(self): # 方法while True:# 获取监听事件self.getEvent()# 结束游戏def endGame(self):print('欢迎下次再来')quit()# 获取事件def getEvent(self):# 获取所有的事件eventList = pygame.event.get() # 获取的是事件列表,并不是唯一的事件,比如上下左右# 遍历出每一个事件for event in eventList:# 判断按下的是关闭键还是键盘if event.type == pygame.QUIT:self.endGame() # 执行退出操作elif event.type == pygame.KEYDOWN:if event.key == pygame.K_LEFT:print('按下左键,向左移动')elif event.key == pygame.K_RIGHT:print('按下右键,向右移动')elif event.key == pygame.K_UP:print('按下上键,向上移动')elif event.key == pygame.K_DOWN:print('按下下键,向下移动')else:print(1111)if __name__ == '__main__':MainGame().startGame()

窗口上增加文本信息

左上角文本绘制,输出敌方坦克数量,也可以输出击败对方坦克后得到的分值等

TEXT_COLOR = pygame.Color(255, 0, 0) # 设置字体颜色class MainGame():def startGame(self): # 方法while True:# 获取文本的绘制,显示文本和出现的位置MainGame.window.blit(self.getTextSurface('敌方坦克的数量:%s'% 6),(10,10))# 获取文本def getTextSurface(self,text):# 文字初始化pygame.font.init()# 创建文字对象# print(pygame.font.get_default_font()) # 获取pygame里支持哪些字体# 使用系统字体对象,仿宋,字体大小font = pygame.font.SysFont('fangsong', 18)# 使用render方法把字体渲染到窗口上testSurface= font.render(text, True, TEXT_COLOR) # 有返回值,返回到文本的表面return testSurface # 文字显示在纸上,把纸返回到窗口上if __name__ == '__main__':MainGame().startGame()

加载我方坦克

class MainGame():my_tank = Nonedef startGame(self):MainGame.my_tank = Tank(450,400)while True:MainGame.my_tank.displayTank()# 坦克类class Tank():def __init__(self, left, top):# 保存加载的图片,返回值是surface,也相当于一张纸,要放到创建窗口上,需要变量接收self.images = {'U':pygame.image.load('img/p1tankU.gif'),'D':pygame.image.load('img/p1tankD.gif'),'R':pygame.image.load('img/p1tankR.gif'),'L':pygame.image.load('img/p1tankL.gif'),}# 默认坦克的方向self.direction = 'U'# 根据当前图片的方向来获取图片self.image = self.images[self.direction] # 坦克方向向上# 根据图像获取区域self.rect = self.image.get_rect()# 设置图像区域距窗口左边(left)和上边(top)的的距离,矩形框self.rect.left = leftself.rect.top = topif __name__ == '__main__':MainGame().startGame()

坦克的移动

1.我方坦克切换方向

2.我方坦克移动,不停的加载图片的位置(更改位置)

3.移动范围的限制,坦克不能超出边界

class MainGame():# 获取事件def getEvent(self):# 获取所有的事件eventList = pygame.event.get() # 获取的是事件列表,并不是唯一的事件,比如上下左右# 遍历出每一个事件for event in eventList:# 判断按下的是关闭键还是键盘if event.type == pygame.QUIT:self.endGame() # 执行退出操作# 判断方向键elif event.type == pygame.KEYDOWN:# 左if event.key == pygame.K_LEFT:# 切换方向MainGame.my_tank.direction = 'L'MainGame.my_tank.move()print('按下左键,向左移动')# 右elif event.key == pygame.K_RIGHT:MainGame.my_tank.direction = 'R'MainGame.my_tank.move()print('按下右键,向右移动')# 上elif event.key == pygame.K_UP:MainGame.my_tank.direction = 'U'MainGame.my_tank.move()print('按下上键,向上移动')# 下elif event.key == pygame.K_DOWN:MainGame.my_tank.direction = 'D'MainGame.my_tank.move()print('按下下键,向下移动')else:print(1111)class Tank():def __init__(self, left, top):# 设置图像区域距窗口左边(left)和上边(top)的的距离,矩形框self.rect.left = leftself.rect.top = top# 设置坦克的移动速度self.speed = 10 # 值越小移动的越慢# 移动def move(self):# 判断坦克方向进行移动if self.direction == 'L':if self.rect.left > 0: # 不能超出左边界self.rect.left -= self.speedelif self.direction == 'R':# 向右移动的时候,坦克转向右,此时的右边距应是用坦克移动的距离加上坦克的高度if self.rect.left + self.rect.height < SCREEN_WIDTH:self.rect.left += self.speedelif self.direction == 'U':if self.rect.top > 0:self.rect.top -= self.speedelif self.direction == 'D':# 同样向下移动的时候,坦克方向向下,下边距应是坦克移动的距离加上坦克的高度if self.rect.top + self.rect.height < SCREEN_HEIGHT:self.rect.top += self.speed# 显示坦克def displayTank(self):# 重新获取坦克的方向信息,切换了图片self.image = self.images[self.direction]# 调用blit方法显示图像MainGame.window.blit(self.image, self.rect)if __name__ == '__main__':MainGame().startGame()

坦克的连续移动

目前实现的是按一下,坦克移动一下,本次环节要解决的是:

1.按下方向键,坦克一直移动;松开方向键,坦克停止移动

2.便移动边发射子弹

import pygameimport timeclass MainGame():# 开始游戏def startGame(self): # 方法while True:# 让移动速度慢一点,调用时间延迟time.sleep(0.02)MainGame.my_tank.displayTank()# 根据坦克的状态进行判断,如果当前坦克移动的开关是开启的才能移动if not MainGame.my_tank.stop:# 调用坦克移动的方法,实现按下移动,松开停止MainGame.my_tank.move()# 获取事件def getEvent(self):# 获取所有的事件eventList = pygame.event.get() # 获取的是事件列表,并不是唯一的事件,比如上下左右# 遍历出每一个事件for event in eventList:# 判断按下的是关闭键还是键盘if event.type == pygame.QUIT:self.endGame() # 执行退出操作# 判断方向键elif event.type == pygame.KEYDOWN:# 左if event.key == pygame.K_LEFT:# 切换方向MainGame.my_tank.direction = 'L'# 更改移动开关MainGame.my_tank.stop = False # 按下按键的时候,解除停止的状态# MainGame.my_tank.move() # 实现坦克按下移动,松开停止,要把单个方向的移动禁用掉print('按下左键,向左移动')# 右elif event.key == pygame.K_RIGHT:MainGame.my_tank.direction = 'R'# 更改移动开关MainGame.my_tank.stop = False # 按下按键的时候,解除停止的状态# MainGame.my_tank.move()print('按下右键,向右移动')# 上elif event.key == pygame.K_UP:MainGame.my_tank.direction = 'U'# 更改移动开关MainGame.my_tank.stop = False # 按下按键的时候,解除停止的状态# MainGame.my_tank.move()print('按下上键,向上移动')# 下elif event.key == pygame.K_DOWN:MainGame.my_tank.direction = 'D'# 更改移动开关MainGame.my_tank.stop = False # 按下按键的时候,解除停止的状态# MainGame.my_tank.move()print('按下下键,向下移动')# 用空格发射子弹,此时发射子弹和坦克移动是冲突的,松开空格相当于松开键盘,坦克就停止了,不能实现边走边发射子弹# 如果实现边移动边发射子弹的逻辑,就要把松开方向键进行判断elif event.key == pygame.K_SPACE:print('发射子弹')# 松开按键,坦克停止移动,修改坦克的移动开关状态elif event.type == pygame.KEYUP: # 此时不能实现边移动边发射子弹,需要再进行判断# 判断如果松开的是上下左右键,才停止移动,这是跟发射子弹就不冲突了if event.key == pygame.K_UP or event.key == pygame.K_DOWN or event.key == pygame.K_LEFT or event.key == pygame.K_RIGHT:MainGame.my_tank.stop = Trueif __name__ == '__main__':MainGame().startGame()

敌方坦克

在pycham中单击Project Files右侧的 Show Options Menu 选择 Show Members ,每个py文件可以在展开,在左侧显示程序中的类,编程时可以直接根据类找到位置。

1.完善敌方坦克初始化

2.创建敌方坦克并展示

3.更改左上角的文字显示

import random# 主类class MainGame():# 存储敌方坦克的列表enemyTankList = []# 定义敌方坦克的数量enemyTankCount = 5# 开始游戏def startGame(self): # 方法# 初始化敌方坦克self.creatEnemyTank()while True:# 获取文本的绘制,显示文本和出现的位置MainGame.window.blit(self.getTextSurface('敌方坦克的数量:%s'% MainGame.enemyTankCount),(10,10))# 调用显示敌方坦克的方法self.showEnemyTank()# 初始化敌方坦克方法def creatEnemyTank(self):top = 100 # 坦克出现的上方位置# 循环生成坦克for i in range(MainGame.enemyTankCount):left = random.randint(0,600) # 坦克出现的左侧位置speed = random.randint(1,4) # 坦克的速度enemy = EnemyTank(left, top, speed)MainGame.enemyTankList.append(enemy) # 生成的坦克添加到列表里# 展示敌方坦克def showEnemyTank(self):for enemyTank in MainGame.enemyTankList:# 直接调用父类的display()enemyTank.displayTank()# 敌方坦克class EnemyTank(Tank):def __init__(self, left, top,speed):# 保存加载的图片,返回值是surface,也相当于一张纸,要放到创建窗口上,需要变量接收self.images = {'U': pygame.image.load('img/enemy1U.gif'),'D': pygame.image.load('img/enemy1D.gif'),'R': pygame.image.load('img/enemy1R.gif'),'L': pygame.image.load('img/enemy1L.gif'),}# 坦克的方向为随机生成self.direction = self.randDirection()# 根据当前图片的方向来获取图片self.image = self.images[self.direction] # 坦克方向向上# 根据图像获取区域self.rect = self.image.get_rect()# 设置图像区域距窗口左边(left)和上边(top)的的距离,矩形框self.rect.left = leftself.rect.top = top# 设置坦克的移动速度self.speed = speed # 每种类型的坦克速度不一样# 坦克移动的开关,按下移动,松开停止self.stop = True # 默认坦克是不动的状态# 生成敌方坦克出现时的随机方向def randDirection(self):num = random.randint(1,4)if num == 1:return 'U'elif num == 2:return 'D'elif num == 3:return 'L'elif num == 4:return 'R' if __name__ == '__main__':MainGame().startGame()

敌方坦克的随机移动

玩家只能控制自己的电脑,敌方坦克有电脑控制,移动方向和速度都是随机的,需要增加属性作为移动的步数,让移动步数递减,当步数小于等于零的时候(走到窗口的边界),改变坦克的方向,继续移动。

# 主类class MainGame():# 展示敌方坦克def showEnemyTank(self):for enemyTank in MainGame.enemyTankList:# 直接调用父类的display()enemyTank.displayTank()# 坦克移动enemyTank.randMove()# 敌方坦克class EnemyTank(Tank):def __init__(self, left, top,speed):# 坦克移动的开关,按下移动,松开停止self.stop = True # 默认坦克是不动的状态# 步数变量self.step = 20# 坦克的随机移动def randMove(self):if self.step <= 0:# 修改方向self.direction = self.randDirection()# 恢复步数self.step = 20else:self.move()# 移动一次,步数减少1self.step -= 1

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。