利用python和pygame模块实现飞机大战
利用python和pygame模块实现飞机大战
- 背景提要
- 软硬件版本
- 项目流程
- 初步框架准备
- 数字常量化
- 游戏对象的框架
- 背景的绘制
- 游戏时钟的实现
- 敌人飞机的实现
- 退出处理
- 英雄飞机和子弹的实现
- 碰撞检测的实现
- 最终的代码
- 需要用的图片
背景提要
我学习Python三天了,基础的语法和面向对象已经有了初步的了解,下一步急需一个实践项目来检验学习的成果,因此选择了很多人做过的飞机大战项目,这个项目我最终做完只写了200行不到的代码,在入门中算是比较轻松的了。
软硬件版本
win10
pycharm pro 2018 win版本
项目流程
初步框架准备
首先导入pygame模块,如果你还没有安装,可以在网上查一下如何安装
然后写出基本的main函数框架
import pygame
if __name__ == '__main__':# 创建游戏对象#TODO# 开始游戏#TODO
数字常量化
在导入模块后,添加一些全局变量,去替换之后要用到的一些魔法数字
# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧率
UPDATE_FPS = 60
# 创建敌人飞机的事件
CREATE_ENEMY_EVENT = pygame.USEREVENT
游戏对象的框架
python的完全面向对象的语言,因此游戏本身也是一个对象,因此整个main函数中,先创建游戏对象,再调用该对象的开始游戏方法即可
首先定义一个游戏类,继承自祖先类,然后再明确初始化过程要做什么工作
重写父类的初始化方法,按照套路,先初始化python的所有模块,然后再把游戏窗口给整出来
# 定义一个游戏类
class GameClass(object):
# 游戏的初始化def __init__(self):pygame.init() # 初始化所有的 pygame 模块self.__screen_init() # 窗口初始化# 游戏窗口初始化def __screen_init(self):# 创建游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)pygame.display.set_caption("飞机大战")
值得一提的是,创建游戏窗口的时候,需要传入一个窗口的长*宽,它是一个元祖对象
另外就是可以设置窗口的名字“飞机大战”
实现窗口初始化函数后,接下来就是如何调用,让程序运行时生成一个游戏界面
再写一个开始游戏函数,这个函数中,用while True做游戏循环,保证程序不会运行完就关闭
# 启动游戏
def start_game(self):while True:pass
这样一个初步的框架就已经实现了,我们先看一下效果,运行后效果如下图,windows会提示游戏界面没有响应,要不要关闭,这是正常的,在pycharm的右上角点击红色的停止方块即可
背景的绘制
游戏界面已经有了,接下来需要我们把背景图片放进去
在一般的其它的游戏中,背景一般不是一成不变的,因此在这里,我们用图片的滚动,来实现即使飞机不动,你也会感觉一直往前飞的效果
实现的原理是用两张图片,在y轴上贴合到一起,组成一张长图片,在游戏开始的时候,一张图片完全与游戏框重合,另外一张在游戏框上面,当图片持续下移,最终有一张图片完全跑到游戏框下面的时候,我们立马把它放到游戏框的上方,这样用户就无法分辨其实背景其实是两张图片一直滚动播放了
整个游戏中的要显示的对象,有以下几种,背景、英雄飞机、敌人飞机、英雄子弹,(暂时没有做敌人子弹,因此实现起来稍微复杂一点) 他们的共同特征是,能移动有速度,需要加载图片,因此,先做一个父类,然后根据需求的不同,派生出不同的子类,再去创建背景、飞机对象
该类的代码如下,继承自pygame提供的精灵类,然后一定要先调用父类的init方法,然后加载指定路径的图片,通过get_rect函数,我们可以从加载的图片中获取它的尺寸数据
然后需要指定该对象的速度(默认值设置为1),然后实现它的更新方法,就是在y轴上,根据速度值,改变它的y坐标
# 定义一个游戏精灵类,继承自模块的精灵类
class GameSprite(pygame.sprite.Sprite):# 重写init方法def __init__(self, image_path, speed=1):super().__init__() # 先调用父类的方法self.image = pygame.image.load(image_path) # 加载指定路径的图片self.rect = self.image.get_rect() # 获取图片的尺寸self.speed = speed # 指定精灵对象的速度# 更新方法def update(self):self.rect.y += self.speed # 每次更新时,精灵对象在y方向移动
接下来就要去实现一个背景类,该类负责实现背景的交替显示
先重写父类GameSprite的init方法,然后调用父类的方法,加载背景图片,然后根据是第几张图片,判断是放在游戏框之中,还是之上,然后重写更新方法,当背景对象的y值超过范围,也就是图片向下移动到场外时,需要及时移动到游戏画面最上面
# 定义一个背景类,继承自精灵类
class BackGround(GameSprite):def __init__(self, isAlt = False):# 调用父类方法完成加载图片、尺寸获取、速度指定super().__init__("./image/background.png")# 判断是不是第二张图片if isAlt:self.rect.y = -self.rect.height# 通过两张图片的滚动播放实现动画效果def update(self):super().update()if self.rect.y >= SCREEN_RECT.height: # y值移动到边界时self.rect.y = -SCREEN_RECT.height # 让该图片重新回到游戏界面上方
实现了这两个类之后,就要在游戏初始化的方法中,实现背景初始化了
由于继承自pygame的精灵类,所以无论背景、还是飞机,都属于精灵类,因此,需要一个初始化函数,去显示这些精灵
在创建背景精灵后,将这两个背景精灵添加进背景精灵组,通过精灵组,可以对组内的对象统一操作
# 创建初始时的精灵
def __create_sprites(self):# 创建背景精灵self.bg1 = BackGround(False)self.bg2 = BackGround(True)# 创建精灵组self.back_group = pygame.sprite.Group(self.bg1, self.bg2)
由于需要不断的滚动,因此还要实现更新位置的方法,通过精灵组,调用两个方法,即可实现位置的更新
# 更新精灵
def __update_sprites(self):# 更新坐标self.back_group.update()# 绘制self.back_group.draw(self.screen)
位置更新后,还要调用update方法,才能显示出来
# 启动游戏
def start_game(self):while True:# 更新位置self.__update_sprites()# 更新显示pygame.display.update()
最终的代码如下:
import pygame# 定义一个游戏精灵类,继承自模块的精灵类
class GameSprite(pygame.sprite.Sprite):# 重写init方法def __init__(self, image_path, speed=1):super().__init__() # 先调用父类的方法self.image = pygame.image.load(image_path) # 加载指定路径的图片self.rect = self.image.get_rect() # 获取图片的尺寸self.speed = speed # 指定精灵对象的速度# 更新方法def update(self):self.rect.y += self.speed # 每次更新时,精灵对象在y方向移动# 定义一个背景类,继承自精灵类
class BackGround(GameSprite):def __init__(self, isAlt = False):# 调用父类方法完成加载图片、尺寸获取、速度指定super().__init__("./image/background.png")# 判断是不是第二张图片if isAlt:self.rect.y = -self.rect.height# 通过两张图片的滚动播放实现动画效果def update(self):super().update()if self.rect.y >= SCREEN_RECT.height: # y值移动到边界时self.rect.y = -SCREEN_RECT.height # 让该图片重新回到游戏界面上方# 定义一个游戏类
class GameClass(object):# 游戏的初始化def __init__(self):pygame.init() # 初始化所有的 pygame 模块self.__screen_init() # 窗口初始化self.__create_sprites() # 创建初始时的精灵# 游戏窗口初始化def __screen_init(self):# 创建游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)pygame.display.set_caption("飞机大战")# 创建初始时的飞机精灵def __create_sprites(self):# 创建背景精灵self.bg1 = BackGround(False)self.bg2 = BackGround(True)# 创建精灵组self.back_group = pygame.sprite.Group(self.bg1, self.bg2)# 更新精灵def __update_sprites(self):# 更新坐标self.back_group.update()# 绘制self.back_group.draw(self.screen)# 启动游戏def start_game(self):while True:# 更新位置self.__update_sprites()# 更新显示pygame.display.update()if __name__ == '__main__':# 创建游戏对象game = GameClass()# 开始游戏game.start_game()
游戏时钟的实现
从实际的效果中,背景图片已经能滚动了,但是速度特别快,因为现在的游戏循环速度太快了,一般的游戏,游戏循环速度一般是60FPS或者144FPS,因此我们再调用时钟对象,去实现60帧的更新速度
我们在GameClass类中,增加一个时钟初始化方法,然后在其游戏初始化方法中,调用时钟初始化方法
# 时钟初始化
def __clock_init(self):# 创建时钟对象self.clock = pygame.time.Clock()# 游戏的初始化
def __init__(self):pygame.init() # 初始化所有的 pygame 模块self.__screen_init() # 窗口初始化self.__clock_init() # 时钟初始化self.__create_sprites() # 创建初始时的精灵
然后在游戏循环中,去设置刷新帧率为60
# 启动游戏
def start_game(self):while True:# 设置刷新帧率self.clock.tick(UPDATE_FPS)# 更新位置self.__update_sprites()# 更新显示pygame.display.update()
再次启动,可以看出图片的运动速度已经没有那么快了
敌人飞机的实现
我们需要定义一个敌人飞机类,它出现的位置是随机的,但是是一直往下飞的
为了让敌人飞机的出现不要显得太突兀,因此,设置它的y坐标在游戏框外,然后缓缓飞进游戏界面
飞到屏幕外后,要及时销毁该飞机对象,释放内存空间
另外敌人飞机的x坐标也是随机的,在x方向是没有速度的
另外敌人飞机的速度值也是随机的
因为要利用到随机值,首先要导入random
import random# 定义一个敌人飞机类,继承自精灵类
class Enemy(GameSprite):def __init__(self):# 调用父类的方法,创建敌人飞机,指定图片super().__init__("./image/enemy1.png")# 指定初始随机速度self.speed = random.randint(1, 3)# 指定初始随机位置self.rect.x = random.randint(0, SCREEN_RECT.width - self.rect.width)self.rect.bottom = 0def update(self):# 调用父类方法,保持垂直方向的飞行super().update()# 判断是否飞出屏幕if self.rect.y >= SCREEN_RECT.height:self.kill()
敌人飞机类实现后,就要在之前做的精灵初始化中,去初始化敌人飞机和敌人飞机精灵组
# 创建初始时的精灵
def __create_sprites(self):# 创建背景精灵self.bg1 = BackGround(False)self.bg2 = BackGround(True)# 创建敌人飞机self.enemy = Enemy()# 创建精灵组self.back_group = pygame.sprite.Group(self.bg1, self.bg2)self.enemy_group = pygame.sprite.Group(self.enemy)
另外在更新精灵坐标,也要加入敌人飞机的更新
# 更新精灵def __update_sprites(self):# 更新坐标self.back_group.update()self.enemy_group.update()# 绘制self.back_group.draw(self.screen)self.enemy_group.draw(self.screen)
再次运行,发现初始化的一个敌人飞机,已经能出现在屏幕中了
接下来,要实现每隔500ms,就出现一架敌人飞机
实现这个功能需要利用pygame提供的定时方法
首先在GameClass中加一个新增敌人飞机方法,创建飞机对象,加入敌人飞机精灵组
# 创建敌人飞机精灵
def __create_enemy_sprites(self):self.enemy = Enemy()self.enemy_group.add(self.enemy)
然后在时钟初始化的时候,设置定时器的时间
# 时钟初始化
def __clock_init(self):# 创建时钟对象self.clock = pygame.time.Clock()# 设置敌人飞机定时器事件pygame.time.set_timer(CREATE_ENEMY_EVENT, 500)
然后添加一个事件监听函数,去监听定时器事件或者键盘/鼠标操作
# 时钟初始化
# 事件监听
def __event_handler(self):# 捕获事件列表for event in pygame.event.get():if event.type ==CREATE_ENEMY_EVENT:self.__create_enemy_sprites()
最后,启动游戏后,需要去调用监听方法
# 时钟初始化
# 启动游戏
def start_game(self):while True:# 设置刷新帧率self.clock.tick(60)# 事件监听self.__event_handler()# 更新位置self.__update_sprites()# 更新显示pygame.display.update()
效果如下,屏幕中已经有了好多架飞机了
退出处理
现在去点叉应该是关不掉程序的,因此还需要对退出的操作进行监听
首先需要实现一个退出方法,它没有参数,因此可以用静态方法实现
# 退出处理
@staticmethod
def __game_over():pygame.quit() # 卸载所有的 pygame 模块exit()
另外在监听中,加入对退出的监听
# 事件监听
def __event_handler(self):# 捕获事件列表for event in pygame.event.get():if event.type == pygame.QUIT:GameClass.__game_over()elif event.type == CREATE_ENEMY_EVENT:self.__create_enemy_sprites()
现在应该能实现退出功能了
英雄飞机和子弹的实现
英雄有x和y方向的速度,并且不能跑到屏幕外面
英雄有发射子弹的方法,子弹飞出屏幕应该及时销毁
下面两个类的注解应该来说算比较详尽了
# 定义一个英雄飞机类,继承自精灵类
class Hero(GameSprite):def __init__(self):# 调用父类方法,设置图片,尺寸和速度super().__init__("./image/me2.png",0)# 设置英雄精灵的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 150# 新增垂直方向y的速度self.speedy = 0# 创建一个子弹精灵组self.hero_bullets_group = pygame.sprite.Group()def update(self, speed, speedy):# 英雄在水平方向上移动self.rect.x += speed# 英雄在垂直方向上移动self.rect.y += speedy# 判断英雄的位置,不能超出屏幕范围if self.rect.x < 0:self.rect.x = 0elif self.rect.x > SCREEN_RECT.width - self.rect.width:self.rect.x = SCREEN_RECT.width - self.rect.widthelif self.rect.y < 0:self.rect.y= 0elif self.rect.y > SCREEN_RECT.height - self.rect.height:self.rect.y = SCREEN_RECT.height - self.rect.heightdef fire(self):# 创建子弹精灵bullet = HeroBullet()# 设置精灵的位置bullet.rect.bottom = self.rect.y - 20bullet.rect.centerx = self.rect.centerx# 将精灵添加到精灵组self.hero_bullets_group.add(bullet)# 定义一个子弹类,继承自精灵类
class HeroBullet(GameSprite):def __init__(self):super().__init__("./image/bullet1.png", -5)def update(self):# 让子弹按照垂直方向飞行super().update()# 判断子弹位置是否需要销毁if self.rect.bottom < 0:self.kill()
创建了这两个类后,需要在初始化精灵时,把英雄飞机也一起初始化
# 创建初始时的精灵
def __create_sprites(self):# 创建背景精灵self.bg1 = BackGround(False)self.bg2 = BackGround(True)# 创建敌人飞机self.enemy = Enemy()# 创建英雄飞机self.hero = Hero()# 创建精灵组self.back_group = pygame.sprite.Group(self.bg1, self.bg2)self.enemy_group = pygame.sprite.Group(self.enemy)self.hero_group = pygame.sprite.Group(self.hero)
更新精灵的时候,把英雄精灵和子弹精灵一起更新
# 更新精灵
def __update_sprites(self):# 更新坐标self.back_group.update()self.enemy_group.update()self.hero_group.update(self.hero.speed, self.hero.speedy)self.hero.hero_bullets_group.update()# 绘制self.back_group.draw(self.screen)self.enemy_group.draw(self.screen)self.hero_group.draw(self.screen)self.hero.hero_bullets_group.draw(self.screen)
运行的时候,画面中已经有了英雄飞机,但是现在无法操作,无法发射子弹
因此还需要对按键操作添加响应
上下左右按键,可以更改英雄精灵的速度,如果没有按键,则英雄速度为0
空格键发射子弹
# 事件监听
def __event_handler(self):# 监听键盘操作keys_pressed = pygame.key.get_pressed()if keys_pressed[pygame.K_UP]:self.hero.speedy = -3elif keys_pressed[pygame.K_DOWN]:self.hero.speedy = 3elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -3elif keys_pressed[pygame.K_RIGHT]:self.hero.speed = 3else:self.hero.speed = 0self.hero.speedy = 0# 捕获事件列表for event in pygame.event.get():if event.type == pygame.QUIT:GameClass.__game_over()elif event.type == CREATE_ENEMY_EVENT:self.__create_enemy_sprites()elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:self.hero.fire()
碰撞检测的实现
目前已经能发射子弹了,但是无法子弹销毁敌人飞机
因此调用pygame给出的方法,去解决这个问题
子弹精灵组和敌人飞机精灵组碰撞时,两个碰撞的精灵均销毁,设置为True
英雄飞机碰撞敌人飞机精灵组时,均销毁,根据返回值,判断是否结束游戏
最后在游戏循环中,加入碰撞检测,代码就已经完成了
# 碰撞检测
def __check_collide(self):pass# 子弹摧毁敌人飞机pygame.sprite.groupcollide(self.hero.hero_bullets_group, self.enemy_group, True, True)# 英雄碰撞敌人飞机enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)# 英雄碰到敌人飞机则游戏结束if len(enemies):self.hero.kill()self.__game_over()
最终的代码
import random
import pygame# 屏幕大小的常量
SCREEN_RECT = pygame.Rect(0, 0, 480, 700)
# 刷新的帧率
UPDATE_FPS = 60
# 创建敌人飞机的事件
CREATE_ENEMY_EVENT = pygame.USEREVENT# 定义一个游戏精灵类,继承自模块的精灵类
class GameSprite(pygame.sprite.Sprite):# 重写init方法def __init__(self, image_path, speed=1):super().__init__() # 先调用父类的方法self.image = pygame.image.load(image_path) # 加载指定路径的图片self.rect = self.image.get_rect() # 获取图片的尺寸self.speed = speed # 指定精灵对象的速度# 更新方法def update(self):self.rect.y += self.speed # 每次更新时,精灵对象在y方向移动# 定义一个背景类,继承自精灵类
class BackGround(GameSprite):def __init__(self, isAlt = False):# 调用父类方法完成加载图片、尺寸获取、速度指定super().__init__("./image/background.png")# 判断是不是第二张图片if isAlt:self.rect.y = -self.rect.height# 通过两张图片的滚动播放实现动画效果def update(self):super().update()if self.rect.y >= SCREEN_RECT.height: # y值移动到边界时self.rect.y = -SCREEN_RECT.height # 让该图片重新回到游戏界面上方# 定义一个敌人飞机类,继承自精灵类
class Enemy(GameSprite):def __init__(self):# 调用父类的方法,创建敌人飞机,指定图片super().__init__("./image/enemy1.png")# 指定初始随机速度self.speed = random.randint(1, 3)# 指定初始随机位置self.rect.x = random.randint(0, SCREEN_RECT.width - self.rect.width)self.rect.bottom = 0def update(self):# 调用父类方法,保持垂直方向的飞行super().update()# 判断是否飞出屏幕if self.rect.y >= SCREEN_RECT.height:self.kill()
# 定义一个英雄飞机类,继承自精灵类
class Hero(GameSprite):def __init__(self):# 调用父类方法,设置图片,尺寸和速度super().__init__("./image/me2.png",0)# 设置英雄精灵的初始位置self.rect.centerx = SCREEN_RECT.centerxself.rect.bottom = SCREEN_RECT.bottom - 150# 新增垂直方向y的速度self.speedy = 0# 创建一个子弹精灵组self.hero_bullets_group = pygame.sprite.Group()def update(self, speed, speedy):# 英雄在水平方向上移动self.rect.x += speed# 英雄在垂直方向上移动self.rect.y += speedy# 判断英雄的位置,不能超出屏幕范围if self.rect.x < 0:self.rect.x = 0elif self.rect.x > SCREEN_RECT.width - self.rect.width:self.rect.x = SCREEN_RECT.width - self.rect.widthelif self.rect.y < 0:self.rect.y= 0elif self.rect.y > SCREEN_RECT.height - self.rect.height:self.rect.y = SCREEN_RECT.height - self.rect.heightdef fire(self):# 创建子弹精灵bullet = HeroBullet()# 设置精灵的位置bullet.rect.bottom = self.rect.y - 20bullet.rect.centerx = self.rect.centerx# 将精灵添加到精灵组self.hero_bullets_group.add(bullet)# 定义一个子弹类,继承自精灵类
class HeroBullet(GameSprite):def __init__(self):super().__init__("./image/bullet1.png", -5)def update(self):# 让子弹按照垂直方向飞行super().update()# 判断子弹位置是否需要销毁if self.rect.bottom < 0:self.kill()# 定义一个游戏类
class GameClass(object):# 游戏的初始化def __init__(self):pygame.init() # 初始化所有的 pygame 模块self.__screen_init() # 窗口初始化self.__clock_init() # 时钟初始化self.__create_sprites() # 创建初始时的精灵# 游戏窗口初始化def __screen_init(self):# 创建游戏窗口self.screen = pygame.display.set_mode(SCREEN_RECT.size)pygame.display.set_caption("飞机大战")# 时钟初始化def __clock_init(self):# 创建时钟对象self.clock = pygame.time.Clock()# 设置敌人飞机定时器事件pygame.time.set_timer(CREATE_ENEMY_EVENT, 500)# 创建初始时的精灵def __create_sprites(self):# 创建背景精灵self.bg1 = BackGround(False)self.bg2 = BackGround(True)# 创建敌人飞机self.enemy = Enemy()# 创建英雄飞机self.hero = Hero()# 创建精灵组self.back_group = pygame.sprite.Group(self.bg1, self.bg2)self.enemy_group = pygame.sprite.Group(self.enemy)self.hero_group = pygame.sprite.Group(self.hero)# 创建敌人飞机精灵def __create_enemy_sprites(self):self.enemy = Enemy()self.enemy_group.add(self.enemy)# 更新精灵def __update_sprites(self):# 更新坐标self.back_group.update()self.enemy_group.update()self.hero_group.update(self.hero.speed, self.hero.speedy)self.hero.hero_bullets_group.update()# 绘制self.back_group.draw(self.screen)self.enemy_group.draw(self.screen)self.hero_group.draw(self.screen)self.hero.hero_bullets_group.draw(self.screen)# 事件监听def __event_handler(self):# 监听键盘操作keys_pressed = pygame.key.get_pressed()if keys_pressed[pygame.K_UP]:self.hero.speedy = -3elif keys_pressed[pygame.K_DOWN]:self.hero.speedy = 3elif keys_pressed[pygame.K_LEFT]:self.hero.speed = -3elif keys_pressed[pygame.K_RIGHT]:self.hero.speed = 3else:self.hero.speed = 0self.hero.speedy = 0# 捕获事件列表for event in pygame.event.get():if event.type == pygame.QUIT:GameClass.__game_over()elif event.type == CREATE_ENEMY_EVENT:self.__create_enemy_sprites()elif event.type == pygame.KEYDOWN and event.key == pygame.K_SPACE:self.hero.fire()# 碰撞检测def __check_collide(self):pass# 子弹摧毁敌人飞机pygame.sprite.groupcollide(self.hero.hero_bullets_group, self.enemy_group, True, True)# 英雄碰撞敌人飞机enemies = pygame.sprite.spritecollide(self.hero, self.enemy_group, True)# 英雄碰到敌人飞机则游戏结束if len(enemies):self.hero.kill()self.__game_over()# 退出处理@staticmethoddef __game_over():pygame.quit() # 卸载所有的 pygame 模块exit()# 启动游戏def start_game(self):while True:# 设置刷新帧率self.clock.tick(UPDATE_FPS)# 事件监听self.__event_handler()# 碰撞检测self.__check_collide()# 更新位置self.__update_sprites()# 更新显示pygame.display.update()if __name__ == '__main__':# 创建游戏对象game = GameClass()# 开始游戏game.start_game()
需要用的图片
我放几张图片在这里,大家可以右键保存后转化为png格式自己用
利用python和pygame模块实现飞机大战相关推荐
- Python使用pygame模块实现飞机大战
文章目录 ReadMe 1.开发环境 2.准备环境 2.1 创建工程文件夹和虚拟环境 2.2 安装pygame工具包 3.帮助文档 4.开发步骤 5.项目分析 5.1 对象关系图 5.2 飞机具有的属 ...
- 【Python游戏】pygame模块制作飞机大战、贪吃蛇(多模式)含源码
pygame模块制作飞机大战.贪吃蛇(多版本) 本章意在学习pygame模块以及巩固python语法. 若有需请转去个人github:https://github.com/onlyhyl/pyGame
- python调用pygame_python使用pygame模块实现坦克大战游戏
本文实例为大家分享了pygame模块实现坦克大战游戏的具体代码,供大家参考,具体内容如下 首先,第一步,游戏简单素材的准备. 炮弹, 炮弹,坦克移动.音乐-开火素材. 其次,思路整理. 我们需要几个类 ...
- 基于pygame实现的飞机大战游戏
目录 1.引言 1.1 背景 1.2 意义 1.3 功能 2.系统结构 2.1 整体框架 2.2 精灵与精灵组 2.3 功能介绍 2.3.1 玩家飞机 2.3.2 敌机类型和关卡设定 2.3.3 敌机 ...
- (七)通过pygame来设置飞机大战中 敌机 的速度、位置等
python飞机大战系列文章(按顺序) (一)通过pygame 将自己的图像添加到游戏中 (二)通过pygame让游戏人物 动起来 (三)通过pygame处理用户的鼠标键盘操作(事件和监听 (四)详解 ...
- 手把手教学,Python 游戏编程之实现飞机大战(含源代码)
文章目录 一.游戏设定 1.游戏界面展示和设定 二.实现过程 1.我方飞机 2.敌方飞机 3.定义武器 4.武器补充库 5.主模块 总结: 前言 我想大家都是有玩过类似飞机大战的射击类游戏,也享受目标 ...
- 用 Python 写一个经典的飞机大战(附源代码)
当年微信 5.0 发布时,首页被设置成了一款新推出的小游戏,它就是微信版飞机大战,游戏一经推出便是火爆异常,铅笔画风格的游戏界面也受到了很多人的喜欢. 最近重温了一下这款小游戏,尽管时隔多年,但无论是 ...
- 【Python知识点梳理】8.飞机大战(面向对象设计思维)
8.飞机大战(面向对象设计思维) 文章目录 1.飞机大战效果展示 2.我方飞机类 3.敌方飞机类 4.子弹类 5.补给类 6.主函数 总结 1.飞机大战效果展示 飞机大战(面向对象设计思维),主要 ...
- Python中pygame模块pygame.sprite.groupcollision碰撞检测的详解与测试
在游戏开发中,非常重要的编程工作就是进行碰撞检测.在python的pygame模块中的sprite精灵类提供了多种方便快捷的碰撞检测方法.比如矩形碰撞检测.圆形碰撞检测.遮罩碰撞检测,这些方法基本都是 ...
- Python 游戏编程之实现飞机大战(含源代码)
点击上方蓝色小字,关注"涛哥聊Python" 重磅干货,第一时间送达 来自:CSDN,作者:逐梦er 链接:https://zhumenger.blog.csdn.net/arti ...
最新文章
- 曙光服务器bios设置_浪潮服务器PM8060阵列卡,如何做热备盘?操作相对有点复杂...
- python java
- c++ 句柄 计算控件坐标_练习答案|| 计算机基础第【28】期
- C++最大数的幂 largest power实现算法(附完整源码)
- CSS固定定位[相对浏览器] 相对定位[相对自己] 绝对定位[有relative的元素]
- 织梦dedecms默认网站地图sitemap.html优化
- Python爬虫从入门到放弃(十一)之 Scrapy框架整体的一个了解
- SpringMVC4+Hibernate4运行报错Could not obtain transaction-synchronized Session for current thread...
- 坐高铁只能用身份证了?
- 挑战程序设计竞赛:Ants
- 以下数据库收录外文文献全文的有_除了SCIHUB,这十大外文文献下载数据库也应该一试!...
- 《代码大全》个人总结
- vue-cli开发Vue项目时定义环境变量需加VUE_APP前缀
- unexpectedly exited. Status code was
- 一区希尔盖服务器找不到,魔兽世界怀旧服:服务器第一成就达成!分享一下心得...
- SWIFT gpi Instant 成功与新加坡 FAST 进行全球测试
- 员工格言[付总提供]
- JavaSE-网络socket编程
- 固高GTS运动控制卡,C#语言三轴点胶机样本程序源代码,使用 的是固高GTS-800 8轴运动控制卡
- CV中直方图比较方法
热门文章
- 计算机专业英语unit6,计算机专业英语郭敏 计算机专业英语Unit6
- graphpad两组t检验_Graphpad Prism如何科学地选择统计学方法
- EXCEL姓名转换为拼音缩写
- 产品策划到底是做什么的?
- JavaScript---文件下载处理文件下载失败兼容IE11文件下载
- 写给那些常年战痘的痘友们~~~
- 再见,深圳!再见,腾讯!
- java日期 国际化_java中国际化的时间处理
- 微信小程序:微信公众号申请微信小程序并认证的步骤
- vue中使用v-for,出现警告 component lists rendered with v-for should have explicit keys