1、坦克大战游戏6
当前阶段要实现的是增加游戏信息显示功能(包括关卡信息,用户生命信息,敌人待生成信息显示功能)以及玩家重生(玩家被敌人打死后,如果玩家生命数大于0)功能。
1-1、setting.py中配置消息显示的起始位置
游戏屏幕的宽和高分别是1440 * 960,图片块的宽和高分别是60 * 60,游戏屏幕按图片块分为水平方向 1440 / 60 = 24块,垂直方向 960 / 60 =16块, 其中上,左,下分别占用一块的尺寸(游戏边界),右边占用2块的尺寸(用于显示游戏基本信息)。所以游戏信息显示栏的宽度为120, 显示游戏信息的起始位置为占用22块的宽度 + 15的缩进距离,即22 * 60 + 15 = 1335,高度的起始位置设置为60。
# 消息bar的x轴起始位置
MSG_BAR_START_X = 1335
# 消息bar的y轴起始位置
MSG_BAR_START_Y = 60
1-2、增加消息栏管理类msgbar.py
1-2-1、增加绘制未生成敌人数量的方法draw_enemy_msg(self),该方法的逻辑是
- 当未生成敌人数量大于10 或者 等于0的时候,采用【图标 数量】形式显示

- 当未生成敌人数量小于10 且 大于0的时候,采用【图标 图标…】显示。

1-2-2、增加展示玩家剩余生命数的方法draw_player(self),采用【P1 数字】方式显示,其中数字表示玩家1还剩多少条命,可根据需求扩展玩家2

1-2-3、增加展示有限当前关卡的方法draw_game_level(self),采用【🚩 数字】方式显示,其中数字表示当前是第几关

import pygame.image
from pygame.sprite import Sprite
from text import TextTool
from setting import *
class MsgBar:
def __init__(self, level_class):
# 游戏主类
self.level_class = level_class
# 敌人待生成列表
self.enemy_wait_list = level_class.enemy_wait_list
# 玩家精灵组
self.player_group = level_class.player_group
# 敌人精灵组
self.enemy_group = level_class.enemy_group
# 消息栏精灵组
self.msg_bar_group = level_class.msg_bar_group
# 游戏可见对象精灵组
self.visiable_group = level_class.visiable_group
# 创建字体对象
self.font = pygame.font.Font('../fonts/simkai.ttf', 35)
# 字体加粗
self.font.set_bold(True)
# 游戏页面
self.surface = pygame.display.get_surface()
# 敌人坦克图标对象集合(待初始化敌人超过10)
self.msg_enemy_list = []
# 敌人坦克图标(待初始化敌人小于等于10)
self.msg_single_enemy = None
# 待初始化坦克数
self.msg_enemy_count = 0
# 待初始化坦克Text对象
self.enemy_text_tool = None
# 玩家1设关于生命数量
self.play1_live_count = 0
# 玩家1生命数量Text对象
self.play1_text_tool = None
# 游戏关卡🚩图标
self.msg_game_level = None
# 游戏当前关卡
self.msg_game_level_idx = None
# 游戏文字工具
self.game_level_text_tool = None
# 重置参数
def reset_arg(self):
# 敌人坦克图标对象集合(待初始化敌人超过10)
self.msg_enemy_list = []
# 敌人坦克图标(待初始化敌人小于等于10)
self.msg_single_enemy = None
# 待初始化坦克数
self.msg_enemy_count = -1
# 待初始化坦克Text对象
self.enemy_text_tool = None
# 玩家1设关于生命数量
self.play1_live_count = 0
# 玩家1生命数量Text对象
self.play1_text_tool = None
# 游戏关卡🚩图标
self.msg_game_level = None
# 游戏当前关卡
self.msg_game_level_idx = None
# 游戏文字工具
self.game_level_text_tool = None
# 绘制敌人未生成数量展示
def draw_enemy_msg(self):
start_x = MSG_BAR_START_X
start_y = MSG_BAR_START_Y
# 当未生成敌人数量大于10 或者 等于0的时候,采用【图标 数量】形式显示
if len(self.enemy_wait_list) > 10 or len(self.enemy_wait_list) == 0:
if self.msg_single_enemy is None:
self.msg_single_enemy = EnemyLive((start_x, start_y), [self.msg_bar_group, self.visiable_group])
# 当消息栏记录的未生成敌人数量同游戏实际的未生成敌人数量不等的时候,重新生成未生成敌人的显示信息
if self.msg_enemy_count != len(self.enemy_wait_list):
self.msg_enemy_count = len(self.enemy_wait_list)
text = self.font.render(str(len(self.enemy_wait_list)), True, 'black')
self.enemy_text_tool = TextTool(text, self.font, (start_x + 50, start_y), -1)
if self.enemy_text_tool is not None:
self.enemy_text_tool.update()
elif len(self.enemy_wait_list) > 0:
# 当未生成敌人数量小于10 且 大于0的时候,采用【图标 图标....】显示
if self.msg_single_enemy is not None:
self.msg_single_enemy.kill()
self.msg_single_enemy = None
if len(self.msg_enemy_list) > 0:
init_count = len(self.msg_enemy_list) - len(self.enemy_wait_list)
while init_count > 0:
# 先删除敌人图标
self.msg_enemy_list[len(self.msg_enemy_list) - 1].kill()
# 将敌人图标对象从列表中移除
del self.msg_enemy_list[len(self.msg_enemy_list) - 1]
init_count -= 1
else:
for idx in range(len(self.enemy_wait_list)):
if idx != 0 and idx % 2 == 0:
start_x = MSG_BAR_START_X
start_y += 42
elif idx % 2 != 0:
start_x += 50
pos = (start_x, start_y)
self.msg_enemy_list.append(EnemyLive(pos, [self.msg_bar_group, self.visiable_group]))
# 绘制玩家提示信息
def draw_player(self):
start_x = MSG_BAR_START_X
start_y = MSG_BAR_START_Y + 450
if self.play1_live_count != self.level_class.player1_life:
self.play1_live_count = self.level_class.player1_life
text = self.font.render(f'P1:{str(self.play1_live_count)}', True, 'black')
self.play1_text_tool = TextTool(text, self.font, (start_x, start_y), -1, f'P1:{str(self.play1_live_count)}')
if self.play1_text_tool is not None:
self.play1_text_tool.update()
# 绘制状态栏中当前游戏关卡(第几关)
def draw_game_level(self):
start_x = MSG_BAR_START_X
start_y = MSG_BAR_START_Y + 600
if self.msg_game_level is None:
self.msg_game_level = GameLevel((start_x, start_y), [self.msg_bar_group, self.visiable_group])
if self.msg_game_level_idx != self.level_class.cur_map_level:
self.msg_game_level_idx = self.level_class.cur_map_level
text = self.font.render(self.msg_game_level_idx.replace('level', ' '), True, 'black')
self.game_level_text_tool = TextTool(text, self.font, (start_x + 50, start_y), -1)
if self.game_level_text_tool is not None:
self.game_level_text_tool.update()
# 更新状态栏信息
def update(self):
self.draw_enemy_msg()
self.draw_player()
self.draw_game_level()
# 状态栏敌人图标
class EnemyLive(Sprite):
def __init__(self, pos, groups):
super().__init__(groups)
self.image = pygame.image.load('../graphics/common/enemy_live.png')
self.rect = self.image.get_rect(topleft=pos)
# 状态栏游戏等级🚩
class GameLevel(Sprite):
def __init__(self, pos, groups):
super().__init__(groups)
self.image = pygame.image.load('../graphics/common/level.png')
self.rect = self.image.get_rect(topleft=pos)
1-3、level.py中增加玩家重生方法reborn_player(self)
当玩家被敌人打死后,且玩家剩余生命数大于0,则调用此方法让玩家重生
# 重新生成玩家
def reborn_player(self):
game_map = import_csv_layout('../map/level1.csv')
for row_idx, row in enumerate(game_map):
for col_idx, column in enumerate(row):
x = col_idx * TITLE_SIZE
y = row_idx * TITLE_SIZE
if column == 'p1':
Player((x, y), 'level1',
[self.visiable_group, self.player_group], self)
在炮弹类missile.py的collision_enemy_player(self)方法中添加玩家被敌人打死后嗲用主类的重生方法
def collision_enemy_player(self):
......
# 用户剩余玩家数量不等于0,重新生成一个玩家
print('玩家剩余生命数', self.level_class.player1_life)
if self.level_class.player1_life > 0:
self.level_class.reborn_player()
else:
# 玩家生命数等于0
self.level_class.game_over()
2、运行游戏并查看游戏效果
2-1、打开cmd命令窗口
2-2、进入code目录
2-3、执行命令:python main.py

点击源码包下载源码

1446

被折叠的 条评论
为什么被折叠?



