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

2024-04-07 19:36

本文主要是介绍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

这篇关于Python实现【坦克大战】+源码分享的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/883478

相关文章

C++对象布局及多态实现探索之内存布局(整理的很多链接)

本文通过观察对象的内存布局,跟踪函数调用的汇编代码。分析了C++对象内存的布局情况,虚函数的执行方式,以及虚继承,等等 文章链接:http://dev.yesky.com/254/2191254.shtml      论C/C++函数间动态内存的传递 (2005-07-30)   当你涉及到C/C++的核心编程的时候,你会无止境地与内存管理打交道。 文章链接:http://dev.yesky

[职场] 护理专业简历怎么写 #经验分享#微信

护理专业简历怎么写   很多想成为一名护理方面的从业者,但是又不知道应该怎么制作一份简历,现在这里分享了一份护理方面的简历模板供大家参考。   蓝山山   年龄:24   号码:12345678910   地址:上海市 邮箱:jianli@jianli.com   教育背景   时间:2011-09到2015-06   学校:蓝山大学   专业:护理学   学历:本科

大学湖北中医药大学法医学试题及答案,分享几个实用搜题和学习工具 #微信#学习方法#职场发展

今天分享拥有拍照搜题、文字搜题、语音搜题、多重搜题等搜题模式,可以快速查找问题解析,加深对题目答案的理解。 1.快练题 这是一个网站 找题的网站海量题库,在线搜题,快速刷题~为您提供百万优质题库,直接搜索题库名称,支持多种刷题模式:顺序练习、语音听题、本地搜题、顺序阅读、模拟考试、组卷考试、赶快下载吧! 2.彩虹搜题 这是个老公众号了 支持手写输入,截图搜题,详细步骤,解题必备

[职场] 公务员的利弊分析 #知识分享#经验分享#其他

公务员的利弊分析     公务员作为一种稳定的职业选择,一直备受人们的关注。然而,就像任何其他职业一样,公务员职位也有其利与弊。本文将对公务员的利弊进行分析,帮助读者更好地了解这一职业的特点。 利: 1. 稳定的职业:公务员职位通常具有较高的稳定性,一旦进入公务员队伍,往往可以享受到稳定的工作环境和薪资待遇。这对于那些追求稳定的人来说,是一个很大的优势。 2. 薪资福利优厚:公务员的薪资和

通过SSH隧道实现通过远程服务器上外网

搭建隧道 autossh -M 0 -f -D 1080 -C -N user1@remotehost##验证隧道是否生效,查看1080端口是否启动netstat -tuln | grep 1080## 测试ssh 隧道是否生效curl -x socks5h://127.0.0.1:1080 -I http://www.github.com 将autossh 设置为服务,隧道开机启动

Python 字符串占位

在Python中,可以使用字符串的格式化方法来实现字符串的占位。常见的方法有百分号操作符 % 以及 str.format() 方法 百分号操作符 % name = "张三"age = 20message = "我叫%s,今年%d岁。" % (name, age)print(message) # 我叫张三,今年20岁。 str.format() 方法 name = "张三"age

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测

时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测 目录 时序预测 | MATLAB实现LSTM时间序列未来多步预测-递归预测基本介绍程序设计参考资料 基本介绍 MATLAB实现LSTM时间序列未来多步预测-递归预测。LSTM是一种含有LSTM区块(blocks)或其他的一种类神经网络,文献或其他资料中LSTM区块可能被描述成智能网络单元,因为

vue项目集成CanvasEditor实现Word在线编辑器

CanvasEditor实现Word在线编辑器 官网文档:https://hufe.club/canvas-editor-docs/guide/schema.html 源码地址:https://github.com/Hufe921/canvas-editor 前提声明: 由于CanvasEditor目前不支持vue、react 等框架开箱即用版,所以需要我们去Git下载源码,拿到其中两个主

android一键分享功能部分实现

为什么叫做部分实现呢,其实是我只实现一部分的分享。如新浪微博,那还有没去实现的是微信分享。还有一部分奇怪的问题:我QQ分享跟QQ空间的分享功能,我都没配置key那些都是原本集成就有的key也可以实现分享,谁清楚的麻烦详解下。 实现分享功能我们可以去www.mob.com这个网站集成。免费的,而且还有短信验证功能。等这分享研究完后就研究下短信验证功能。 开始实现步骤(新浪分享,以下是本人自己实现

springboot家政服务管理平台 LW +PPT+源码+讲解

3系统的可行性研究及需求分析 3.1可行性研究 3.1.1技术可行性分析 经过大学四年的学习,已经掌握了JAVA、Mysql数据库等方面的编程技巧和方法,对于这些技术该有的软硬件配置也是齐全的,能够满足开发的需要。 本家政服务管理平台采用的是Mysql作为数据库,可以绝对地保证用户数据的安全;可以与Mysql数据库进行无缝连接。 所以,家政服务管理平台在技术上是可以实施的。 3.1