Python——简易飞机大战
·
简易飞机大战PYTHON版
实现简易的飞机大战需要设计并完成以下几个类,通过使用基础的Python语句以及对类进行封装,继承和资源管理就可以实现这个小游戏。
1.玩家飞机类
这是游戏的主角,负责接受玩家的指令并做出操作。
需要包含的属性有:
- 飞机图片
- 坐标
- 生命值
- 子弹发射频率
需要实现的方法有:
move():根据键盘输入改变坐标,必要的时候进行边界检测。shoot():产生子弹对象并加入子弹组。reset():玩家死亡后的重置逻辑。
代码如下:
class Player(pygame.sprite.Sprite):
def __init__(self, image_path, screen_width, screen_height):
super().__init__()
self.image = pygame.image.load(image_path).convert_alpha()
self.rect = self.image.get_rect()
# 初始位置
self.rect.centerx = screen_width // 2
self.rect.bottom = screen_height - 20
self.speed = 5
def moveUp(self):
if self.rect.top > 0: self.rect.y -= self.speed
def moveDown(self, screen_height):
if self.rect.bottom < screen_height: self.rect.y += self.speed
def moveLeft(self):
if self.rect.left > 0: self.rect.x -= self.speed
def moveRight(self, screen_width):
if self.rect.right < screen_width: self.rect.x += self.speed
2.子弹类
通过这个类实现飞机发射子弹的行为。
需要包含的属性有:
- 子弹图片
- 坐标
- 飞行速度
- 伤害值
需要包含的方法有:
update():每一帧向上(如果是敌机的话则向下)移动。kill()飞出屏幕边界时自动销毁子弹,防止内存泄漏。
代码如下:
class Bullet(pygame.sprite.Sprite):
def __init__(self, bullet_img, init_pos):
super().__init__() # 调用父类初始化
self.image = bullet_img
self.rect = self.image.get_rect()
self.rect.midbottom = init_pos # 核心:子弹从飞机头部发射
self.speed = 10
def update(self):
self.rect.top -= self.speed # 向上移动
if self.rect.bottom < 0: # 自动销毁逻辑
self.kill()
3.敌机类
这个类与玩家类类似,作用是在这个类中实现与玩家的互动。
需要包含的属性有:
- 随机的初始坐标
- 不同的移动速度
- 随机的出现频率
需要实现的方法有:
update():向下移动。reset():被击中或飞出底端后,回到顶端重新随机出现。
代码如下:
import random
class Enemy(pygame.sprite.Sprite):
def __init__(self, image_path, screen_width):
super().__init__()
self.image = pygame.image.load(image_path).convert_alpha()
self.rect = self.image.get_rect()
# 随机位置出现在顶部外
self.rect.left = random.randint(0, screen_width - self.rect.width)
self.rect.bottom = 0
self.speed = random.randint(2, 5) # 随机速度
def update(self):
self.rect.top += self.speed # 向下移动
if self.rect.top > 700: # 飞出屏幕底端后销毁
self.kill()
4.背景类
该类主要实现背景图片的交替,以呈现给玩家像在飞行的视觉效果。
- 原理:通常使用两张完全相同的背景图拼接,交替向下滚动。实现无缝滚动的效果。
- 属性:背景图片,滚动速度。
- 方法:
update()控制两张图片的坐标更替。
代码如下:
class Background():
def __init__(self, screen):
self.screen = screen
self.image = pygame.Surface((480, 700)) # 或者是加载背景图
self.image.fill((30, 30, 30))
self.y1 = 0
self.y2 = -700 # 第二张图接在第一张上面
def update(self):
# 两张背景图同时向下滚动
self.y1 += 2
self.y2 += 2
if self.y1 >= 700: self.y1 = -700
if self.y2 >= 700: self.y2 = -700
def draw(self):
self.screen.blit(self.image, (0, self.y1))
self.screen.blit(self.image, (0, self.y2))
5.游戏主逻辑控制类
这个类负责调用其他类以实现目标效果。
代码如下:
import pygame
import sys
class GameApp:
def __init__(self):
pygame.init()
self.screen = pygame.display.set_mode((480, 700))
self.clock = pygame.time.Clock()
self.running = True
# 2. 创建精灵组
self.player = Player() # 假设你已经定义了Player类
self.enemies = pygame.sprite.Group()
self.bullets = pygame.sprite.Group()
def _check_events(self):
for event in pygame.event.get():
if event.type == pygame.QUIT:
self.running = False
elif event.type == pygame.KEYDOWN:
if event.key == pygame.K_SPACE:
self.player.shoot(self.bullets)
def _update_sprites(self):
self.player.update()
self.enemies.update()
self.bullets.update()
# 核心逻辑:导演亲自检测碰撞
# 如果子弹打中敌机,两者都消失
pygame.sprite.groupcollide(self.bullets, self.enemies, True, True)
# 如果敌机撞到玩家,游戏结束
if pygame.sprite.spritecollideany(self.player, self.enemies):
print("Game Over!")
self.running = False
def _draw_screen(self):
self.screen.fill((0, 0, 0))
self.screen.blit(self.player.image, self.player.rect)
self.enemies.draw(self.screen)
self.bullets.draw(self.screen)
pygame.display.flip()
def run_game(self):
while self.running:
self.clock.tick(60) # 维持帧率
self._check_events() # 处理输入
self._update_sprites() # 更新逻辑
self._draw_screen() # 绘制画面
pygame.quit()
sys.exit()
if __name__ == '__main__': # 启动游戏
game = GameApp()
game.run_game()
更多推荐



所有评论(0)