python实现坦克大战

本文实例为大家分享了python实现坦克大战的具体代码,供大家参考,具体内容如下

本游戏制作代码量较大

具体代码与图片声源可以在我的GitHub中下载

github地址

下面来看看然后利用python做一个坦克大战游戏

创建子弹类

import pygame

class Bullet(pygame.sprite.Sprite):

def __init__(self):

pygame.sprite.Sprite.__init__(self)

self.bullet_up = pygame.image.load(r"..\image\bullet_up.png")

self.bullet_down = pygame.image.load(r"..\image\bullet_down.png")

self.bullet_left = pygame.image.load(r"..\image\bullet_left.png")

self.bullet_right = pygame.image.load(r"..\image\bullet_right.png")

# 子弹方向 速度 生命 碎石

self.dir_x, self.dir_y = 0, 0

self.speed = 6

self.life = False

self.span = False

self.bullet = self.bullet_up

self.rect = self.bullet.get_rect()

self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24

def changeImage(self, dir_x, dir_y):

self.dir_x, self.dir_y = dir_x, dir_y

if self.dir_x == 0 and self.dir_y == -1:

self.bullet = self.bullet_up

elif self.dir_x == 0 and self.dir_y == 1:

self.bullet = self.bullet_down

elif self.dir_x == -1 and self.dir_y == 0:

self.bullet = self.bullet_left

elif self.dir_x == 1 and self.dir_y == 0:

self.bullet = self.bullet_right

def move(self):

self.rect = self.rect.move(self.speed * self.dir_x,

self.speed * self.dir_y)

# 碰撞地图边缘

if self.rect.top < 3:

self.life = False

# self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24

if self.rect.bottom > 630 - 3:

self.life = False

# self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24

if self.rect.left < 3:

self.life = False

# self.rect.left, self.rect.right = 3 + 12 * 24, 3 + 24 * 24

if self.rect.right > 630 - 3:

self.life = False

创建敌军坦克

import pygame

import random

import bulletClass

class EnemyTank(pygame.sprite.Sprite):

def __init__(self, x = None, kind = None, isred = None):

pygame.sprite.Sprite.__init__(self)

# 坦克出现前动画是否播放

self.flash = False

self.times = 90

# 参数:坦克种类

self.kind = kind

if not kind:

self.kind = random.choice([1, 2, 3, 4])

# 选择敌军坦克种类

if self.kind == 1:

self.enemy_x_0 = pygame.image.load(r"..\image\enemy_1_0.png").convert_alpha()

self.enemy_x_3 = pygame.image.load(r"..\image\enemy_1_3.png").convert_alpha()

if self.kind == 2:

self.enemy_x_0 = pygame.image.load(r"..\image\enemy_2_0.png").convert_alpha()

self.enemy_x_3 = pygame.image.load(r"..\image\enemy_2_3.png").convert_alpha()

if self.kind == 3:

self.enemy_x_0 = pygame.image.load(r"..\image\enemy_3_1.png").convert_alpha()

self.enemy_x_3 = pygame.image.load(r"..\image\enemy_3_0.png").convert_alpha()

if self.kind == 4:

self.enemy_x_0 = pygame.image.load(r"..\image\enemy_4_0.png").convert_alpha()

self.enemy_x_3 = pygame.image.load(r"..\image\enemy_4_3.png").convert_alpha()

self.enemy_3_0 = pygame.image.load(r"..\image\enemy_3_0.png").convert_alpha()

self.enemy_3_2 = pygame.image.load(r"..\image\enemy_3_2.png").convert_alpha()

# 参数:是否携带食物

self.isred = isred

if not None:

self.isred = random.choice((True, False, False, False, False))

if self.isred:

self.tank = self.enemy_x_3

else:

self.tank = self.enemy_x_0

# 参数:坦克位置

self.x = x

if not self.x:

self.x = random.choice([1, 2, 3])

self.x -= 1

# 运动中的两种图片

self.tank_R0 = self.tank.subsurface(( 0, 48), (48, 48))

self.tank_R1 = self.tank.subsurface((48, 48), (48, 48))

self.rect = self.tank_R0.get_rect()

self.rect.left, self.rect.top = 3 + self.x * 12 * 24, 3 + 0 * 24

# 坦克速度 方向 生命 子弹生命 子弹延迟

self.speed = 1

self.dir_x, self.dir_y = 0, 1

self.life = 1

self.bulletNotCooling = True

self.bullet = bulletClass.Bullet()

# 是否撞墙,撞墙则改变方向

self.dirChange = False

# 每种坦克不同的属性

if self.kind == 2:

self.speed = 3

if self.kind == 3:

self.life = 3

def shoot(self):

# 赋予子弹生命

self.bullet.life = True

self.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 + 20

self.bullet.rect.bottom = self.rect.top + 1

elif self.dir_x == 0 and self.dir_y == 1:

self.bullet.rect.left = self.rect.left + 20

self.bullet.rect.top = self.rect.bottom - 1

elif self.dir_x == -1 and self.dir_y == 0:

self.bullet.rect.right = self.rect.left - 1

self.bullet.rect.top = self.rect.top + 20

elif self.dir_x == 1 and self.dir_y == 0:

self.bullet.rect.left = self.rect.right + 1

self.bullet.rect.top = self.rect.top + 20

def move(self, tankGroup, brickGroup, ironGroup):

self.rect = self.rect.move(self.speed * self.dir_x, self.speed * self.dir_y)

if self.dir_x == 0 and self.dir_y == -1:

self.tank_R0 = self.tank.subsurface(( 0, 0),(48, 48))

self.tank_R1 = self.tank.subsurface((48, 0),(48, 48))

elif self.dir_x == 0 and self.dir_y == 1:

self.tank_R0 = self.tank.subsurface(( 0, 48),(48, 48))

self.tank_R1 = self.tank.subsurface((48, 48),(48, 48))

elif self.dir_x == -1 and self.dir_y == 0:

self.tank_R0 = self.tank.subsurface(( 0, 96),(48, 48))

self.tank_R1 = self.tank.subsurface((48, 96),(48, 48))

elif self.dir_x == 1 and self.dir_y == 0:

self.tank_R0 = self.tank.subsurface(( 0, 144),(48, 48))

self.tank_R1 = self.tank.subsurface((48, 144),(48, 48))

# 碰撞地图边缘

if self.rect.top < 3:

self.rect = self.rect.move(self.speed * 0, self.speed * 1)

self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))

elif self.rect.bottom > 630 - 3:

self.rect = self.rect.move(self.speed * 0, self.speed * -1)

self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))

elif self.rect.left < 3:

self.rect = self.rect.move(self.speed * 1, self.speed * 0)

self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))

elif self.rect.right > 630 - 3:

self.rect = self.rect.move(self.speed * -1, self.speed * 0)

self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))

# 碰撞墙体 和坦克

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.dir_x, self.speed * -self.dir_y)

self.dir_x, self.dir_y = random.choice(([0,1],[0,-1],[1,0],[-1,0]))

创建食物类

import pygame

import random

class Food(pygame.sprite.Sprite):

def __init__(self):

self.food_boom = pygame.image.load(r"..\image\food_boom.png").convert_alpha()

self.food_clock = pygame.image.load(r"..\image\food_clock.png").convert_alpha()

self.food_gun = pygame.image.load(r"..\image\food_gun.png").convert_alpha()

self.food_iron = pygame.image.load(r"..\image\food_iron.png").convert_alpha()

self.food_protect = pygame.image.load(r"..\image\food_protect.png").convert_alpha()

self.food_star = pygame.image.load(r"..\image\food_star.png").convert_alpha()

self.food_tank = pygame.image.load(r"..\image\food_tank.png").convert_alpha()

self.kind = random.choice([1, 2, 3, 4, 5, 6, 7])

if self.kind == 1:

self.image = self.food_boom

elif self.kind == 2:

self.image = self.food_clock

elif self.kind == 3:

self.image = self.food_gun

elif self.kind == 4:

self.image = self.food_iron

elif self.kind == 5:

self.image = self.food_protect

elif self.kind == 6:

self.image = self.food_star

elif self.kind == 7:

self.image = self.food_tank

self.rect = self.image.get_rect()

self.rect.left = self.rect.top = random.randint(100, 500)

self.life = False

def change(self):

self.kind = random.choice([1, 2, 3, 4, 5, 6, 7])

if self.kind == 1:

self.image = self.food_boom

elif self.kind == 2:

self.image = self.food_clock

elif self.kind == 3:

self.image = self.food_gun

elif self.kind == 4:

self.image = self.food_iron

elif self.kind == 5:

self.image = self.food_protect

elif self.kind == 6:

self.image = self.food_star

elif self.kind == 7:

self.image = self.food_tank

self.rect.left = self.rect.top = random.randint(100, 500)

self.life = True

创建我的坦克

import pygame

import bulletClass

tank_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

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 = 3

self.dir_x, self.dir_y = 0, -1

self.life = 3

self.bulletNotCooling = True

self.bullet = bulletClass.Bullet()

#self.bullet.rect.left, self.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24

def shoot(self):

self.bullet.life = True

self.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 + 20

self.bullet.rect.bottom = self.rect.top + 1

elif self.dir_x == 0 and self.dir_y == 1:

self.bullet.rect.left = self.rect.left + 20

self.bullet.rect.top = self.rect.bottom - 1

elif self.dir_x == -1 and self.dir_y == 0:

self.bullet.rect.right = self.rect.left - 1

self.bullet.rect.top = self.rect.top + 20

elif self.dir_x == 1 and self.dir_y == 0:

self.bullet.rect.left = self.rect.right + 1

self.bullet.rect.top = self.rect.top + 20

if self.level == 1:

self.bullet.speed = 16

self.bullet.span = False

if self.level == 2:

self.bullet.speed = 16

self.bullet.span = True

if self.level == 3:

self.bullet.speed = 48

self.bullet.span = True

def levelUp(self):

if self.level < 2:

self.level += 1

if self.level == 0:

self.tank = self.tank_L0_image

if self.level == 1:

self.tank = self.tank_L1_image

if self.level == 2:

self.tank = self.tank_L2_image

if self.level == 3:

self.tank = self.tank_L2_image

def levelDown(self):

if self.level > 0:

self.level -= 1

if self.level == 0:

self.tank = self.tank_L0_image

self.bullet.speed = 6

self.bullet.span = False

if self.level == 1:

self.tank = self.tank_L1_image

if self.level == 2:

self.tank = self.tank_L2_image

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, -1

if self.rect.top < 3:

self.rect = self.rect.move(self.speed * 0, self.speed * 1)

return True

if 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 True

if pygame.sprite.spritecollide(self, tankGroup, False, None):

self.rect = self.rect.move(self.speed * 0, self.speed * 1)

return True

return False

def 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, 1

if self.rect.bottom > 630 - 3:

self.rect = self.rect.move(self.speed * 0, self.speed * -1)

return True

if 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 True

if pygame.sprite.spritecollide(self, tankGroup, False, None):

self.rect = self.rect.move(self.speed * 0, self.speed * -1)

return True

return False

def 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, 0

if self.rect.left < 3:

self.rect = self.rect.move(self.speed * 1, self.speed * 0)

return True

if 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 True

if pygame.sprite.spritecollide(self, tankGroup, False, None):

self.rect = self.rect.move(self.speed * 1, self.speed * 0)

return True

return False

def 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, 0

if self.rect.right > 630 - 3:

self.rect = self.rect.move(self.speed * -1, self.speed * 0)

return True

if 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 True

if pygame.sprite.spritecollide(self, tankGroup, False, None):

self.rect = self.rect.move(self.speed * -1, self.speed * 0)

return True

return False

创建墙体类

import pygame

brickImage = 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 * 24

self.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 * 24

self.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 * 24

self.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 * 24

self.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 * 24

self.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 * 24

self.ironGroup.add(self.iron)

主函数

# -*- coding: utf-8 -*-

import pygame

import sys

import traceback

import wall

import myTank

import enemyTank

import food

def main():

pygame.init()

pygame.mixer.init()

resolution = 630, 630

screen = 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)

continue

if enemy.kind == 3:

greenEnemyGroup.add(enemy)

continue

otherEnemyGroup.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)))

# 自定义事件

# 创建敌方坦克延迟200

DELAYEVENT = pygame.constants.USEREVENT

pygame.time.set_timer(DELAYEVENT, 200)

# 创建 敌方 子弹延迟1000

ENEMYBULLETNOTCOOLINGEVENT = pygame.constants.USEREVENT + 1

pygame.time.set_timer(ENEMYBULLETNOTCOOLINGEVENT, 1000)

# 创建 我方 子弹延迟200

MYBULLETNOTCOOLINGEVENT = pygame.constants.USEREVENT + 2

pygame.time.set_timer(MYBULLETNOTCOOLINGEVENT, 200)

# 敌方坦克 静止8000

NOTMOVEEVENT = pygame.constants.USEREVENT + 3

pygame.time.set_timer(NOTMOVEEVENT, 8000)

delay = 100

moving = 0

movdir = 0

moving2 = 0

movdir2 = 0

enemyNumber = 3

enemyCouldMove = True

switch_R1_R2_image = True

homeSurvive = True

running_T1 = True

running_T2 = True

clock = 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):

break

allEnemyGroup.add(enemy)

allTankGroup.add(enemy)

enemyNumber += 1

if 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 = 3

if event.key == pygame.K_2:

if myTank_T1.speed == 3:

myTank_T1.speed = 24

else:

myTank_T1.speed = 3

if 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 * 24

bgMap.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 * 24

bgMap.ironGroup.add(bgMap.iron)

# 检查用户的键盘操作

key_pressed = pygame.key.get_pressed()

# 玩家一的移动操作

if moving:

moving -= 1

if movdir == 0:

allTankGroup.remove(myTank_T1)

if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving += 1

allTankGroup.add(myTank_T1)

running_T1 = True

if movdir == 1:

allTankGroup.remove(myTank_T1)

if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving += 1

allTankGroup.add(myTank_T1)

running_T1 = True

if movdir == 2:

allTankGroup.remove(myTank_T1)

if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving += 1

allTankGroup.add(myTank_T1)

running_T1 = True

if movdir == 3:

allTankGroup.remove(myTank_T1)

if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving += 1

allTankGroup.add(myTank_T1)

running_T1 = True

if not moving:

if key_pressed[pygame.K_w]:

moving = 7

movdir = 0

running_T1 = True

allTankGroup.remove(myTank_T1)

if myTank_T1.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving = 0

allTankGroup.add(myTank_T1)

elif key_pressed[pygame.K_s]:

moving = 7

movdir = 1

running_T1 = True

allTankGroup.remove(myTank_T1)

if myTank_T1.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving = 0

allTankGroup.add(myTank_T1)

elif key_pressed[pygame.K_a]:

moving = 7

movdir = 2

running_T1 = True

allTankGroup.remove(myTank_T1)

if myTank_T1.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving = 0

allTankGroup.add(myTank_T1)

elif key_pressed[pygame.K_d]:

moving = 7

movdir = 3

running_T1 = True

allTankGroup.remove(myTank_T1)

if myTank_T1.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup):

moving = 0

allTankGroup.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 -= 1

if movdir2 == 0:

allTankGroup.remove(myTank_T2)

myTank_T2.moveUp(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

running_T2 = True

if movdir2 == 1:

allTankGroup.remove(myTank_T2)

myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

running_T2 = True

if movdir2 == 2:

allTankGroup.remove(myTank_T2)

myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

running_T2 = True

if movdir2 == 3:

allTankGroup.remove(myTank_T2)

myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

running_T2 = True

if 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 = 7

movdir2 = 0

running_T2 = True

elif key_pressed[pygame.K_DOWN]:

allTankGroup.remove(myTank_T2)

myTank_T2.moveDown(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

moving2 = 7

movdir2 = 1

running_T2 = True

elif key_pressed[pygame.K_LEFT]:

allTankGroup.remove(myTank_T2)

myTank_T2.moveLeft(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

moving2 = 7

movdir2 = 2

running_T2 = True

elif key_pressed[pygame.K_RIGHT]:

allTankGroup.remove(myTank_T2)

myTank_T2.moveRight(allTankGroup, bgMap.brickGroup, bgMap.ironGroup)

allTankGroup.add(myTank_T2)

moving2 = 7

movdir2 = 3

running_T2 = True

if 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)

# 画home

if homeSurvive:

screen.blit(home_image, (3 + 12 * 24, 3 + 24 * 24))

else:

screen.blit(home_destroyed_image, (3 + 12 * 24, 3 + 24 * 24))

# 画我方坦克1

if not (delay % 5):

switch_R1_R2_image = not switch_R1_R2_image

if switch_R1_R2_image and running_T1:

screen.blit(myTank_T1.tank_R0, (myTank_T1.rect.left, myTank_T1.rect.top))

running_T1 = False

else:

screen.blit(myTank_T1.tank_R1, (myTank_T1.rect.left, myTank_T1.rect.top))

# 画我方坦克2

if switch_R1_R2_image and running_T2:

screen.blit(myTank_T2.tank_R0, (myTank_T2.rect.left, myTank_T2.rect.top))

running_T2 = False

else:

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 -= 1

if 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

# 绘制我方子弹1

if 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 = False

each.life = False

pygame.sprite.spritecollide(myTank_T1.bullet, enemyBulletGroup, True, None)

# 子弹 碰撞 敌方坦克

if pygame.sprite.spritecollide(myTank_T1.bullet, redEnemyGroup, True, None):

prop.change()

bang_sound.play()

enemyNumber -= 1

myTank_T1.bullet.life = False

elif 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 -= 1

elif each.life == 2:

each.life -= 1

each.tank = each.enemy_3_0

elif each.life == 3:

each.life -= 1

each.tank = each.enemy_3_2

myTank_T1.bullet.life = False

elif pygame.sprite.spritecollide(myTank_T1.bullet, otherEnemyGroup, True, None):

bang_sound.play()

enemyNumber -= 1

myTank_T1.bullet.life = False

#if pygame.sprite.spritecollide(myTank_T1.bullet, allEnemyGroup, True, None):

# bang_sound.play()

# enemyNumber -= 1

# myTank_T1.bullet.life = False

# 子弹 碰撞 brickGroup

if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.brickGroup, True, None):

myTank_T1.bullet.life = False

myTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24

# 子弹 碰撞 brickGroup

if myTank_T1.bullet.span:

if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, True, None):

myTank_T1.bullet.life = False

myTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24

else:

if pygame.sprite.spritecollide(myTank_T1.bullet, bgMap.ironGroup, False, None):

myTank_T1.bullet.life = False

myTank_T1.bullet.rect.left, myTank_T1.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24

# 绘制我方子弹2

if 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 -= 1

myTank_T2.bullet.life = False

# 子弹 碰撞 brickGroup

if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.brickGroup, True, None):

myTank_T2.bullet.life = False

myTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24

# 子弹 碰撞 brickGroup

if myTank_T2.bullet.span:

if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, True, None):

myTank_T2.bullet.life = False

myTank_T2.bullet.rect.left, myTank_T2.bullet.rect.right = 3 + 12 * 24, 3 + 24 * 24

else:

if pygame.sprite.spritecollide(myTank_T2.bullet, bgMap.ironGroup, False, None):

myTank_T2.bullet.life = False

myTank_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 = False

moving = 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

# 子弹 碰撞 brickGroup

if pygame.sprite.spritecollide(each.bullet, bgMap.brickGroup, True, None):

each.bullet.life = False

# 子弹 碰撞 ironGroup

if each.bullet.span:

if pygame.sprite.spritecollide(each.bullet, bgMap.ironGroup, True, None):

each.bullet.life = False

else:

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 -= 1

prop.life = False

if prop.kind == 2: # 敌人静止

enemyCouldMove = False

prop.life = False

if prop.kind == 3: # 子弹增强

myTank_T1.bullet.span = True

prop.life = False

if 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 * 24

bgMap.ironGroup.add(bgMap.iron)

prop.life = False

if prop.kind == 5: # 坦克无敌

prop.life = False

pass

if prop.kind == 6: # 坦克升级

myTank_T1.levelUp()

prop.life = False

if prop.kind == 7: # 坦克生命+1

myTank_T1.life += 1

prop.life = False

# 延迟

delay -= 1

if not delay:

delay = 100

pygame.display.flip()

clock.tick(60)

if __name__ == "__main__":

try:

main()

except SystemExit:

pass

except:

traceback.print_exc()

pygame.quit()

input()

运行效果

可以按住上下左右方向键以及WSAD让坦克运动

按0和j可以发射子弹。

更多有趣的经典小游戏实现专题,分享给大家:

C++经典小游戏汇总

python经典小游戏汇总

python俄罗斯方块游戏集合

JavaScript经典游戏 玩不停

java经典小游戏汇总

javascript经典小游戏汇总

以上是 python实现坦克大战 的全部内容, 来源链接: utcz.com/z/344109.html

回到顶部