如何实现Pygame坦克大战游戏
发表于:2025-11-14 作者:千家信息网编辑
千家信息网最后更新 2025年11月14日,这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文1)游戏规则:游戏过程是这样的,玩家操作坦克消灭电脑控
千家信息网最后更新 2025年11月14日如何实现Pygame坦克大战游戏
这篇文章将为大家详细讲解有关如何实现Pygame坦克大战游戏,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。
正文
1)游戏规则:
游戏过程是这样的,玩家操作坦克消灭电脑控制的坦克,并保护自己基地。基地图标是一只傲娇的张着翅膀的老鹰。小时候自
己失手把飞鹰轰成烧鸡的惨案经常发生。

双打的时候,为了看谁刷得分高,都争着打坦克,大本营的老鹰被烤熟了都不管。。
坦克大战中的宝贝有战车、星星、时钟等,小编当时最喜欢的是时钟,敌不能动我能动的感觉妙极了。图中的坦克图标吃了是
可以加一条命的,当时为了抢宝贝都抢先把队友的坦克打晕。。。
2)环境安装
Python3、Pycharm、Pygame、以及自带或自定义的模块。
pip install +模块名 或pip install -i https://pypi.douban.com/simple/ +模块名
3)代码演示
(之前不是写过的嘛,今天的话就是修改下的,这种小游戏代码肯定都很多的,所以这里直接贴主程序了。
需要完整的打包好的代码跟素材哪些的话 直接滴滴我即可或者看我主页左侧哪里有源码基地的哈!)
主程序:
import pygamefrom pygame.locals import *import sysimport sceneimport bulletimport foodimport tanksimport home # 开始界面显示def show_start_interface(screen, width, height): tfont = pygame.font.Font('./font/simkai.ttf', width // 4) cfont = pygame.font.Font('./font/simkai.ttf', width // 20) title = tfont.render(u'坦克大战', True, (255, 0, 0)) content1 = cfont.render(u'按1键进入单人游戏', True, (0, 244, 222)) content2 = cfont.render(u'按2键进入双人人游戏', True, (0, 0, 255)) #显示字体pygame.font.Font.render(text文本, antialias是否抗锯齿, color颜色, background=None) trect = title.get_rect() # 默认title左上角的坐标是 (0, 0) trect.midtop = (width / 2, height / 5) crect1 = content1.get_rect() crect1.midtop = (width / 2, height / 1.8) crect2 = content2.get_rect() crect2.midtop = (width / 2, height / 1.6) screen.blit(title, trect) screen.blit(content1, crect1) screen.blit(content2, crect2) # 在指定位置绘制指定文字对象 pygame.display.update() # 更新界面 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() elif event.type == pygame.KEYDOWN: if event.key == pygame.K_1: return 1 if event.key == pygame.K_2: return 2 # 结束界面显示def show_end_interface(screen, width, height, is_win): bg_img = pygame.image.load("./images/others/background.png") screen.blit(bg_img, (0, 0)) if is_win: font = pygame.font.Font('./font/simkai.ttf', width // 10) content = font.render(u'恭喜通关!', True, (255, 0, 0)) rect = content.get_rect() rect.midtop = (width / 2, height / 2) screen.blit(content, rect) else: fail_img = pygame.image.load("./images/others/gameover.png") rect = fail_img.get_rect() rect.midtop = (width / 2, height / 2) screen.blit(fail_img, rect) pygame.display.update() while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() # 关卡切换def show_switch_stage(screen, width, height, stage): bg_img = pygame.image.load("./images/others/background.png") screen.blit(bg_img, (0, 0)) font = pygame.font.Font('./font/simkai.ttf', width // 10) content = font.render(u'第%d关' % stage, True, (0, 255, 0)) rect = content.get_rect() rect.midtop = (width / 2, height / 2) screen.blit(content, rect) pygame.display.update() delay_event = pygame.constants.USEREVENT pygame.time.set_timer(delay_event, 1000) #定时器延时 while True: for event in pygame.event.get(): if event.type == QUIT: sys.exit() if event.type == delay_event: return def main(): pygame.init() pygame.mixer.init() screen = pygame.display.set_mode((630, 630)) pygame.display.set_caption('坦克大战') bg_img = pygame.image.load('./images/others/background.png') # 加载音效 add_sound = pygame.mixer.Sound("./audios/add.wav") add_sound.set_volume(1) bang_sound = pygame.mixer.Sound("./audios/bang.wav") bang_sound.set_volume(1) blast_sound = pygame.mixer.Sound("./audios/blast.wav") blast_sound.set_volume(1) fire_sound = pygame.mixer.Sound("./audios/fire.wav") fire_sound.set_volume(1) Gunfire_sound = pygame.mixer.Sound("./audios/Gunfire.wav") Gunfire_sound.set_volume(1) hit_sound = pygame.mixer.Sound("./audios/hit.wav") hit_sound.set_volume(1) start_sound = pygame.mixer.Sound("./audios/start.wav") start_sound.set_volume(1) # 开始界面 num_player = show_start_interface(screen, 630, 630) # 播放游戏开始的音乐 start_sound.play() # 关卡 stage = 0 num_stage = 2 # 游戏是否结束 is_gameover = False # 时钟 clock = pygame.time.Clock() # 主循环 while not is_gameover: # 关卡 stage += 1 if stage > num_stage: break show_switch_stage(screen, 630, 630, stage) # 该关卡坦克总数量 enemytanks_total = min(stage * 18, 80) # 场上存在的敌方坦克总数量 enemytanks_now = 0 # 场上可以存在的敌方坦克总数量 enemytanks_now_max = min(max(stage * 2, 4), 8) # 精灵组,独立运行的动画组 tanksGroup = pygame.sprite.Group() mytanksGroup = pygame.sprite.Group() enemytanksGroup = pygame.sprite.Group() bulletsGroup = pygame.sprite.Group() mybulletsGroup = pygame.sprite.Group() enemybulletsGroup = pygame.sprite.Group() myfoodsGroup = pygame.sprite.Group() # 自定义事件 # -生成敌方坦克事件 genEnemyEvent = pygame.constants.USEREVENT pygame.time.set_timer(genEnemyEvent, 100) # -敌方坦克静止恢复事件 recoverEnemyEvent = pygame.constants.USEREVENT pygame.time.set_timer(recoverEnemyEvent, 8000) # -我方坦克无敌恢复事件 noprotectMytankEvent = pygame.constants.USEREVENT pygame.time.set_timer(noprotectMytankEvent, 8000) # 关卡地图 map_stage = scene.Map(stage) # 我方坦克 tank_player1 = tanks.myTank(1) tanksGroup.add(tank_player1) mytanksGroup.add(tank_player1) if num_player > 1: tank_player2 = tanks.myTank(2) tanksGroup.add(tank_player2) mytanksGroup.add(tank_player2) is_switch_tank = True player1_moving = False player2_moving = False # 为了轮胎的动画效果 time = 0 # 敌方坦克 for i in range(0, 3): if enemytanks_total > 0: enemytank = tanks.enemyTank(i) tanksGroup.add(enemytank) enemytanksGroup.add(enemytank) enemytanks_now += 1 enemytanks_total -= 1 # 大本营 myhome = home.Home() # 出场特效 appearance_img = pygame.image.load("./images/others/appear.png").convert_alpha() appearances = [] appearances.append(appearance_img.subsurface((0, 0), (48, 48))) appearances.append(appearance_img.subsurface((48, 0), (48, 48))) appearances.append(appearance_img.subsurface((96, 0), (48, 48))) # 关卡主循环 while True: if is_gameover is True: break if enemytanks_total < 1 and enemytanks_now < 1: is_gameover = False break for event in pygame.event.get(): if event.type == pygame.QUIT: pygame.quit() sys.exit() if event.type == genEnemyEvent: if enemytanks_total > 0: if enemytanks_now < enemytanks_now_max: enemytank = tanks.enemyTank() if not pygame.sprite.spritecollide(enemytank, tanksGroup, False, None): tanksGroup.add(enemytank) enemytanksGroup.add(enemytank) enemytanks_now += 1 enemytanks_total -= 1 if event.type == recoverEnemyEvent: for each in enemytanksGroup: each.can_move = True if event.type == noprotectMytankEvent: for each in mytanksGroup: mytanksGroup.protected = False # 检查用户键盘操作 key_pressed = pygame.key.get_pressed() # 玩家一 # WSAD -> 上下左右 # 空格键射击 if key_pressed[pygame.K_w]: tanksGroup.remove(tank_player1) tank_player1.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_s]: tanksGroup.remove(tank_player1) tank_player1.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_a]: tanksGroup.remove(tank_player1) tank_player1.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_d]: tanksGroup.remove(tank_player1) tank_player1.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player1) player1_moving = True elif key_pressed[pygame.K_SPACE]: if not tank_player1.bullet.being: fire_sound.play() tank_player1.shoot() # 玩家二 # ↑↓←→ -> 上下左右 # 小键盘0键射击 if num_player > 1: if key_pressed[pygame.K_UP]: tanksGroup.remove(tank_player2) tank_player2.move_up(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_DOWN]: tanksGroup.remove(tank_player2) tank_player2.move_down(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_LEFT]: tanksGroup.remove(tank_player2) tank_player2.move_left(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_RIGHT]: tanksGroup.remove(tank_player2) tank_player2.move_right(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(tank_player2) player2_moving = True elif key_pressed[pygame.K_KP0]: if not tank_player2.bullet.being: fire_sound.play() tank_player2.shoot() # 背景 screen.blit(bg_img, (0, 0)) # 石头墙 for each in map_stage.brickGroup: screen.blit(each.brick, each.rect) # 钢墙 for each in map_stage.ironGroup: screen.blit(each.iron, each.rect) # 冰 for each in map_stage.iceGroup: screen.blit(each.ice, each.rect) # 河流 for each in map_stage.riverGroup: screen.blit(each.river, each.rect) # 树 for each in map_stage.treeGroup: screen.blit(each.tree, each.rect) time += 1 if time == 5: time = 0 is_switch_tank = not is_switch_tank # 我方坦克 if tank_player1 in mytanksGroup: if is_switch_tank and player1_moving: screen.blit(tank_player1.tank_0, (tank_player1.rect.left, tank_player1.rect.top)) player1_moving = False else: screen.blit(tank_player1.tank_1, (tank_player1.rect.left, tank_player1.rect.top)) if tank_player1.protected: screen.blit(tank_player1.protected_mask1, (tank_player1.rect.left, tank_player1.rect.top)) if num_player > 1: if tank_player2 in mytanksGroup: if is_switch_tank and player2_moving: screen.blit(tank_player2.tank_0, (tank_player2.rect.left, tank_player2.rect.top)) player1_moving = False else: screen.blit(tank_player2.tank_1, (tank_player2.rect.left, tank_player2.rect.top)) if tank_player2.protected: screen.blit(tank_player1.protected_mask1, (tank_player2.rect.left, tank_player2.rect.top)) # 敌方坦克 for each in enemytanksGroup: # 出生特效 if each.born: if each.times > 0: each.times -= 1 if each.times <= 10: screen.blit(appearances[2], (3 + each.x * 12 * 24, 3)) elif each.times <= 20: screen.blit(appearances[1], (3 + each.x * 12 * 24, 3)) elif each.times <= 30: screen.blit(appearances[0], (3 + each.x * 12 * 24, 3)) elif each.times <= 40: screen.blit(appearances[2], (3 + each.x * 12 * 24, 3)) elif each.times <= 50: screen.blit(appearances[1], (3 + each.x * 12 * 24, 3)) elif each.times <= 60: screen.blit(appearances[0], (3 + each.x * 12 * 24, 3)) elif each.times <= 70: screen.blit(appearances[2], (3 + each.x * 12 * 24, 3)) elif each.times <= 80: screen.blit(appearances[1], (3 + each.x * 12 * 24, 3)) elif each.times <= 90: screen.blit(appearances[0], (3 + each.x * 12 * 24, 3)) else: each.born = False else: if is_switch_tank: screen.blit(each.tank_0, (each.rect.left, each.rect.top)) else: screen.blit(each.tank_1, (each.rect.left, each.rect.top)) if each.can_move: tanksGroup.remove(each) each.move(tanksGroup, map_stage.brickGroup, map_stage.ironGroup, myhome) tanksGroup.add(each) # 我方子弹 for tank_player in mytanksGroup: if tank_player.bullet.being: tank_player.bullet.move() screen.blit(tank_player.bullet.bullet, tank_player.bullet.rect) # 子弹碰撞敌方子弹 for each in enemybulletsGroup: if each.being: if pygame.sprite.collide_rect(tank_player.bullet, each): tank_player.bullet.being = False each.being = False enemybulletsGroup.remove(each) break else: enemybulletsGroup.remove(each) # 子弹碰撞敌方坦克 for each in enemytanksGroup: if each.being: if pygame.sprite.collide_rect(tank_player.bullet, each): if each.is_red == True: myfood = food.Food() myfood.generate() myfoodsGroup.add(myfood) each.is_red = False each.blood -= 1 each.color -= 1 if each.blood < 0: bang_sound.play() each.being = False enemytanksGroup.remove(each) enemytanks_now -= 1 tanksGroup.remove(each) else: each.reload() tank_player.bullet.being = False break else: enemytanksGroup.remove(each) tanksGroup.remove(each) # 子弹碰撞石头墙 if pygame.sprite.spritecollide(tank_player.bullet, map_stage.brickGroup, True, None): tank_player.bullet.being = False # 子弹碰钢墙 if tank_player.bullet.stronger: if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, True, None): tank_player.bullet.being = False else: if pygame.sprite.spritecollide(tank_player.bullet, map_stage.ironGroup, False, None): tank_player.bullet.being = False # 子弹碰大本营 if pygame.sprite.collide_rect(tank_player.bullet, myhome): tank_player.bullet.being = False myhome.set_dead() is_gameover = True # 敌方子弹 for each in enemytanksGroup: if each.being: if each.can_move and not each.bullet.being: enemybulletsGroup.remove(each.bullet) each.shoot() enemybulletsGroup.add(each.bullet) if not each.born: if each.bullet.being: each.bullet.move() screen.blit(each.bullet.bullet, each.bullet.rect) # 子弹碰撞我方坦克 for tank_player in mytanksGroup: if pygame.sprite.collide_rect(each.bullet, tank_player): if not tank_player.protected: bang_sound.play() tank_player.life -= 1 if tank_player.life < 0: mytanksGroup.remove(tank_player) tanksGroup.remove(tank_player) if len(mytanksGroup) < 1: is_gameover = True else: tank_player.reset() each.bullet.being = False enemybulletsGroup.remove(each.bullet) break # 子弹碰撞石头墙 if pygame.sprite.spritecollide(each.bullet, map_stage.brickGroup, True, None): each.bullet.being = False enemybulletsGroup.remove(each.bullet) # 子弹碰钢墙 if each.bullet.stronger: if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, True, None): each.bullet.being = False else: if pygame.sprite.spritecollide(each.bullet, map_stage.ironGroup, False, None): each.bullet.being = False # 子弹碰大本营 if pygame.sprite.collide_rect(each.bullet, myhome): each.bullet.being = False myhome.set_dead() is_gameover = True else: enemytanksGroup.remove(each) tanksGroup.remove(each) # 家 screen.blit(myhome.home, myhome.rect) # 食物 for myfood in myfoodsGroup: if myfood.being and myfood.time > 0: screen.blit(myfood.food, myfood.rect) myfood.time -= 1 for tank_player in mytanksGroup: if pygame.sprite.collide_rect(tank_player, myfood): # 消灭当前所有敌人 if myfood.kind == 0: for _ in enemytanksGroup: bang_sound.play() enemytanksGroup = pygame.sprite.Group() enemytanks_total -= enemytanks_now enemytanks_now = 0 # 敌人静止 if myfood.kind == 1: for each in enemytanksGroup: each.can_move = False # 子弹增强 if myfood.kind == 2: add_sound.play() tank_player.bullet.stronger = True # 使得大本营的墙变为钢板 if myfood.kind == 3: map_stage.protect_home() # 坦克获得一段时间的保护罩 if myfood.kind == 4: add_sound.play() for tank_player in mytanksGroup: tank_player.protected = True # 坦克升级 if myfood.kind == 5: add_sound.play() tank_player.up_level() # 坦克生命+1 if myfood.kind == 6: add_sound.play() tank_player.life += 1 myfood.being = False myfoodsGroup.remove(myfood) break else: myfood.being = False myfoodsGroup.remove(myfood) pygame.display.flip() clock.tick(60) if not is_gameover: show_end_interface(screen, 630, 630, True) else: show_end_interface(screen, 630, 630, False) if __name__ == '__main__': main()4)效果展示
视频展示效果——
视频播放链接:https://live.csdn.net/v/embed/181068
【Pygame实战】经典的坦克大战游戏,勾起童年无限回忆!
静态截图效果——
游戏界面:
第一关单人游戏:
双人第一关游戏:
关于"如何实现Pygame坦克大战游戏"这篇文章就分享到这里了,希望以上内容可以对大家有一定的帮助,使各位可以学到更多知识,如果觉得文章不错,请把它分享出去让更多的人看到。
坦克
子弹
敌方
大战
关卡
界面
事件
大本
大本营
效果
碰撞
代码
基地
数量
时钟
模块
篇文章
能动
上下左右
上下
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
软件开发全国最好的专科学校
网络安全法有上位性吗
数据库如何查询字段相同的
数码宝贝数据库
江苏软件开发价格实惠
王者荣耀服务器套餐
公务员和软件开发有关岗位
湖南常德网络安全案例
数据库应用实例
软考中级选择数据库好过么
xbox黑暗之魂3建立服务器
内网构建服务器
贵卅六频道家庭教育与网络安全
服务器光口网卡驱动
网络安全 守护绿色家园
全球软件开发志愿者
杭州软件开发驻场服务平台
查询mdb数据库数据并显示结果
拉卡拉网络技术有限公司电话
工信部网络安全管理局张正
校园邮箱服务器
软件开发助理简历怎么写
大数据软件开发流程管控
深圳服务器电源厂家有哪些
众安科技属于几线互联网
网络安全工作状态
天津统一软件开发推广
煤矿软件开发驻场
网络安全代理服务技术优点
sql中spj数据库