python小游戏-坦克大战

devtools/2025/3/6 22:24:28/
  1. 完整的游戏状态管理:
  • 生命值系统
  • 得分系统
  • 游戏结束条件
  • 重新开始功能
  1. 增强的坦克功能:
  • 坦克旋转
  • 无敌时间
  • 不同类型的坦克(玩家/敌人)
  1. 改进的碰撞系统:
  • 子弹与墙壁碰撞
  • 子弹与坦克碰撞
  • 子弹与基地碰撞
  1. 游戏机制的完善:
  • 敌人AI
  • 自动生成新敌人
  • 可破坏和不可破坏的墙壁
  1. 用户界面改进:
  • 显示得分
  • 显示生命值
  • 游戏结束画面
  • python">import pygame
    import random
    import os# 初始化pygame和混音器
    pygame.init()
    pygame.mixer.init()# 屏幕设置
    SCREEN_WIDTH = 800
    SCREEN_HEIGHT = 600
    screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT))
    pygame.display.set_caption("坦克大战增强版")# 颜色定义
    WHITE = (255, 255, 255)
    BLACK = (0, 0, 0)
    RED = (255, 0, 0)
    GREEN = (0, 255, 0)
    BLUE = (0, 0, 255)
    YELLOW = (255, 255, 0)# 游戏常量
    TANK_SIZE = 40
    BULLET_SIZE = 10
    WALL_SIZE = 40# 加载图片和音效
    def load_image(name):return pygame.image.load(os.path.join('images', name)).convert_alpha()def load_sound(name):return pygame.mixer.Sound(os.path.join('sounds', name))# 游戏状态
    class GameState:def __init__(self):self.score = 0self.lives = 3self.level = 1self.game_over = Falseself.paused = False# 坦克基类
    class BaseTank(pygame.sprite.Sprite):def __init__(self, color, x, y):super().__init__()self.original_image = pygame.Surface((TANK_SIZE, TANK_SIZE))self.original_image.fill(color)self.image = self.original_imageself.rect = self.image.get_rect()self.rect.center = (x, y)self.speed = 5self.direction = "up"self.shoot_delay = 500  # 射击延迟(毫秒)self.last_shot = pygame.time.get_ticks()def rotate(self, angle):self.image = pygame.transform.rotate(self.original_image, angle)self.rect = self.image.get_rect(center=self.rect.center)# 玩家坦克
    class PlayerTank(BaseTank):def __init__(self, x, y):super().__init__(GREEN, x, y)self.lives = 3self.invincible = Falseself.invincible_timer = 0def update(self, keys, current_time):if self.invincible:if current_time - self.invincible_timer > 3000:  # 3秒无敌时间self.invincible = Falseif keys[pygame.K_LEFT]:self.rect.x = max(0, self.rect.x - self.speed)self.direction = "left"self.rotate(90)if keys[pygame.K_RIGHT]:self.rect.x = min(SCREEN_WIDTH - self.rect.width, self.rect.x + self.speed)self.direction = "right"self.rotate(-90)if keys[pygame.K_UP]:self.rect.y = max(0, self.rect.y - self.speed)self.direction = "up"self.rotate(0)if keys[pygame.K_DOWN]:self.rect.y = min(SCREEN_HEIGHT - self.rect.height, self.rect.y + self.speed)self.direction = "down"self.rotate(180)# 敌人坦克
    class EnemyTank(BaseTank):def __init__(self, x, y):super().__init__(RED, x, y)self.speed = 3self.direction_timer = pygame.time.get_ticks()self.direction_change_delay = 1000def update(self, current_time):# 随机改变方向if current_time - self.direction_timer > self.direction_change_delay:self.direction = random.choice(["up", "down", "left", "right"])self.direction_timer = current_time# 根据方向移动if self.direction == "left":self.rect.x = max(0, self.rect.x - self.speed)self.rotate(90)elif self.direction == "right":self.rect.x = min(SCREEN_WIDTH - self.rect.width, self.rect.x + self.speed)self.rotate(-90)elif self.direction == "up":self.rect.y = max(0, self.rect.y - self.speed)self.rotate(0)elif self.direction == "down":self.rect.y = min(SCREEN_HEIGHT - self.rect.height, self.rect.y + self.speed)self.rotate(180)# 随机射击if random.random() < 0.02:  # 2%的概率射击return Truereturn False# 子弹类
    class Bullet(pygame.sprite.Sprite):def __init__(self, x, y, direction, owner):super().__init__()self.image = pygame.Surface((BULLET_SIZE, BULLET_SIZE))self.image.fill(YELLOW)self.rect = self.image.get_rect()self.rect.center = (x, y)self.direction = directionself.speed = 10self.owner = owner  # 'player' 或 'enemy'def update(self):if self.direction == "up":self.rect.y -= self.speedelif self.direction == "down":self.rect.y += self.speedelif self.direction == "left":self.rect.x -= self.speedelif self.direction == "right":self.rect.x += self.speed# 移除屏幕外的子弹if (self.rect.bottom < 0 or self.rect.top > SCREEN_HEIGHT or self.rect.right < 0 or self.rect.left > SCREEN_WIDTH):self.kill()# 墙壁类
    class Wall(pygame.sprite.Sprite):def __init__(self, x, y, destructible=True):super().__init__()self.image = pygame.Surface((WALL_SIZE, WALL_SIZE))self.image.fill(BLUE if destructible else WHITE)self.rect = self.image.get_rect()self.rect.topleft = (x, y)self.destructible = destructible# 基地类
    class Base(pygame.sprite.Sprite):def __init__(self, x, y):super().__init__()self.image = pygame.Surface((WALL_SIZE, WALL_SIZE))self.image.fill(GREEN)self.rect = self.image.get_rect()self.rect.topleft = (x, y)# 游戏管理器
    class Game:def __init__(self):self.state = GameState()self.all_sprites = pygame.sprite.Group()self.players = pygame.sprite.Group()self.enemies = pygame.sprite.Group()self.bullets = pygame.sprite.Group()self.walls = pygame.sprite.Group()self.bases = pygame.sprite.Group()# 创建玩家self.player = PlayerTank(SCREEN_WIDTH // 2, SCREEN_HEIGHT - 60)self.all_sprites.add(self.player)self.players.add(self.player)# 创建基地self.base = Base(SCREEN_WIDTH // 2 - WALL_SIZE // 2, SCREEN_HEIGHT - WALL_SIZE)self.all_sprites.add(self.base)self.bases.add(self.base)# 创建初始敌人self.spawn_enemies()# 创建墙壁self.create_walls()# 加载音效# self.shoot_sound = load_sound('shoot.wav')# self.explosion_sound = load_sound('explosion.wav')def spawn_enemies(self):for _ in range(5):x = random.randint(0, SCREEN_WIDTH - TANK_SIZE)enemy = EnemyTank(x, 50)self.all_sprites.add(enemy)self.enemies.add(enemy)def create_walls(self):# 创建一些随机的墙壁for _ in range(20):x = random.randint(0, SCREEN_WIDTH - WALL_SIZE)y = random.randint(100, SCREEN_HEIGHT - 100)wall = Wall(x, y)self.all_sprites.add(wall)self.walls.add(wall)def handle_collisions(self):# 子弹与墙壁碰撞for bullet in self.bullets:wall_hits = pygame.sprite.spritecollide(bullet, self.walls, False)for wall in wall_hits:if wall.destructible:wall.kill()bullet.kill()# self.explosion_sound.play()# 子弹与坦克碰撞for bullet in self.bullets:if bullet.owner == 'player':enemy_hits = pygame.sprite.spritecollide(bullet, self.enemies, True)if enemy_hits:bullet.kill()self.state.score += 100# self.explosion_sound.play()elif bullet.owner == 'enemy':player_hits = pygame.sprite.spritecollide(bullet, self.players, False)if player_hits and not self.player.invincible:bullet.kill()self.player.lives -= 1if self.player.lives <= 0:self.state.game_over = Trueelse:self.player.invincible = Trueself.player.invincible_timer = pygame.time.get_ticks()# self.explosion_sound.play()# 子弹与基地碰撞base_hits = pygame.sprite.spritecollide(self.base, self.bullets, True)if base_hits:self.state.game_over = Truedef update(self):current_time = pygame.time.get_ticks()# 更新玩家keys = pygame.key.get_pressed()self.player.update(keys, current_time)# 更新敌人for enemy in self.enemies:if enemy.update(current_time):bullet = Bullet(enemy.rect.centerx, enemy.rect.centery, enemy.direction, 'enemy')self.all_sprites.add(bullet)self.bullets.add(bullet)# self.shoot_sound.play()# 更新子弹self.bullets.update()# 处理碰撞self.handle_collisions()# 检查是否需要生成新的敌人if len(self.enemies) < 5:self.spawn_enemies()def draw(self):screen.fill(BLACK)self.all_sprites.draw(screen)# 绘制得分和生命值font = pygame.font.Font(None, 36)score_text = font.render(f'Score: {self.state.score}', True, WHITE)lives_text = font.render(f'Lives: {self.player.lives}', True, WHITE)screen.blit(score_text, (10, 10))screen.blit(lives_text, (10, 40))if self.state.game_over:game_over_text = font.render('GAME OVER', True, RED)screen.blit(game_over_text, (SCREEN_WIDTH//2 - game_over_text.get_width()//2, SCREEN_HEIGHT//2 - game_over_text.get_height()//2))pygame.display.flip()def main():clock = pygame.time.Clock()game = Game()running = Truewhile running:for event in pygame.event.get():if event.type == pygame.QUIT:running = Falseelif event.type == pygame.KEYDOWN:if event.key == pygame.K_SPACE and not game.state.game_over:bullet = Bullet(game.player.rect.centerx, game.player.rect.centery,game.player.direction, 'player')game.all_sprites.add(bullet)game.bullets.add(bullet)# game.shoot_sound.play()elif event.key == pygame.K_r and game.state.game_over:game = Game()  # 重新开始游戏if not game.state.game_over:game.update()game.draw()clock.tick(60)pygame.quit()if __name__ == "__main__":main() 


http://www.ppmy.cn/devtools/165082.html

相关文章

OpenMCU(二):GD32E23xx FreeRTOS移植

概述 本文主要描述了GD32E230移植FreeRTOS的简要步骤。移植描述过程中&#xff0c;忽略了Keil软件的部分使用技巧。默认读者熟练使用Keil软件。本文的描述是基于OpenMCU_FreeRTOS这个工程&#xff0c;该工程已经下载放好了移植GD32E230 FreeRTOS的所有文件 OpenMCU_FreeRTOS工程…

锂电池寿命预测 | Matlab基于ARIMA的锂电池寿命预测

目录 预测效果基本介绍基于ARIMA的锂电池寿命预测一、引言1.1、研究背景和意义1.2、研究现状1.3、研究目的与方法 二、ARIMA模型概述2.1、时间序列分析基础2.2、ARIMA模型基本原理2.3、模型识别、参数估计与诊断 三、锂电池寿命预测的数据预处理3.1、数据采集与准备3.2、数据平…

字节跳动发布 Trae AI IDE!支持 DeepSeek R1 V3,AI 编程新时代来了!

3 月 3 日&#xff0c;字节跳动重磅发布国内首款 AI 原生集成开发环境&#xff08;AI IDE&#xff09;——Trae 国内版&#xff01; Trae 不只是一个传统的 IDE&#xff0c;它深度融合 AI&#xff0c;搭载 doubao-1.5-pro 大模型&#xff0c;同时支持DeepSeek R1 & V3&…

设计模式说明

23种设计模式说明 以下是常见的 23 种设计模式 分类及其核心思想、应用场景和简单代码示例&#xff0c;帮助你在实际开发中灵活运用&#xff1a; 一、创建型模式&#xff08;5种&#xff09; 解决对象创建问题&#xff0c;降低对象耦合。 1. 单例模式&#xff08;Singleton&…

物联网感知层常用感应设备

一、环境监测类 温度传感器 ▸ 应用&#xff1a;冷链运输温度监控、智能温室调控 ▸ 技术&#xff1a;热敏电阻、红外测温&#xff08;如TI TMP117&#xff09; 湿度传感器 ▸ 应用&#xff1a;农业大棚湿度控制、工业防潮监测 ▸ 案例&#xff1a;Sensirion SHT4x系列 光照传…

Data truncation: Out of range value for column ‘allow_invite‘ at row 1

由于前端传递的数值超过了mysql数据库中tinyint类型的取值范围&#xff0c;所以就会报错。 Caused by: com.mysql.cj.jdbc.exceptions.MysqlDataTruncation: Data truncation: Out of range value for column allow_invite at row 1at com.mysql.cj.jdbc.exceptions.SQLExcept…

Web后端开发-总结

一.技术总结 web后端开发现在基本上都是基于标准的三层架构进行开发的&#xff1a;Controller层&#xff0c;也叫控制器层&#xff0c;负责接受请求响应数据。service层&#xff0c;也叫业务器层&#xff0c;负责业务逻辑的实现。dao层&#xff0c;也叫数据访问层&#xff0c;持…

【长安大学】苹果手机/平板自动连接认证CHD-WIFI脚本(快捷指令)

背景&#xff1a; 前几天实在忍受不了CHD-WIFI动不动就断开&#xff0c;一天要重新连接&#xff0c;点登陆好几次。试了下在网上搜有没有CHD-WIFI的自动连接WIFI自动认证脚本&#xff0c;那样我就可以解放双手&#xff0c;随时用WIFI就行了&#xff0c;但是没有找到。于是我就…