python 坦克大战游戏
时间: 2023-10-30 08:04:53 浏览: 35
Python 坦克大战游戏是一个非常经典的游戏,可以锻炼玩家的反应能力和策略思维。下面是一个简单的 Python 坦克大战游戏的示例代码,你可以根据自己的需求进行修改和完善。
```python
import pygame
import random
pygame.init()
# 游戏区域大小
game_width, game_height = 800, 600
# 创建游戏窗口
game_display = pygame.display.set_mode((game_width, game_height))
pygame.display.set_caption('坦克大战')
# 定义颜色
black = (0, 0, 0)
white = (255, 255, 255)
red = (200, 0, 0)
bright_red = (255, 0, 0)
green = (0, 200, 0)
bright_green = (0, 255, 0)
# 加载图片
tank_img = pygame.image.load('tank.png')
bullet_img = pygame.image.load('bullet.png')
enemy_tank_img = pygame.image.load('enemy_tank.png')
explosion_anim = ['./explosion1.png', './explosion2.png', './explosion3.png', './explosion4.png',
'./explosion5.png', './explosion6.png', './explosion7.png', './explosion8.png']
# 设置字体
font = pygame.font.SysFont(None, 25)
# 定义游戏物体类
class GameObject(pygame.sprite.Sprite):
def __init__(self, x, y, img):
pygame.sprite.Sprite.__init__(self)
self.image = img
self.rect = self.image.get_rect()
self.rect.x = x
self.rect.y = y
# 定义坦克类
class Tank(GameObject):
def __init__(self, x, y, img, speed=5):
GameObject.__init__(self, x, y, img)
self.speed = speed
self.direction = 'up'
self.health = 100
self.bullet_list = pygame.sprite.Group()
def move(self):
if self.direction == 'up':
self.rect.y -= self.speed
elif self.direction == 'down':
self.rect.y += self.speed
elif self.direction == 'left':
self.rect.x -= self.speed
elif self.direction == 'right':
self.rect.x += self.speed
def shoot(self):
if len(self.bullet_list) < 3:
bullet = Bullet(self.rect.centerx, self.rect.centery, self.direction)
self.bullet_list.add(bullet)
def update(self):
self.move()
self.screen_border_check()
def screen_border_check(self):
if self.rect.top < 0:
self.rect.top = 0
elif self.rect.bottom > game_height:
self.rect.bottom = game_height
elif self.rect.left < 0:
self.rect.left = 0
elif self.rect.right > game_width:
self.rect.right = game_width
# 定义子弹类
class Bullet(GameObject):
def __init__(self, x, y, direction, speed=10):
GameObject.__init__(self, x, y, bullet_img)
self.speed = speed
self.direction = direction
def update(self):
if self.direction == 'up':
self.rect.y -= self.speed
elif self.direction == 'down':
self.rect.y += self.speed
elif self.direction == 'left':
self.rect.x -= self.speed
elif self.direction == 'right':
self.rect.x += self.speed
if self.rect.top < 0 or self.rect.bottom > game_height or self.rect.left < 0 or self.rect.right > game_width:
self.kill()
# 定义敌方坦克类
class EnemyTank(Tank):
def __init__(self, x, y, img, speed=3):
Tank.__init__(self, x, y, img, speed)
self.direction = random.choice(['up', 'down', 'left', 'right'])
self.bullet_list = pygame.sprite.Group()
self.move_counter = 0
self.shoot_counter = 0
self.shoot_frequency = random.randint(30, 60)
def update(self):
self.move_counter += 1
if self.move_counter == 25:
self.move_counter = 0
self.direction = random.choice(['up', 'down', 'left', 'right'])
self.move()
self.screen_border_check()
self.shoot_counter += 1
if self.shoot_counter == self.shoot_frequency:
self.shoot_counter = 0
self.shoot()
def shoot(self):
bullet = Bullet(self.rect.centerx, self.rect.centery, self.direction)
self.bullet_list.add(bullet)
# 定义爆炸类
class Explosion(pygame.sprite.Sprite):
def __init__(self, center, anim):
pygame.sprite.Sprite.__init__(self)
self.anim = anim
self.image = self.anim[0]
self.rect = self.image.get_rect()
self.rect.center = center
self.frame = 0
self.last_update = pygame.time.get_ticks()
self.frame_rate = 50
def update(self):
now = pygame.time.get_ticks()
if now - self.last_update > self.frame_rate:
self.last_update = now
self.frame += 1
if self.frame == len(self.anim):
self.kill()
else:
center = self.rect.center
self.image = self.anim[self.frame]
self.rect = self.image.get_rect()
self.rect.center = center
# 定义游戏主循环
def game_loop():
player_tank = Tank(200, 200, tank_img)
enemy_tank_list = pygame.sprite.Group()
bullet_list = pygame.sprite.Group()
explosion_list = pygame.sprite.Group()
for i in range(5):
enemy_tank = EnemyTank(random.randint(0, game_width), random.randint(0, game_height), enemy_tank_img)
enemy_tank_list.add(enemy_tank)
game_exit = False
game_over = False
while not game_exit:
while game_over:
game_display.fill(black)
message_text = font.render('游戏结束,按 R 重新开始,按 Q 退出', True, white)
message_rect = message_text.get_rect(center=(game_width / 2, game_height / 2))
game_display.blit(message_text, message_rect)
pygame.display.update()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_exit = True
game_over = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_q:
game_exit = True
game_over = False
elif event.key == pygame.K_r:
game_loop()
for event in pygame.event.get():
if event.type == pygame.QUIT:
game_exit = True
if event.type == pygame.KEYDOWN:
if event.key == pygame.K_UP:
player_tank.direction = 'up'
elif event.key == pygame.K_DOWN:
player_tank.direction = 'down'
elif event.key == pygame.K_LEFT:
player_tank.direction = 'left'
elif event.key == pygame.K_RIGHT:
player_tank.direction = 'right'
elif event.key == pygame.K_SPACE:
player_tank.shoot()
game_display.fill(white)
player_tank.bullet_list.update()
enemy_tank_list.update()
bullet_list.update()
explosion_list.update()
# 碰撞检测
for bullet in player_tank.bullet_list:
enemy_tank_hit_list = pygame.sprite.spritecollide(bullet, enemy_tank_list, True)
for enemy_tank in enemy_tank_hit_list:
explosion = Explosion(enemy_tank.rect.center, explosion_anim)
explosion_list.add(explosion)
bullet.kill()
for bullet in bullet_list:
if pygame.sprite.collide_rect(player_tank, bullet):
explosion = Explosion(player_tank.rect.center, explosion_anim)
explosion_list.add(explosion)
bullet.kill()
player_tank.health -= 10
if player_tank.health <= 0:
game_over = True
# 绘制游戏物体
player_tank.bullet_list.draw(game_display)
enemy_tank_list.draw(game_display)
bullet_list.draw(game_display)
explosion_list.draw(game_display)
game_display.blit(player_tank.image, player_tank.rect)
# 显示血量条
pygame.draw.rect(game_display, green, (player_tank.rect.left, player_tank.rect.top - 10, player_tank.health, 5))
pygame.draw.rect(game_display, red, (player_tank.rect.left + player_tank.health, player_tank.rect.top - 10,
100 - player_tank.health, 5))
# 刷新屏幕
pygame.display.update()
pygame.quit()
quit()
if __name__ == '__main__':
game_loop()
```
这个示例代码中包括了坦克、子弹、敌方坦克、爆炸等多个类,实现了基本的游戏功能,包括移动、开火、碰撞检测、血量显示等。你可以根据需要进行修改和完善。