【Python实现坦克大战,带你找回童年的快乐】附源码

2024-02-23 11:40

本文主要是介绍【Python实现坦克大战,带你找回童年的快乐】附源码,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

    • 前言:
    • 第一步:安装Pygame库
    • 第二步:实现思路:
      • 场景实现:
      • 石头墙:
      • 钢墙:
      • 地面类(Grass)
      • 地图:
    • 第三步:坦克类的详细实现:
      • 坦克类(Tank)
      • 子弹类(Bullet)
      • 爆炸类(Explosion)
    • 坦克类详细代码以及实现:
    • 完整代码压缩包:
    • 最终成功展示:

在这里插入图片描述

前言:

坦克大战90版本是一款2D射击游戏,玩家扮演一辆坦克,通过操纵坦克进行战斗。游戏场景通常是由迷宫状的地图构成,在地图中有各种不同类型的障碍物,如墙壁、水域、草地等,这些障碍物会对玩家的行动和战斗产生影响。

玩家的目标是摧毁敌方坦克并保护自己的基地。游戏中会有敌方坦克和敌方基地,玩家需要躲避敌方坦克的攻击并利用自己的技巧和策略来摧毁敌方坦克和基地。同时,玩家还可以尝试收集道具,如增强装甲、提高射速等,以增加自己的战斗能力。

这款游戏具有简单直观的操作方式,通过方向键控制坦克移动,空格键发射子弹。游戏节奏紧凑,战斗刺激,让玩家体验到了紧张的战争氛围。此外,游戏还支持多人模式,玩家可以与朋友一起组队或对战,增加了游戏的趣味性和竞争性。

坦克大战90版本不仅在当时取得了巨大成功,在后来的几十年里也不断被翻新和改进,衍生出了更多精彩的版本和新的玩法。无论是当年的经典版还是现代的重制版,坦克大战都是一款具有吸引力和娱乐性的经典游戏,让玩家流连忘返。

第一步:安装Pygame库

确保你已经安装了Python:在安装Pygame之前,确保你已经安装了Python。你可以从官方网站下载Python的最新版本并进行安装。Pygame兼容Python 2.x和Python 3.x版本。

打开终端:在Windows操作系统中,你可以按下Win+R键,在运行窗口中输入"cmd"并按下回车键打开命令提示符。在macOS和Linux系统中,你可以打开终端应用程序。

使用pip安装Pygame:在终端中输入以下命令来使用pip包管理器安装Pygame库:

pip install pygame

如果你使用的是Python 3,则使用以下命令:

pip3 install pygame

等待安装完成:一旦执行了安装命令,pip将会自动下载和安装Pygame库及其依赖项。这个过程可能需要一些时间,取决于你的网络速度和系统环境。

验证安装:安装完成后,你可以通过在终端中输入以下命令来验证Pygame是否成功安装:

python -m pygame.examples.aliens

或者

python3 -m pygame.examples.aliens

如果一切顺利,你将会看到一个外星人射击游戏的窗口弹出。

在这里插入图片描述

第二步:实现思路:

场景实现:

游戏场景,场景的组成主要包括:石头墙、钢墙、地面、坦克、子弹地图。

石头墙:

石头墙是一种阻挡玩家和敌人行进路径的障碍物。可以使用矩形或图片来表示石头墙,并将其绘制在游戏界面的指定位置上。

# 石头墙
class Brick(pygame.sprite.Sprite):def __init__(self, position):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load('images/scene/brick.png').convert_alpha()self.rect = self.image.get_rect()self.rect.topleft = positionself.is_destroyed = Falsedef destroy(self):self.is_destroyed = Truedef draw(self, surface):if not self.is_destroyed:surface.blit(self.image, self.rect)position 参数:用于指定石头墙在游戏界面上的位置。
is_destroyed 属性:用于标记石头墙是否被摧毁。
destroy() 方法:用于将石头墙标记为被摧毁。
draw() 方法:用于将石头墙绘制在游戏界面上。

钢墙:

钢墙是一种更坚固的墙体,通常比石头墙更难被破坏。与石头墙类似,可以使用矩形或图片来表示钢墙,并将其绘制在游戏界面上。

# 钢墙
class Iron(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)self.iron = pygame.image.load('images/scene/iron.png')self.rect = self.iron.get_rect()self.being = False

地面类(Grass)

草地是游戏中的一种地形,玩家可以在草地上自由行动。以下是一个简单的草地类定义:

import pygameclass Grass(pygame.sprite.Sprite):def __init__(self, x, y, width=32, height=32):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load('images/grass.gif').convert_alpha()self.rect = self.image.get_rect()self.rect.left, self.rect.top = x, yself.width, self.height = width, heightdef draw(self, surface):surface.blit(self.image, self.rect)

在这个示例中,我们定义了一个 Grass 类,用于表示游戏中的草地。x 和 y 参数用于指定草地的位置,width 和 height 参数用于指定草地的宽度和高度。

draw() 方法用于将草地绘制在游戏界面上。

地图:

地图:地图是一个整体的场景,它包含了所有的游戏元素,并定义了玩家和敌人的移动范围。地图可以通过一个矩阵或类似的数据结构来表示,其中不同的值代表不同的场景元素(如石头墙、钢墙、地板等)。根据地图的定义,可以将相应的场景元素绘制在游戏界面上。

# 地图
class Map():def __init__(self, stage):self.brickGroup = pygame.sprite.Group()self.ironGroup  = pygame.sprite.Group()self.iceGroup = pygame.sprite.Group()self.riverGroup = pygame.sprite.Group()self.treeGroup = pygame.sprite.Group()if stage == 1:self.stage1()elif stage == 2:self.stage2()# 关卡def stage1(self):for x in [2, 3, 6, 7, 18, 19, 22, 23]:for y in [2, 3, 4, 5, 6, 7, 8, 9, 10, 17, 18, 19, 20, 21, 22, 23]:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brick.being = Trueself.brickGroup.add(self.brick)for x in [10, 11, 14, 15]:for y in [2, 3, 4, 5, 6, 7, 8, 11, 12, 15, 16, 17, 18, 19, 20]:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brick.being = Trueself.brickGroup.add(self.brick)for x in [4, 5, 6, 7, 18, 19, 20, 21]:for y in [13, 14]:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brick.being = Trueself.brickGroup.add(self.brick)for x in [12, 13]:for y in [16, 17]:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brick.being = Trueself.brickGroup.add(self.brick)for x, y in [(11, 23), (12, 23), (13, 23), (14, 23), (11, 24), (14, 24), (11, 25), (14, 25)]:self.brick = Brick()self.brick.rect.left, self.brick.rect.top = 3 + x * 24, 3 + y * 24self.brick.being = Trueself.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.iron.being = Trueself.ironGroup.add(self.iron)

第三步:坦克类的详细实现:

坦克类(Tank)

坦克是游戏中最主要的角色之一,玩家可以操控它来击败敌人。以下是一个简单的坦克类定义:

import pygameclass Tank(pygame.sprite.Sprite):def __init__(self, x, y, speed=5):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load('images/tank/player1.png').convert_alpha()self.rect = self.image.get_rect()self.rect.left, self.rect.top = x, yself.speed = speedself.direction = 'up'self.is_alive = Truedef move(self):if self.direction == 'up':self.rect.top -= self.speedelif self.direction == 'down':self.rect.top += self.speedelif self.direction == 'left':self.rect.left -= self.speedelif self.direction == 'right':self.rect.left += self.speeddef draw(self, surface):surface.blit(self.image, self.rect)

在这个示例中,我们定义了一个 Tank 类,用于表示游戏中的坦克。x 和 y 参数用于指定坦克的初始位置,speed 参数用于指定坦克的移动速度。direction 属性表示坦克当前的朝向,is_alive 属性表示坦克是否存活。

move() 方法用于根据坦克的当前朝向,改变坦克的位置。draw() 方法用于将坦克绘制在游戏界面上。

子弹类(Bullet)

子弹是坦克和敌人所使用的武器。
子弹的主要属性包括:方向、速度、是否存活、是否为加强版等,代码实现如下:

# 子弹类
class Bullet(pygame.sprite.Sprite):def __init__(self):pygame.sprite.Sprite.__init__(self)# 子弹四个方向(上下左右)self.bullets = ['images/bullet/bullet_up.png', 'images/bullet/bullet_down.png', 'images/bullet/bullet_left.png', 'images/bullet/bullet_right.png']# 子弹方向(默认向上)self.direction_x, self.direction_y = 0, -1self.bullet = pygame.image.load(self.bullets[0])self.rect = self.bullet.get_rect()# 在坦克类中再赋实际值self.rect.left, self.rect.right = 0, 0# 速度self.speed = 6# 是否存活self.being = False# 是否为加强版子弹(可碎钢板)self.stronger = False# 改变子弹方向def turn(self, direction_x, direction_y):self.direction_x, self.direction_y = direction_x, direction_yif self.direction_x == 0 and self.direction_y == -1:self.bullet = pygame.image.load(self.bullets[0])elif self.direction_x == 0 and self.direction_y == 1:self.bullet = pygame.image.load(self.bullets[1])elif self.direction_x == -1 and self.direction_y == 0:self.bullet = pygame.image.load(self.bullets[2])elif self.direction_x == 1 and self.direction_y == 0:self.bullet = pygame.image.load(self.bullets[3])else:raise ValueError('Bullet class -> direction value error.')# 移动def move(self):self.rect = self.rect.move(self.speed*self.direction_x, self.speed*self.direction_y)# 到地图边缘后消失if (self.rect.top < 3) or (self.rect.bottom > 630 - 3) or (self.rect.left < 3) or (self.rect.right > 630 - 3):self.being = False

爆炸类(Explosion)

爆炸是游戏中的一种特效,当坦克被击中或者墙壁被摧毁时会产生爆炸效果。以下是一个简单的爆炸类定义:

import pygameclass Explosion(pygame.sprite.Sprite):def __init__(self, x, y):pygame.sprite.Sprite.__init__(self)self.image = pygame.image.load('images/explosion.png').convert_alpha()self.rect = self.image.get_rect()self.rect.centerx, self.rect.centery = x, yself.frame = 0self.last_update = pygame.time.get_ticks()self.frame_rate = 50def update(self):now = pygame.time.get_ticks()if now - self.last_update > self.frame_rate:self.frame += 1if self.frame == 6:self.kill()else:self.last_update = nowdef draw(self, surface):surface.blit(self.image, self.rect, pygame.Rect(self.frame * 64, 0, 64, 64))

在这个示例中,我们定义了一个 Explosion 类,用于表示游戏中的爆炸效果。x 和 y 参数用于指定爆炸的位置。

update() 方法用于更新爆炸动画的帧数。draw() 方法用于将当前帧的爆炸效果绘制在游戏界面上。

坦克类详细代码以及实现:

坦克包括我方坦克和敌方坦克,我方坦克由玩家自己控制移动、射击等操作,敌方坦克实现自动移动、射击等操作,代码实现如下:

# 我方坦克类
class myTank(pygame.sprite.Sprite):def __init__(self, player):pygame.sprite.Sprite.__init__(self)# 玩家编号(1/2)self.player = player# 不同玩家用不同的坦克(不同等级对应不同的图)if player == 1:self.tanks = ['images/myTank/tank_T1_0.png', 'images/myTank/tank_T1_1.png', 'images/myTank/tank_T1_2.png']elif player == 2:self.tanks = ['images/myTank/tank_T2_0.png', 'images/myTank/tank_T2_1.png', 'images/myTank/tank_T2_2.png']else:raise ValueError('myTank class -> player value error.')# 坦克等级(初始0)self.level = 0# 载入(两个tank是为了轮子特效)self.tank = pygame.image.load(self.tanks[self.level]).convert_alpha()self.tank_0 = self.tank.subsurface((0, 0), (48, 48))self.tank_1 = self.tank.subsurface((48, 0), (48, 48))self.rect = self.tank_0.get_rect()# 保护罩self.protected_mask = pygame.image.load('images/others/protect.png').convert_alpha()self.protected_mask1 = self.protected_mask.subsurface((0, 0), (48, 48))self.protected_mask2 = self.protected_mask.subsurface((48, 0), (48, 48))# 坦克方向self.direction_x, self.direction_y = 0, -1# 不同玩家的出生位置不同if player == 1:self.rect.left, self.rect.top = 3 + 24 * 8, 3 + 24 * 24elif player == 2:self.rect.left, self.rect.top = 3 + 24 * 16, 3 + 24 * 24else:raise ValueError('myTank class -> player value error.')# 坦克速度self.speed = 3# 是否存活self.being = True# 有几条命self.life = 3# 是否处于保护状态self.protected = False# 子弹self.bullet = Bullet()# 射击def shoot(self):self.bullet.being = Trueself.bullet.turn(self.direction_x, self.direction_y)if self.direction_x == 0 and self.direction_y == -1:self.bullet.rect.left = self.rect.left + 20self.bullet.rect.bottom = self.rect.top - 1elif self.direction_x == 0 and self.direction_y == 1:self.bullet.rect.left = self.rect.left + 20self.bullet.rect.top = self.rect.bottom + 1elif self.direction_x == -1 and self.direction_y == 0:self.bullet.rect.right = self.rect.left - 1self.bullet.rect.top = self.rect.top + 20elif self.direction_x == 1 and self.direction_y == 0:self.bullet.rect.left = self.rect.right + 1self.bullet.rect.top = self.rect.top + 20else:raise ValueError('myTank class -> direction value error.')if self.level == 0:self.bullet.speed = 8self.bullet.stronger = Falseelif self.level == 1:self.bullet.speed = 12self.bullet.stronger = Falseelif self.level == 2:self.bullet.speed = 12self.bullet.stronger = Trueelif self.level == 3:self.bullet.speed = 16self.bullet.stronger = Trueelse:raise ValueError('myTank class -> level value error.')# 等级提升def up_level(self):if self.level < 3:self.level += 1try:self.tank = pygame.image.load(self.tanks[self.level]).convert_alpha()except:self.tank = pygame.image.load(self.tanks[-1]).convert_alpha()# 等级降低def down_level(self):if self.level > 0:self.level -= 1self.tank = pygame.image.load(self.tanks[self.level]).convert_alpha()# 向上def move_up(self, tankGroup, brickGroup, ironGroup, myhome):self.direction_x, self.direction_y = 0, -1# 先移动后判断self.rect = self.rect.move(self.speed*self.direction_x, self.speed*self.direction_y)self.tank_0 = self.tank.subsurface((0, 0), (48, 48))self.tank_1 = self.tank.subsurface((48, 0), (48, 48))# 是否可以移动is_move = True# 地图顶端if self.rect.top < 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞石头/钢墙if pygame.sprite.spritecollide(self, brickGroup, False, None) or \pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞其他坦克if pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 大本营if pygame.sprite.collide_rect(self, myhome):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = Falsereturn is_move# 向下def move_down(self, tankGroup, brickGroup, ironGroup, myhome):self.direction_x, self.direction_y = 0, 1# 先移动后判断self.rect = self.rect.move(self.speed*self.direction_x, self.speed*self.direction_y)self.tank_0 = self.tank.subsurface((0, 48), (48, 48))self.tank_1 = self.tank.subsurface((48, 48), (48, 48))# 是否可以移动is_move = True# 地图底端if self.rect.bottom > 630 - 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞石头/钢墙if pygame.sprite.spritecollide(self, brickGroup, False, None) or \pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞其他坦克if pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 大本营if pygame.sprite.collide_rect(self, myhome):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = Falsereturn is_move# 向左def move_left(self, tankGroup, brickGroup, ironGroup, myhome):self.direction_x, self.direction_y = -1, 0# 先移动后判断self.rect = self.rect.move(self.speed*self.direction_x, self.speed*self.direction_y)self.tank_0 = self.tank.subsurface((0, 96), (48, 48))self.tank_1 = self.tank.subsurface((48, 96), (48, 48))# 是否可以移动is_move = True# 地图左端if self.rect.left < 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞石头/钢墙if pygame.sprite.spritecollide(self, brickGroup, False, None) or \pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞其他坦克if pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False  # 大本营if pygame.sprite.collide_rect(self, myhome):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = Falsereturn is_move# 向右def move_right(self, tankGroup, brickGroup, ironGroup, myhome):self.direction_x, self.direction_y = 1, 0# 先移动后判断self.rect = self.rect.move(self.speed*self.direction_x, self.speed*self.direction_y)self.tank_0 = self.tank.subsurface((0, 144), (48, 48))self.tank_1 = self.tank.subsurface((48, 144), (48, 48))# 是否可以移动is_move = True# 地图右端if self.rect.right > 630 - 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞石头/钢墙if pygame.sprite.spritecollide(self, brickGroup, False, None) or \pygame.sprite.spritecollide(self, ironGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 撞其他坦克if pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = False# 大本营if pygame.sprite.collide_rect(self, myhome):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)is_move = Falsereturn is_move# 死后重置def reset(self):self.level = 0self.protected = Falseself.tank = pygame.image.load(self.tanks[self.level]).convert_alpha()self.tank_0 = self.tank.subsurface((0, 0), (48, 48))self.tank_1 = self.tank.subsurface((48, 0), (48, 48))self.rect = self.tank_0.get_rect()self.direction_x, self.direction_y = 0, -1if self.player == 1:self.rect.left, self.rect.top = 3 + 24 * 8, 3 + 24 * 24elif self.player == 2:self.rect.left, self.rect.top = 3 + 24 * 16, 3 + 24 * 24else:raise ValueError('myTank class -> player value error.')self.speed = 3# 敌方坦克类
class enemyTank(pygame.sprite.Sprite):def __init__(self, x=None, kind=None, is_red=None):pygame.sprite.Sprite.__init__(self)# 用于给刚生成的坦克播放出生特效self.born = Trueself.times = 90# 坦克的种类编号if kind is None:self.kind = random.randint(0, 3)else:self.kind = kind# 所有坦克self.tanks1 = ['images/enemyTank/enemy_1_0.png', 'images/enemyTank/enemy_1_1.png', 'images/enemyTank/enemy_1_2.png', 'images/enemyTank/enemy_1_3.png']self.tanks2 = ['images/enemyTank/enemy_2_0.png', 'images/enemyTank/enemy_2_1.png', 'images/enemyTank/enemy_2_2.png', 'images/enemyTank/enemy_2_3.png']self.tanks3 = ['images/enemyTank/enemy_3_0.png', 'images/enemyTank/enemy_3_1.png', 'images/enemyTank/enemy_3_2.png', 'images/enemyTank/enemy_3_3.png']self.tanks4 = ['images/enemyTank/enemy_4_0.png', 'images/enemyTank/enemy_4_1.png', 'images/enemyTank/enemy_4_2.png', 'images/enemyTank/enemy_4_3.png']self.tanks = [self.tanks1, self.tanks2, self.tanks3, self.tanks4]# 是否携带食物(红色的坦克携带食物)if is_red is None:self.is_red = random.choice((True, False, False, False, False))else:self.is_red = is_red# 同一种类的坦克具有不同的颜色, 红色的坦克比同类坦克多一点血量if self.is_red:self.color = 3else:self.color = random.randint(0, 2)# 血量self.blood = self.color# 载入(两个tank是为了轮子特效)self.tank = pygame.image.load(self.tanks[self.kind][self.color]).convert_alpha()self.tank_0 = self.tank.subsurface((0, 48), (48, 48))self.tank_1 = self.tank.subsurface((48, 48), (48, 48))self.rect = self.tank_0.get_rect()# 坦克位置if x is None:self.x = random.randint(0, 2)else:self.x = xself.rect.left, self.rect.top = 3 + self.x * 12 * 24, 3# 坦克是否可以行动self.can_move = True# 坦克速度self.speed = max(3 - self.kind, 1)# 方向self.direction_x, self.direction_y = 0, 1# 是否存活self.being = True# 子弹self.bullet = Bullet()# 射击def shoot(self):self.bullet.being = Trueself.bullet.turn(self.direction_x, self.direction_y)if self.direction_x == 0 and self.direction_y == -1:self.bullet.rect.left = self.rect.left + 20self.bullet.rect.bottom = self.rect.top - 1elif self.direction_x == 0 and self.direction_y == 1:self.bullet.rect.left = self.rect.left + 20self.bullet.rect.top = self.rect.bottom + 1elif self.direction_x == -1 and self.direction_y == 0:self.bullet.rect.right = self.rect.left - 1self.bullet.rect.top = self.rect.top + 20elif self.direction_x == 1 and self.direction_y == 0:self.bullet.rect.left = self.rect.right + 1self.bullet.rect.top = self.rect.top + 20else:raise ValueError('enemyTank class -> direction value error.')# 随机移动def move(self, tankGroup, brickGroup, ironGroup, myhome):self.rect = self.rect.move(self.speed*self.direction_x, self.speed*self.direction_y)is_move = Trueif self.direction_x == 0 and self.direction_y == -1:self.tank_0 = self.tank.subsurface((0, 0), (48, 48))self.tank_1 = self.tank.subsurface((48, 0), (48, 48))if self.rect.top < 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)self.direction_x, self.direction_y = random.choice(([0, 1], [0, -1], [1, 0], [-1, 0]))is_move = Falseelif self.direction_x == 0 and self.direction_y == 1:self.tank_0 = self.tank.subsurface((0, 48), (48, 48))self.tank_1 = self.tank.subsurface((48, 48), (48, 48))if self.rect.bottom > 630 - 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)self.direction_x, self.direction_y = random.choice(([0, 1], [0, -1], [1, 0], [-1, 0]))is_move = Falseelif self.direction_x == -1 and self.direction_y == 0:self.tank_0 = self.tank.subsurface((0, 96), (48, 48))self.tank_1 = self.tank.subsurface((48, 96), (48, 48))if self.rect.left < 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)self.direction_x, self.direction_y = random.choice(([0, 1], [0, -1], [1, 0], [-1, 0]))is_move = Falseelif self.direction_x == 1 and self.direction_y == 0:self.tank_0 = self.tank.subsurface((0, 144), (48, 48))self.tank_1 = self.tank.subsurface((48, 144), (48, 48))if self.rect.right > 630 - 3:self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)self.direction_x, self.direction_y = random.choice(([0, 1], [0, -1], [1, 0], [-1, 0]))is_move = Falseelse:raise ValueError('enemyTank class -> direction value error.')if pygame.sprite.spritecollide(self, brickGroup, False, None) \or pygame.sprite.spritecollide(self, ironGroup, False, None) \or pygame.sprite.spritecollide(self, tankGroup, False, None):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)self.direction_x, self.direction_y = random.choice(([0, 1], [0, -1], [1, 0], [-1, 0]))is_move = Falseif pygame.sprite.collide_rect(self, myhome):self.rect = self.rect.move(self.speed*-self.direction_x, self.speed*-self.direction_y)self.direction_x, self.direction_y = random.choice(([0, 1], [0, -1], [1, 0], [-1, 0]))is_move = Falsereturn is_move# 重新载入坦克def reload(self):self.tank = pygame.image.load(self.tanks[self.kind][self.color]).convert_alpha()self.tank_0 = self.tank.subsurface((0, 48), (48, 48))self.tank_1 = self.tank.subsurface((48, 48), (48, 48))

完整代码压缩包:

由于代码内容过多就不一一展示放在文章当中了,如需完整项目请私信…

最终成功展示:

在这里插入图片描述

在这里插入图片描述

这篇关于【Python实现坦克大战,带你找回童年的快乐】附源码的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

python: 多模块(.py)中全局变量的导入

文章目录 global关键字可变类型和不可变类型数据的内存地址单模块(单个py文件)的全局变量示例总结 多模块(多个py文件)的全局变量from x import x导入全局变量示例 import x导入全局变量示例 总结 global关键字 global 的作用范围是模块(.py)级别: 当你在一个模块(文件)中使用 global 声明变量时,这个变量只在该模块的全局命名空

hdu1043(八数码问题,广搜 + hash(实现状态压缩) )

利用康拓展开将一个排列映射成一个自然数,然后就变成了普通的广搜题。 #include<iostream>#include<algorithm>#include<string>#include<stack>#include<queue>#include<map>#include<stdio.h>#include<stdlib.h>#include<ctype.h>#inclu

JAVA智听未来一站式有声阅读平台听书系统小程序源码

智听未来,一站式有声阅读平台听书系统 🌟&nbsp;开篇:遇见未来,从“智听”开始 在这个快节奏的时代,你是否渴望在忙碌的间隙,找到一片属于自己的宁静角落?是否梦想着能随时随地,沉浸在知识的海洋,或是故事的奇幻世界里?今天,就让我带你一起探索“智听未来”——这一站式有声阅读平台听书系统,它正悄悄改变着我们的阅读方式,让未来触手可及! 📚&nbsp;第一站:海量资源,应有尽有 走进“智听

【C++】_list常用方法解析及模拟实现

相信自己的力量,只要对自己始终保持信心,尽自己最大努力去完成任何事,就算事情最终结果是失败了,努力了也不留遗憾。💓💓💓 目录   ✨说在前面 🍋知识点一:什么是list? •🌰1.list的定义 •🌰2.list的基本特性 •🌰3.常用接口介绍 🍋知识点二:list常用接口 •🌰1.默认成员函数 🔥构造函数(⭐) 🔥析构函数 •🌰2.list对象

【Prometheus】PromQL向量匹配实现不同标签的向量数据进行运算

✨✨ 欢迎大家来到景天科技苑✨✨ 🎈🎈 养成好习惯,先赞后看哦~🎈🎈 🏆 作者简介:景天科技苑 🏆《头衔》:大厂架构师,华为云开发者社区专家博主,阿里云开发者社区专家博主,CSDN全栈领域优质创作者,掘金优秀博主,51CTO博客专家等。 🏆《博客》:Python全栈,前后端开发,小程序开发,人工智能,js逆向,App逆向,网络系统安全,数据分析,Django,fastapi

让树莓派智能语音助手实现定时提醒功能

最初的时候是想直接在rasa 的chatbot上实现,因为rasa本身是带有remindschedule模块的。不过经过一番折腾后,忽然发现,chatbot上实现的定时,语音助手不一定会有响应。因为,我目前语音助手的代码设置了长时间无应答会结束对话,这样一来,chatbot定时提醒的触发就不会被语音助手获悉。那怎么让语音助手也具有定时提醒功能呢? 我最后选择的方法是用threading.Time

【Python编程】Linux创建虚拟环境并配置与notebook相连接

1.创建 使用 venv 创建虚拟环境。例如,在当前目录下创建一个名为 myenv 的虚拟环境: python3 -m venv myenv 2.激活 激活虚拟环境使其成为当前终端会话的活动环境。运行: source myenv/bin/activate 3.与notebook连接 在虚拟环境中,使用 pip 安装 Jupyter 和 ipykernel: pip instal

Android实现任意版本设置默认的锁屏壁纸和桌面壁纸(两张壁纸可不一致)

客户有些需求需要设置默认壁纸和锁屏壁纸  在默认情况下 这两个壁纸是相同的  如果需要默认的锁屏壁纸和桌面壁纸不一样 需要额外修改 Android13实现 替换默认桌面壁纸: 将图片文件替换frameworks/base/core/res/res/drawable-nodpi/default_wallpaper.*  (注意不能是bmp格式) 替换默认锁屏壁纸: 将图片资源放入vendo

C#实战|大乐透选号器[6]:实现实时显示已选择的红蓝球数量

哈喽,你好啊,我是雷工。 关于大乐透选号器在前面已经记录了5篇笔记,这是第6篇; 接下来实现实时显示当前选中红球数量,蓝球数量; 以下为练习笔记。 01 效果演示 当选择和取消选择红球或蓝球时,在对应的位置显示实时已选择的红球、蓝球的数量; 02 标签名称 分别设置Label标签名称为:lblRedCount、lblBlueCount

【机器学习】高斯过程的基本概念和应用领域以及在python中的实例

引言 高斯过程(Gaussian Process,简称GP)是一种概率模型,用于描述一组随机变量的联合概率分布,其中任何一个有限维度的子集都具有高斯分布 文章目录 引言一、高斯过程1.1 基本定义1.1.1 随机过程1.1.2 高斯分布 1.2 高斯过程的特性1.2.1 联合高斯性1.2.2 均值函数1.2.3 协方差函数(或核函数) 1.3 核函数1.4 高斯过程回归(Gauss