Python实现【坦克大战】+源码分享

写在前面:

坦克大战,这款经典的电子游戏,无疑是许多80后和90后心中不可磨灭的童年记忆。它不仅仅是一款游戏,更是那个时代科技娱乐方式的缩影,见证了电子游戏行业的起步与发展。

在那个电脑和网络尚未完全普及的年代,坦克大战以其简单的规则、丰富的关卡设计和紧张刺激的游戏性,迅速赢得了广大玩家的喜爱。游戏中,玩家需要驾驶坦克在各种地形中穿梭,巧妙地躲避敌人的攻击,同时精准地击毁敌方坦克,以获得胜利。

在这里插入图片描述

这款游戏的成功,不仅在于它的娱乐性,更在于它所蕴含的策略性和合作精神。玩家需要不断地思考如何利用地形优势,如何合理分配火力,以及如何在团队中与队友协同作战。这些元素的结合,使得坦克大战成为了一款深受各个年龄段玩家欢迎的游戏。

随着时间的推移,尽管游戏界出现了许多新的游戏类型和平台,但坦克大战依然在许多玩家心中占有一席之地。它不仅代表了那个时代的美好回忆,更是游戏文化发展史上的一个重要里程碑。今天,当我们回顾这款游戏时,不禁感叹于它对后世游戏设计和玩家游戏体验所产生的深远影响。也算是带大家回顾经典,今天就带大家用Python实现一下童年回忆——“坦克大战”。
在这里插入图片描述

环境搭建

开发环境和库

  • Python 3.8: 作为编程语言的核心。
  • Pygame 2.0.1: 用于游戏开发的Python库。

安装步骤:

安装Python 3.8:

访问Python官方网站下载并安装Python 3.8。
安装时确保勾选“Add Python to PATH”。
安装Pygame 2.0.1:

打开命令行,输入pip install pygame==2.0.1来安装指定版本的Pygame。

项目实现

游戏开始界面的原理就是在650×650的界面中在指定位置放置图片以及输出文本,然后通过检测鼠标的移动以及按键来检测,如果鼠标移动到说明的矩形框中就在下方放置说明的图片,移开后就用黑色填充矩形进行覆盖。如果鼠标移入开始的矩形框中,并按下左键就返回主函数,调用游戏场景的函数。

前期准备

在前期我们需要将编程需要的素材准备好。这里编程平台使用的是pycharm,使用到的包有pygame、sys、random和自定义的文件,导包如下:

import pygame
from pygame.sprite import Group
from pygame import sprite, display, image

图片素材

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

开发游戏元素

设计坦克类:坦克类应该包含移动、旋转和射击等基本功能。此外,还需要考虑坦克的耐久度、速度和武器升级等属性。

我方坦克:

import pygame
import bulletClasstank_T1_0 = r"..\image\tank_T1_0.png"
tank_T1_1 = r"..\image\tank_T1_1.png"
tank_T1_2 = r"..\image\tank_T1_2.png"
tank_T2_0 = r"..\image\tank_T2_0.png"
tank_T2_1 = r"..\image\tank_T2_1.png"
tank_T2_2 = r"..\image\tank_T2_2.png"class MyTank(pygame.sprite.Sprite):def __init__(self, playerNumber):pygame.sprite.Sprite.__init__(self)# �������self.life = True#���ڼ������   ̹�˵������ȼ�if playerNumber == 1:self.tank_L0_image = pygame.image.load(tank_T1_0).convert_alpha()self.tank_L1_image = pygame.image.load(tank_T1_1).convert_alpha()self.tank_L2_image = pygame.image.load(tank_T1_2).convert_alpha()if playerNumber == 2:self.tank_L0_image = pygame.image.load(tank_T2_0).convert_alpha()self.tank_L1_image = pygame.image.load(tank_T2_1).convert_alpha()self.tank_L2_image = pygame.image.load(tank_T2_2).convert_alpha()self.level = 0# ��ʼ̹��Ϊ0��self.tank = self.tank_L0_image# �˶��е�����ͼƬself.tank_R0 = self.tank.subsurface((0, 0),(48, 48))self.tank_R1 = self.tank.subsurface((48, 0),(48, 48))self.rect = self.tank_R0.get_rect()if playerNumber == 1:self.rect.left, self.rect.top = 3 + 24 * 8, 3 + 24 * 24 if playerNumber == 2:self.rect.left, self.rect.top = 3 + 24 * 16, 3 + 24 * 24 # ̹���ٶ�   ̹�˷���   ̹������   �ӵ���ȴself.speed = 3self.dir_x, self.dir_y = 0, -1self.life = 3self.bulletNotCooling = Trueself.bullet = bulletClass.Bullet()#self.bullet.rect.left, self.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24def shoot(self):# �ӵ�self.bullet.life = Trueself.bullet.changeImage(self.dir_x, self.dir_y)if self.dir_x == 0 and self.dir_y == -1:self.bullet.rect.left = self.rect.left + 20self.bullet.rect.bottom = self.rect.top + 1elif self.dir_x == 0 and self.dir_y == 1:self.bullet.rect.left = self.rect.left + 20self.bullet.rect.top = self.rect.bottom - 1elif self.dir_x == -1 and self.dir_y == 0:self.bullet.rect.right = self.rect.left - 1self.bullet.rect.top = self.rect.top + 20elif self.dir_x == 1 and self.dir_y == 0:self.bullet.rect.left = self.rect.right + 1self.bullet.rect.top = self.rect.top + 20if self.level == 1:self.bullet.speed  = 16self.bullet.strong = Falseif self.level == 2:self.bullet.speed  = 16self.bullet.strong = Trueif self.level == 3:self.bullet.speed  = 48self.bullet.strong = Truedef levelUp(self):if self.level < 2:self.level += 1if self.level == 0:self.tank = self.tank_L0_imageif self.level == 1:self.tank = self.tank_L1_imageif self.level == 2:self.tank = self.tank_L2_imageif self.level == 3:self.tank = self.tank_L2_imagedef levelDown(self):if self.level > 0:self.level -= 1if self.level == 0:self.tank = self.tank_L0_imageself.bullet.speed  = 6self.bullet.strong = Falseif self.level == 1:self.tank = self.tank_L1_imageif self.level == 2:self.tank = self.tank_L2_image# ����True ����������ײdef moveUp(self, tankGroup, brickGroup, ironGroup):self.rect = self.rect.move(self.speed * 0, self.speed * -1)self.tank_R0 = self.tank.subsurface((0, 0),(48, 48))self.tank_R1 = self.tank.subsurface((48, 0),(48, 48))self.dir_x, self.dir_y = 0, -1if self.rect.top < 3:self.rect = self.rect.move(self.speed * 0, self.speed * 1)return Trueif pygame.sprite.spritecollide(self, brickGroup, False, None) \or pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed * 0, self.speed * 1)return Trueif pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed * 0, self.speed * 1)return Truereturn Falsedef moveDown(self, tankGroup, brickGroup, ironGroup):self.rect = self.rect.move(self.speed * 0, self.speed * 1)self.tank_R0 = self.tank.subsurface((0, 48),(48, 48))self.tank_R1 = self.tank.subsurface((48, 48),(48, 48))self.dir_x, self.dir_y = 0, 1if self.rect.bottom > 630 - 3:self.rect = self.rect.move(self.speed * 0, self.speed * -1)return Trueif pygame.sprite.spritecollide(self, brickGroup, False, None) \or pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed * 0, self.speed * -1)return Trueif pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed * 0, self.speed * -1)return Truereturn Falsedef moveLeft(self, tankGroup, brickGroup, ironGroup):self.rect = self.rect.move(self.speed * -1, self.speed * 0)self.tank_R0 = self.tank.subsurface((0, 96),(48, 48))self.tank_R1 = self.tank.subsurface((48, 96),(48, 48))self.dir_x, self.dir_y = -1, 0if self.rect.left < 3:self.rect = self.rect.move(self.speed * 1, self.speed * 0)return Trueif pygame.sprite.spritecollide(self, brickGroup, False, None) \or pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed * 1, self.speed * 0)return Trueif pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed * 1, self.speed * 0)return Truereturn Falsedef moveRight(self, tankGroup, brickGroup, ironGroup):self.rect = self.rect.move(self.speed * 1, self.speed * 0)self.tank_R0 = self.tank.subsurface((0, 144),(48, 48))self.tank_R1 = self.tank.subsurface((48, 144),(48, 48))self.dir_x, self.dir_y = 1, 0if self.rect.right > 630 - 3:self.rect = self.rect.move(self.speed * -1, self.speed * 0)return Trueif pygame.sprite.spritecollide(self, brickGroup, False, None) \or pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed * -1, self.speed * 0)return Trueif pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed * -1, self.speed * 0)return Truereturn False

实现子弹类:子弹类需要处理子弹的生成、移动轨迹和碰撞检测。子弹可以有多种类型,例如穿甲弹或爆炸弹,每种类型都有不同的伤害和效果。

"""
功能:实现爆炸效果
"""
import pygame
from pygame import image
# from litao.GameRun import MainGameclass Boom:def __init__(self, tank):self.rect = tank.rectself.step = 0self.images = [image.load('./image/bomb_0.png'),image.load('./image/bomb_1.png'),image.load('./image/bomb_2.png'),image.load('./image/bomb_3.png')]self.image = self.images[self.step]self.live = True# 展示爆炸效果def displayBoom(self, screen):if self.step < len(self.images):screen.blit(self.image, self.rect)self.image = self.images[self.step]self.step += 1else:self.live = Falseself.step = 0

设计敌方AI:敌方AI应该具有一定的智能,能够根据玩家的位置进行追击或规避。可以通过状态机或行为树来实现复杂的AI行为。
创建障碍物:障碍物不仅可以阻挡子弹和坦克的移动,还可以作为地图上的战略要点。障碍物的设计应该与游戏地图的风格和主题保持一致。

wall.py

import pygamebrickImage          = r"..\image\brick.png"
ironImage           = r"..\image\iron.png"class Brick(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(brickImage)self.rect = self.image.get_rect()class Iron(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load(ironImage)self.rect = self.image.get_rect()class Map():def __init__(self):self.brickGroup = pygame.sprite.Group()self.ironGroup  = pygame.sprite.Group()# 数字代表地图中的位置# 画砖块X1379 = [2, 3, 6, 7, 18, 19, 22, 23]Y1379 = [2, 3, 4, 5, 6, 7, 8, 9, 10, 17, 18, 19, 20, 21, 22, 23]X28 = [10, 11, 14, 15]Y28 = [2, 3, 4, 5, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19, 20]X46 = [4, 5, 6, 7, 18, 19, 20, 21]Y46 = [13, 14]X5  = [12, 13]Y5  = [16, 17]X0Y0 = [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]for x in X1379:for y in Y1379:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brickGroup.add(self.brick)for x in X28:for y in Y28:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brickGroup.add(self.brick)for x in X46:for y in Y46:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brickGroup.add(self.brick)for x in X5:for y in Y5:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brickGroup.add(self.brick)for x, y in X0Y0:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brickGroup.add(self.brick)# 画石头for x, y in [(0,14),(1,14),(12,6),(13,6),(12,7),(13,7),(24,14),(25,14)]:self.iron = Iron()self.iron.rect.left, self.iron.rect.top = 3 + x * 24, 3 + y * 24self.ironGroup.add(self.iron)

音效与图形

添加音效:音效可以增强游戏的沉浸感。为射击、爆炸、坦克移动等关键事件添加音效,使游戏更加生动有趣。


"""
功能:播放音乐
"""
import pygame
from pygame import mixer# 我方坦克出生
class Music:def __init__(self, fileName):self.fileName = fileName# 先初始化混合器mixer.init()mixer.music.load(self.fileName)# 开始播放音乐def play(self):mixer.music.play()

设计图形资源:图形资源是游戏的视觉表现。设计高质量的坦克、子弹和障碍物图像,以及动画效果,可以使游戏更加吸引人。

主函数(游戏逻辑)

实现游戏界面

设计菜单界面:菜单界面应该直观易用,提供游戏开始、设置、排行榜和退出等功能。良好的用户界面设计可以提升玩家的游戏体验。
游戏得分显示:得分板应该实时更新玩家的得分和生命值。此外,还可以显示当前关卡、剩余时间和特殊成就等信息。
游戏结束逻辑:当玩家的基地被摧毁或所有敌方坦克被消灭时,游戏结束。根据玩家的表现,可以提供重新开始或进入下一关卡的选项。

# -*- coding: utf-8 -*-import pygame
import sys
import traceback
import wall
import myTank
import enemyTank
import fooddef main():pygame.init()pygame.mixer.init()resolution = 630, 630screen = pygame.display.set_mode(resolution)pygame.display.set_caption("Tank War ")# 加载图片,音乐,音效.background_image     = pygame.image.load(r"..\image\background.png")home_image           = pygame.image.load(r"..\image\home.png")home_destroyed_image = pygame.image.load(r"..\image\home_destroyed.png")bang_sound          = pygame.mixer.Sound(r"..\music\bang.wav")bang_sound.set_volume(1)fire_sound           = pygame.mixer.Sound(r"..\music\Gunfire.wav")start_sound          = pygame.mixer.Sound(r"..\music\start.wav")start_sound.play()# 定义精灵组:坦克,我方坦克,敌方坦克,敌方子弹allTankGroup     = pygame.sprite.Group()mytankGroup      = pygame.sprite.Group()allEnemyGroup    = pygame.sprite.Group()redEnemyGroup    = pygame.sprite.Group()greenEnemyGroup  = pygame.sprite.Group()otherEnemyGroup  = pygame.sprite.Group()  enemyBulletGroup = pygame.sprite.Group()# 创建地图 bgMap = wall.Map()# 创建食物/道具 但不显示prop = food.Food()# 创建我方坦克myTank_T1 = myTank.MyTank(1)allTankGroup.add(myTank_T1)mytankGroup.add(myTank_T1)myTank_T2 = myTank.MyTank(2)allTankGroup.add(myTank_T2)mytankGroup.add(myTank_T2)# 创建敌方 坦克for i in range(1, 4):enemy = enemyTank.EnemyTank(i)allTankGroup.add(enemy)allEnemyGroup.add(enemy)if enemy.isred == True:redEnemyGroup.add(enemy)continueif enemy.kind == 3:greenEnemyGroup.add(enemy)continueotherEnemyGroup.add(enemy)# 敌军坦克出现动画appearance_image = pygame.image.load(r"..\image\appear.png").convert_alpha()appearance = []appearance.append(appearance_image.subsurface(( 0, 0), (48, 48)))appearance.append(appearance_image.subsurface((48, 0), (48, 48)))appearance.append(appearance_image.subsurface((96, 0), (48, 48)))# 自定义事件# 创建敌方坦克延迟200DELAYEVENT = pygame.constants.USEREVENTpygame.time.set_timer(DELAYEVENT, 200)# 创建 敌方 子弹延迟1000ENEMYBULLETNOTCOOLINGEVENT = pygame.constants.USEREVENT + 1pygame.time.set_timer(ENEMYBULLETNOTCOOLINGEVENT, 1000)# 创建 我方 子弹延迟200MYBULLETNOTCOOLINGEVENT = pygame.constants.USEREVENT + 2pygame.time.set_timer(MYBULLETNOTCOOLINGEVENT, 200)# 敌方坦克 静止8000NOTMOVEEVENT = pygame.constants.USEREVENT + 3pygame.time.set_timer(NOTMOVEEVENT, 8000)delay = 100moving = 0movdir = 0moving2 = 0movdir2 = 0enemyNumber = 3enemyCouldMove      = Trueswitch_R1_R2_image  = TruehomeSurvive         = Truerunning_T1          = Truerunning_T2          = Trueclock = pygame.time.Clock()while True:for event in pygame.event.get():if event.type == pygame.QUIT:pygame.quit()sys.exit()# 我方子弹冷却事件if event.type == MYBULLETNOTCOOLINGEVENT:myTank_T1.bulletNotCooling = True# 敌方子弹冷却事件if event.type == ENEMYBULLETNOTCOOLINGEVENT:for each in allEnemyGroup:each.bulletNotCooling = True# 敌方坦克静止事件if event.type == NOTMOVEEVENT:enemyCouldMove = True# 创建敌方坦克延迟if event.type == DELAYEVENT:if enemyNumber < 4:enemy = enemyTank.EnemyTank()if pygame.sprite.spritecollide(enemy, allTankGroup, False, None):breakallEnemyGroup.add(enemy)allTankGroup.add(enemy)enemyNumber += 1if enemy.isred == True:redEnemyGroup.add(enemy)elif enemy.kind == 3:greenEnemyGroup.add(enemy)else:otherEnemyGroup.add(enemy)if event.type == pygame.KEYDOWN:if event.key == pygame.K_c and pygame.KMOD_CTRL:pygame.quit()sys.exit()if event.key == pygame.K_e:myTank_T1.levelUp()if event.key == pygame.K_q:myTank_T1.levelDown()if event.key == pygame.K_3:myTank_T1.levelUp()myTank_T1.levelUp()myTank_T1.level = 3if event.key == pygame.K_2:if myTank_T1.speed == 3:myTank_T1.speed = 24else:myTank_T1.speed = 3if event.key == pygame.K_1:for x, y in [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:bgMap.brick = wall.Brick()bgMap.brick.rect.left, bgMap.brick.rect.top = 3 + x * 24, 3 + y * 24bgMap.brickGroup.add(bgMap.brick)                if event.key == pygame.K_4:for x, y in [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:bgMap.iron = wall.Iron()bgMap.iron.rect.left, bgMap.iron.rect.top = 3 + x * 24, 3 + y * 24bgMap.ironGroup.add(bgMap.iron)                # 检查用户的键盘操作key_pressed = pygame.key.get_pressed()# 玩家一的移动操作if moving:moving -= 1if movdir == 0:allTankGroup.remove(myTank_T1)if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif movdir == 1:allTankGroup.remove(myTank_T1)if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif movdir == 2:allTankGroup.remove(myTank_T1)if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif movdir == 3:allTankGroup.remove(myTank_T1)if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving += 1allTankGroup.add(myTank_T1)running_T1 = Trueif not moving:if key_pressed[pygame.K_w]:moving = 7movdir = 0running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving = 0allTankGroup.add(myTank_T1)elif key_pressed[pygame.K_s]:moving = 7movdir = 1running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving = 0allTankGroup.add(myTank_T1)elif key_pressed[pygame.K_a]:moving = 7movdir = 2running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving = 0allTankGroup.add(myTank_T1)elif key_pressed[pygame.K_d]:moving = 7movdir = 3running_T1 = TrueallTankGroup.remove(myTank_T1)if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):moving = 0allTankGroup.add(myTank_T1)if key_pressed[pygame.K_j]:if not myTank_T1.bullet.life and myTank_T1.bulletNotCooling:fire_sound.play()myTank_T1.shoot()myTank_T1.bulletNotCooling = False# 玩家二的移动操作if moving2:moving2 -= 1if movdir2 == 0:allTankGroup.remove(myTank_T2)myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)running_T2 = Trueif movdir2 == 1:allTankGroup.remove(myTank_T2)myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)running_T2 = Trueif movdir2 == 2:allTankGroup.remove(myTank_T2)myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)running_T2 = Trueif movdir2 == 3:allTankGroup.remove(myTank_T2)myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)running_T2 = Trueif not moving2:if key_pressed[pygame.K_UP]:allTankGroup.remove(myTank_T2)myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 0running_T2 = Trueelif key_pressed[pygame.K_DOWN]:allTankGroup.remove(myTank_T2)myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 1running_T2 = Trueelif key_pressed[pygame.K_LEFT]:allTankGroup.remove(myTank_T2)myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 2running_T2 = Trueelif key_pressed[pygame.K_RIGHT]:allTankGroup.remove(myTank_T2)myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(myTank_T2)moving2 = 7movdir2 = 3running_T2 = Trueif key_pressed[pygame.K_KP0]:if not myTank_T2.bullet.life:# fire_sound.play()myTank_T2.shoot()# 画背景screen.blit(background_image, (0, 0))# 画砖块for each in bgMap.brickGroup:screen.blit(each.image, each.rect)        # 花石头for each in bgMap.ironGroup:screen.blit(each.image, each.rect)        # 画homeif homeSurvive:screen.blit(home_image, (3 + 12 * 24, 3 + 24 * 24))else:screen.blit(home_destroyed_image, (3 + 12 * 24, 3 + 24 * 24))# 画我方坦克1if not (delay % 5):switch_R1_R2_image = not switch_R1_R2_imageif switch_R1_R2_image and running_T1:screen.blit(myTank_T1.tank_R0, (myTank_T1.rect.left, myTank_T1.rect.top))running_T1 = Falseelse:screen.blit(myTank_T1.tank_R1, (myTank_T1.rect.left, myTank_T1.rect.top))# 画我方坦克2if switch_R1_R2_image and running_T2:screen.blit(myTank_T2.tank_R0, (myTank_T2.rect.left, myTank_T2.rect.top))running_T2 = Falseelse:screen.blit(myTank_T2.tank_R1, (myTank_T2.rect.left, myTank_T2.rect.top))    # 画敌方坦克for each in allEnemyGroup:# 判断5毛钱特效是否播放            if each.flash:# 判断画左动作还是右动作if switch_R1_R2_image:screen.blit(each.tank_R0, (each.rect.left, each.rect.top))if enemyCouldMove:allTankGroup.remove(each)each.move(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(each)else:screen.blit(each.tank_R1, (each.rect.left, each.rect.top))if enemyCouldMove:allTankGroup.remove(each)each.move(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)allTankGroup.add(each)                    else:# 播放5毛钱特效if each.times > 0:each.times -= 1if each.times <= 10:screen.blit(appearance[2], (3 + each.x * 12 * 24, 3))elif each.times <= 20:screen.blit(appearance[1], (3 + each.x * 12 * 24, 3))elif each.times <= 30:screen.blit(appearance[0], (3 + each.x * 12 * 24, 3))elif each.times <= 40:screen.blit(appearance[2], (3 + each.x * 12 * 24, 3))elif each.times <= 50:screen.blit(appearance[1], (3 + each.x * 12 * 24, 3))elif each.times <= 60:screen.blit(appearance[0], (3 + each.x * 12 * 24, 3))elif each.times <= 70:screen.blit(appearance[2], (3 + each.x * 12 * 24, 3))elif each.times <= 80:screen.blit(appearance[1], (3 + each.x * 12 * 24, 3))elif each.times <= 90:screen.blit(appearance[0], (3 + each.x * 12 * 24, 3))if each.times == 0:each.flash = True# 绘制我方子弹1if myTank_T1.bullet.life:myTank_T1.bullet.move()    screen.blit(myTank_T1.bullet.bullet, myTank_T1.bullet.rect)# 子弹 碰撞 子弹for each in enemyBulletGroup:if each.life:if pygame.sprite.collide_rect(myTank_T1.bullet, each):myTank_T1.bullet.life = Falseeach.life = Falsepygame.sprite.spritecollide(myTank_T1.bullet, enemyBulletGroup, True, None)# 子弹 碰撞 敌方坦克if pygame.sprite.spritecollide(myTank_T1.bullet, redEnemyGroup, True, None):prop.change()bang_sound.play()enemyNumber -= 1myTank_T1.bullet.life = Falseelif pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup, False, None):for each in greenEnemyGroup:if pygame.sprite.collide_rect(myTank_T1.bullet, each):if each.life == 1:pygame.sprite.spritecollide(myTank_T1.bullet,greenEnemyGroup, True, None)bang_sound.play()enemyNumber -= 1elif each.life == 2:each.life -= 1each.tank = each.enemy_3_0elif each.life == 3:each.life -= 1each.tank = each.enemy_3_2myTank_T1.bullet.life = Falseelif pygame.sprite.spritecollide(myTank_T1.bullet, otherEnemyGroup, True, None):bang_sound.play()enemyNumber -= 1myTank_T1.bullet.life = False    #if pygame.sprite.spritecollide(myTank_T1.bullet, allEnemyGroup, True, None):#    bang_sound.play()#    enemyNumber -= 1#    myTank_T1.bullet.life = False# 子弹 碰撞 brickGroupif pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.brickGroup, True, None):myTank_T1.bullet.life = FalsemyTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24# 子弹 碰撞 brickGroupif myTank_T1.bullet.strong:if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, True, None):myTank_T1.bullet.life = FalsemyTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24else:    if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, False, None):myTank_T1.bullet.life = FalsemyTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24# 绘制我方子弹2if myTank_T2.bullet.life:myTank_T2.bullet.move()    screen.blit(myTank_T2.bullet.bullet, myTank_T2.bullet.rect)# 子弹 碰撞 敌方坦克if pygame.sprite.spritecollide(myTank_T2.bullet, allEnemyGroup, True, None):bang_sound.play()enemyNumber -= 1myTank_T2.bullet.life = False# 子弹 碰撞 brickGroupif pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.brickGroup, True, None):myTank_T2.bullet.life = FalsemyTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24# 子弹 碰撞 brickGroupif myTank_T2.bullet.strong:if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, True, None):myTank_T2.bullet.life = FalsemyTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24else:    if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, False, None):myTank_T2.bullet.life = FalsemyTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24# 绘制敌人子弹for each in allEnemyGroup:# 如果子弹没有生命,则赋予子弹生命if not each.bullet.life and each.bulletNotCooling and enemyCouldMove:enemyBulletGroup.remove(each.bullet)each.shoot()enemyBulletGroup.add(each.bullet)each.bulletNotCooling = False# 如果5毛钱特效播放完毕 并且 子弹存活 则绘制敌方子弹if each.flash:if each.bullet.life:# 如果敌人可以移动if enemyCouldMove:each.bullet.move()screen.blit(each.bullet.bullet, each.bullet.rect)# 子弹 碰撞 我方坦克if pygame.sprite.collide_rect(each.bullet, myTank_T1):bang_sound.play()myTank_T1.rect.left, myTank_T1.rect.top = 3 + 8 * 24, 3 + 24 * 24 each.bullet.life = Falsemoving = 0  # 重置移动控制参数for i in range(myTank_T1.level+1):myTank_T1.levelDown()if pygame.sprite.collide_rect(each.bullet, myTank_T2):bang_sound.play()myTank_T2.rect.left, myTank_T2.rect.top = 3 + 16 * 24, 3 + 24 * 24 each.bullet.life = False# 子弹 碰撞 brickGroupif pygame.sprite.spritecollide(each.bullet, bgMap.brickGroup, True, None):each.bullet.life = False# 子弹 碰撞 ironGroupif each.bullet.strong:if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, True, None):each.bullet.life = Falseelse:    if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, False, None):each.bullet.life = False# 最后画食物/道具if prop.life:screen.blit(prop.image, prop.rect)# 我方坦克碰撞 食物/道具if pygame.sprite.collide_rect(myTank_T1, prop):if prop.kind == 1:  # 敌人全毁for each in allEnemyGroup:if pygame.sprite.spritecollide(each, allEnemyGroup, True, None):bang_sound.play()enemyNumber -= 1prop.life = Falseif prop.kind == 2:  # 敌人静止enemyCouldMove = Falseprop.life = Falseif prop.kind == 3:  # 子弹增强myTank_T1.bullet.strong = Trueprop.life = Falseif prop.kind == 4:  # 家得到保护for x, y in [(11,23),(12,23),(13,23),(14,23),(11,24),(14,24),(11,25),(14,25)]:bgMap.iron = wall.Iron()bgMap.iron.rect.left, bgMap.iron.rect.top = 3 + x * 24, 3 + y * 24bgMap.ironGroup.add(bgMap.iron)                prop.life = Falseif prop.kind == 5:  # 坦克无敌prop.life = Falsepassif prop.kind == 6:  # 坦克升级myTank_T1.levelUp()prop.life = Falseif prop.kind == 7:  # 坦克生命+1myTank_T1.life += 1prop.life = False# 延迟delay -= 1if not delay:delay = 100    pygame.display.flip()clock.tick(60)if __name__ == "__main__":try:main()except SystemExit:passexcept:traceback.print_exc()pygame.quit()input()

写在最后:

本期github优秀小游戏项目分享到这里就结束啦。感谢大家的耐心阅读,如果你对这些项目感兴趣,或者从中获得了灵感和乐趣,不妨通过点赞、关注和收藏来支持我们。你的每一个互动都是对我们最大的鼓励!

同时,如果你对我们的专栏感兴趣,不要忘记订阅哦!我会定期更新,带来更多有趣、实用的开源项目分享。无论是游戏开发新手还是资深玩家,相信都能在这里找到值得一探的宝藏。

期待着与你一起探索游戏世界的无限可能,让我们下期再见!

在这里插入图片描述

开源地址:https://github.com/wangxingyao/TankWar/tree/master

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/797871.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

c语言实现2048小游戏

#include <stdio.h> #include <stdlib.h> #include <time.h> #include <conio.h>int best 0 ;// 定义2048游戏的结构体 typedef struct { int martix[16]; // 当前4*4矩阵的数字 int martixPrior[16]; // 上一步的4*4矩阵的数字 int emptyIndex[16…

LeetCode 1017. 负二进制转换

解题思路 相关代码 class Solution {public String baseNeg2(int n) {if(n0) return "0";String s"";while(n!0)if(Math.abs(n)%20){nn/(-2);ss0;}else{ss1; n (n-1)/(-2);}String t reverse(s);return t;}public String reverse(String s){Str…

前端三剑客 —— JavaScript (第一节)

目录 回顾内容 1.弹性布局 2.网格布局 JavaScript 概述 发展 浏览器 什么是Javascript JavaScript 能干什么 JavaScript需要的环境 JavaScript初体验 基本数据 JS书写方式 行内JS 页面JS 外部JS 1&#xff09;创建外部JS文件 2&#xff09;编写页面 对话框 警…

【Threejs进阶教程-效果篇】1.Threejs文字与css2d/css3d技术

Threejs文字与css2d/css3d技术 学习ThreeJS的捷径学习之前先搞清楚自己想要什么样的效果贴图文字准备一张带文字的png贴图使用sprite来进行贴图实现2D始终面朝相机的文字使用planeGeometry来贴图实现3D文字使用planeGeometry来贴图实现伪3D文字动态贴图文字html2Canvas 文字几何…

操作系统复习

虚拟内存 内存(memory)资源永远都是稀缺的&#xff0c;当越来越多的进程需要越来越来内存时&#xff0c;某些进程会因为得不到内存而无法运行&#xff1b; 虚拟内存是计算机系统内存管理的一种技术。它使得应用程序认为它拥有连续的可用的内存&#xff0c;而实际上&#xff0…

HTML基础知识详解(下)(如果想知道html的全部基础知识点,那么只看这一篇就足够了!)

前言&#xff1a;在上一篇文章中&#xff0c;我们已经学习完了超链接标签、列表标签和表格标签&#xff0c;但是我们还有一些标签没有学习&#xff0c;在这篇文章中&#xff0c;我们将学习剩余的标签。 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主页…

JAVA并发编程(一)

JAVA并发编程&#xff08;一&#xff09; 1.1JAVA线程API 1.1.1currentThread package com.lisus2000.thread;/** * 当前线程 * */ public class Test07 extends Thread {public Test07() {System.out.println("new Test07()......" Thread.currentThread().getNa…

vivado中移位寄存器的优化(二)

移位寄存器优化用于改善移位寄存器单元&#xff08;SRLs&#xff09;与其他逻辑单元之间的负裕量路径的时序。如果存在对移位寄存器单元&#xff08;SRL16E或SRLC32E&#xff09;的时序违规&#xff0c;优化会从SRL寄存器链的开始或结束位置提取一个寄存器&#xff0c;并将其放…

深入理解数据结构第三弹——二叉树(3)——二叉树的基本结构与操作

二叉树&#xff08;1&#xff09;&#xff1a;深入理解数据结构第一弹——二叉树&#xff08;1&#xff09;——堆-CSDN博客 二叉树&#xff08;2&#xff09;&#xff1a;深入理解数据结构第二弹——二叉树&#xff08;2&#xff09;——堆排序及其时间复杂度-CSDN博客 前言…

面试:HashMap

目录 1、底层数据结构&#xff0c;1.7 与1.8有何不同? 2、为何要用红黑树&#xff0c;为何一上来不树化&#xff0c;树化阈值为何是8&#xff0c;何时会树化&#xff0c;何时会退化为链表? 3、索引如何计算? hashCode都有了&#xff0c;为何还要提供hash()方法?数组容量为…

【Easy云盘 | 第十二篇】分享模块(获取分享信息、校验分享码、获取文件列表)

文章目录 4.4.4获取分享信息4.4.5校验分享码4.4.6获取文件列表 4.4.4获取分享信息 明天做 4.4.5校验分享码 明天做 4.4.6获取文件列表 明天做

Vue3大事件项目1 登录注册

创建项目 引入 element-ui 组件库 登录&#xff1a;注册样式准备之后&#xff0c;配置校验规则&#xff08;4个条件&#xff1a;一数据、二规则&#xff09; 1. 校验相关 (1) 给当前表单绑上整个的数据对象&#xff1a;el-form > :model"ruleForm" 绑…

云服务器是不是云盘?

​  云服务器是不是云盘?云服务器和云盘是两个不同的概念&#xff0c;尽管它们都是云计算服务的一部分。云服务器是一种提供计算能力的服务&#xff0c;可以运行各种应用程序和服务&#xff0c;而云盘则是一种提供数据存储和共享服务的工具。 具体来说&#xff1a; 云服务器…

【Qt】事件

目录 一、介绍 二、进入离开事件 三、鼠标事件 3.1 鼠标单击事件 3.2 鼠标释放事件 3.3 鼠标双击事件 3.4 鼠标移动事件 3.5 滚轮事件 四、按键事件 4.1 单个按键 4.2 组合按键 五、定时器 5.1 QTimerEvent类 5.2 QTimer类 5.3 获取系统日期及时间 六、窗口移…

蓝桥杯刷题 前缀和与差分-[NewOJ P1819]推箱子(C++)

题目描述 在一个高度为H的箱子前方&#xff0c;有一个长和高为N的障碍物。 障碍物的每一列存在一个连续的缺口&#xff0c;第i列的缺口从第l各单位到第h个单位&#xff08;从底部由0开始数&#xff09;。 现在请你清理出一条高度为H的通道&#xff0c;使得箱子可以直接推出去。…

深度学习理论基础(二)深度神经网络DNN

目录 一、基础知识点Ⅰ 参数部分Ⅱ 模型部分 二、深度神经网络模型搭建1. 准备数据集2. 划分数据集3. 搭建模型4. 训练网络5. 测试网络6. 保存与导入模型 神经网络通过学习大量样本的输入与输出特征之间的关系&#xff0c;以拟合出输入与输出之间的方程&#xff0c;学习完成后&…

每日一题(leetcode31):下一个排列-思维

思路&#xff1a;从后往前找到第一个nums[i-1]>nums[i] 然后从后往前(len-1 -->i(包含))找到第一个大于nums[i-1]的数&#xff0c;与nums[i-1]交换&#xff0c;然后对下标区间为[i,len-1]的元素进行排序。 class Solution { public:void nextPermutation(vector<in…

[深度学习] 无人车环境准备

1. 安装过程基本遵循以下步骤 电脑端环境配置 - OriginBot智能机器人开源套件 需要注意以下两点&#xff1a; 1> 由于深度学习需要的包和镜像体积都比较大&#xff0c;所以虚拟机硬盘大小建议120GB 2> 虚拟机的网络适配器应该设置为桥接模式&#xff0c;如果使用NAT模…

vivado 使用网表插入调试探测流程

使用网表插入调试探测流程 在 Vivado 工具中插入调试核的过程以分层方式来演示 &#xff0c; 以应对多样化的 Vivado 用户组的不同需求 &#xff1a; • 最高层是根据选定调试的一组信号线来自动创建并配置 Integrated Logic Analyzer (ILA) 核的简单向导。 • 下一层是“…

File,IO流,递归详解

File类 介绍 java.io.File类是Java语言提供了用来描述文件和目录(文件夹)的 构造 方法 注意&#xff1a; 构造方法中通常用的是第一个方法文件和目录可以通过File封装成对象File封装的对象仅仅是一个路径名&#xff0c;它是可以存在的&#xff0c;也可以不存在 绝对路径…