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.rhkb.cn/news/300094.html

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

相关文章

【Linux】进程控制详解

目录 前言 进程创建 认识fork 写时拷贝 再谈fork 进程终止 进程退出码 用代码来终止进程 常见的进程终止的方式 exit _exit 进程等待 进程等待的必要性 进程等待的方式 wait waitpid 详解status参数 详解option参数 前言 本文适合有一点基础的人看的&#…

ruoyi-vue-pro 前端vue js直接import导入本地文件使用方法

我的xml文件名称叫w2101.xml 第一步&#xff0c;删除所有依赖&#xff0c;否则配置以后就会启动报错&#xff1a; 第二步配置对应的文件格式&#xff0c;我当前使用的是xml文件 config.module.rule(xml).test(/\.xml$/).use(xml-loader).loader(xml-loader).end();第三步…

python开发poc2

#本课知识点和目的&#xff1a; ---协议模块使用&#xff0c;Request 爬虫技术&#xff0c;简易多线程技术&#xff0c;编码技术&#xff0c;Bypass 后门技术 下载ftp服务器模拟器 https://lcba.lanzouy.com/iAMePxl378h 随便创建一个账户&#xff0c;然后登录进去把ip改成…

vue想要突破全局样式限制又不影响别的页面样式怎么办

<!-- 用scope盖不住全局&#xff0c;随意来个class匹配私定&#xff0c;搜索关键词&#xff1a;不要随便改&#xff0c;乱打class名 --> <style> .lkajsdfjkalsfhkljashkflhaskl .el-input.el-input--default.el-input--suffix { width: 160px !important; } …

cJSON(API的详细使用教程)

我们今天来学习一般嵌入式的必备库&#xff0c;JSON库 1&#xff0c;json和cJSON 那什么是JSON什么是cJSON&#xff0c;他们之间有什么样的关联呢&#xff0c;让我们一起来探究一下吧。 JSON&#xff08;JavaScript Object Notation&#xff09;是一种轻量级的数据交换格式&…

部署k8s客户端,及docker私仓部署

1.部署一个docker私仓 mkdir /opt/docker/registry #配置仓库密码 mkdir /opt/docker/auth cd /opt/docker/auth htpasswd -Bbn admin admin > htpasswd#运行docker私仓服务&#xff0c;下面端口5000:5000 前面的5000对应本机端口可以自定义 docker run -itd \ -v /opt/d…

LeetCode-33. 搜索旋转排序数组【数组 二分查找】

LeetCode-33. 搜索旋转排序数组【数组 二分查找】 题目描述&#xff1a;解题思路一&#xff1a;二分查找。1.找哨兵节点&#xff08;nums[0]或nums[-1]&#xff09;可以确定nums[mid]位于前一段或后一段有序数组中。2. 就是边界left和right的变换&#xff0c;具体看代码。解题思…

第十二届蓝桥杯大赛软件赛省赛C/C++大学B组

第十二届蓝桥杯大赛软件赛省赛C/C 大学 B 组 文章目录 第十二届蓝桥杯大赛软件赛省赛C/C 大学 B 组1、空间2、卡片3、直线4、货物摆放5、路径6、时间显示7、砝码称重8、杨辉三角形9、双向排序10、括号序列 1、空间 1MB 1024KB 1KB 1024byte 1byte8bit // cout<<"2…

Java设计模式:桥接模式实现灵活组合,超越单一继承的设计之道(十)

码到三十五 &#xff1a; 个人主页 心中有诗画&#xff0c;指尖舞代码&#xff0c;目光览世界&#xff0c;步履越千山&#xff0c;人间尽值得 ! 目录 一、引言二、什么是桥接设计模式三、桥接设计模式的核心思想四、桥接设计模式的角色五、桥接设计模式的工作流程和实现实现方…

【JAVASE】带你了解instanceof和equals的魅力

✅作者简介&#xff1a;大家好&#xff0c;我是橘橙黄又青&#xff0c;一个想要与大家共同进步的男人&#x1f609;&#x1f609; &#x1f34e;个人主页&#xff1a;再无B&#xff5e;U&#xff5e;G-CSDN博客 1.instanceof instanceof 是 Java 的保留关键字。它的作用是测试…

MySQL复制拓扑1

文章目录 主要内容一.安装MySQL服务器1.MySQL 安装程序和其它文件保存在下发的 mysql8-files.iso 镜像文件中&#xff0c;可以使用虚拟光驱来提取到 Linux 文件系统。代码如下&#xff08;示例&#xff09;: 2.将 MySQL8.0 程序解压到 /opt 目录&#xff0c;再创建到 MySQL 默认…

NIUSHOP完美运营版商城 虚拟商品全功能商城 全能商城小程序 智慧商城系统 全品类百货商城

完美运营版商城/拼团/团购/秒杀/积分/砍价/实物商品/虚拟商品等全功能商城 干干净净 没有一丝多余收据 还没过手其他站 还没乱七八走的广告和后门 后台可以自由拖曳修改前端UI页面 还支持虚拟商品自动发货等功能 挺不错的一套源码 前端UNIAPP 后端PHP 一键部署版本 源码免费…

自然语言处理NLP概述

大家好&#xff0c;自然语言处理(NLP)是计算机科学领域与人工智能领域中的一个重要方向&#xff0c;其研究能实现人与计算机之间用自然语言进行有效通信的各种理论和方法。本文将从自然语言处理的本质、原理和应用三个方面&#xff0c;对其进行概述。 一、NLP的本质 NLP是一种…

【数据结构与算法】力扣 19. 删除链表的倒数第 N 个结点

题目描述 给你一个链表&#xff0c;删除链表的倒数第 n 个结点&#xff0c;并且返回链表的头结点。 示例 1&#xff1a; 输入&#xff1a; head [1,2,3,4,5], n 2 输出&#xff1a; [1,2,3,5]示例 2&#xff1a; 输入&#xff1a; head [1], n 1 输出&#xff1a; []示例…

【算法】两数之和(暴力求解+哈希表)

本题来源---《两数之和》。 题目描述 给定一个整数数组 nums 和一个整数目标值 target&#xff0c;请你在该数组中找出 和为目标值 target 的那 两个 整数&#xff0c;并返回它们的数组下标。 你可以假设每种输入只会对应一个答案。但是&#xff0c;数组中同一个元素在答案里…

一种遥感影像多类变化检测方法

多任务学习孪生网络的遥感影像多类变化检测 马惠1, 刘波2, 杜世宏2 1.河南省国土空间调查规划院,郑州 450016 2.北京大学遥感与地理信息系统研究所,北京 100871 摘要: 精确掌握土地覆盖/利用的变化及变化类型对国土空间规划、生态环境监测、灾害评估等有着重要意义,然而现有…

【Unity每日一记】如何让Sprite精灵图集的背景图层变成透明,方便切割

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;元宇宙-秩沅 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 秩沅 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a;uni…

微信小程序上传到gitee

共三步 1、新建gitee仓库 点号&#xff0c;新建仓库&#xff0c;填入仓库信息新建即可 2、修改版本管理参数 微信开发者工具中点开版本管理&#xff0c;未初始化&#xff0c;需要先点初始化 接下来将设置中的通用、网络认证、远程3个部分的参数填写好 通用&#xff1a;核对…

前端零基础学习web3开发

目录 1 钱包 2 发起交易 3 出块 4 块高 5 矿工 6 Gas费 这一节&#xff0c;我们不说让人神往的比特币&#xff0c;不说自己会不会利用这个虚拟的货币来发财&#xff0c;也不说那些模模糊糊的知识&#xff0c;什么去中心化啦&#xff0c;什么奇妙的加密啦&#xff0c;我们…