利用Python实现炸弹人游戏的完整代码
作者:从以前
一、引言
炸弹人游戏是一款经典的游戏,在本文中,我们将深入探讨如何使用 Python 的 Pygame 库来实现一个炸弹人游戏,并对其进行多方面的优化,包括添加敌人 AI、得分系统、生命值以及游戏结束逻辑,从而为玩家带来更完整丰富的游戏体验。
二、游戏初始化与设置
(一)Pygame 初始化与窗口设置
首先,我们导入必要的库pygame
、random
和sys
,并对pygame
进行初始化操作。
import pygame import random import sys # 初始化pygame pygame.init() # 设置游戏窗口大小 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 BOMB_TIMER = 10 # 炸弹爆炸时间 # 设置颜色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) GREEN = (0, 255, 0) # 设置字体 FONT = pygame.font.SysFont('Arial', 24) # 游戏窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('Bomber Man')
这里我们设定了游戏窗口的大小为800x600
像素,炸弹的爆炸时间为10
个单位时间,同时定义了游戏中会用到的各种颜色以及字体样式,并创建了游戏窗口并设置了窗口标题为Bomber Man
。
(二)玩家、敌人与炸弹的初始设置
接下来,我们对游戏中的主要元素 —— 玩家、敌人和炸弹进行初始设置。
# 玩家设置 player_size = 30 player_pos = [SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2] player_speed = 5 player_bombs = 3 player_lives = 3 # 敌人设置 enemy_size = 30 enemy_pos = [random.randint(0, SCREEN_WIDTH - enemy_size), random.randint(0, SCREEN_HEIGHT - enemy_size)] enemy_speed = 3 enemy_list = [{'pos': enemy_pos, 'speed': enemy_speed}] # 炸弹设置 bomb_size = 20 bomb_list = [] bomb_timer = 0
对于玩家,我们设定了其初始大小为30
像素,初始位置在窗口中心,移动速度为5
像素 / 单位时间,初始拥有3
颗炸弹且生命值为3
。对于敌人,其初始大小也为30
像素,初始位置随机生成在窗口内,移动速度为3
像素 / 单位时间,并将其信息存储在enemy_list
列表中。炸弹则设置了初始大小,创建了一个空的炸弹列表bomb_list
用于存储炸弹信息,同时初始化炸弹定时器为0
。
(三)地图设置
最后,我们进行地图的设置。
# 地图设置 map_width = 20 map_height = 15 map_grid = [['1' for _ in range(map_width)] for _ in range(map_height)]
这里创建了一个20x15
的地图网格map_grid
,其中'1'
表示不可通过的墙体,后续可根据炸弹爆炸等情况对地图进行修改。
三、游戏元素绘制函数
(一)绘制地图网格函数
def draw_grid(): for y in range(map_height): for x in range(map_width): rect = pygame.Rect(x * 40, y * 40, 40, 40) pygame.draw.rect(screen, BLACK if map_grid[y][x] == '1' else WHITE, rect, 0 if map_grid[y][x] == '0' else 1)
该函数用于绘制游戏地图的网格。通过遍历地图网格中的每个格子,根据格子的值('1'
为黑色墙体,'0'
为白色可通行区域)绘制对应的矩形,并且根据格子类型决定是否绘制边框。
(二)绘制玩家函数
def draw_player(): pygame.draw.rect(screen, RED, (player_pos[0], player_pos[1], player_size, player_size))
此函数简单地在玩家当前位置绘制一个红色的矩形来表示玩家。
(三)绘制敌人函数
def draw_enemy(): for enemy in enemy_list: pygame.draw.rect(screen, BLUE, (enemy['pos'][0], enemy['pos'][1], enemy_size, enemy_size))
该函数遍历敌人列表enemy_list
,在每个敌人的位置绘制一个蓝色的矩形来表示敌人。
四、游戏元素移动与操作函数
(一)玩家移动函数
def move_player(keys): if keys[pygame.K_LEFT] and player_pos[0] > 0: player_pos[0] -= player_speed if keys[pygame.K_RIGHT] and player_pos[0] < SCREEN_WIDTH - player_size: player_pos[0] += player_speed if keys[pygame.K_UP] and player_pos[1] > 0: player_pos[1] -= player_speed if keys[pygame.K_DOWN] and player_pos[1] < SCREEN_HEIGHT - player_size: player_pos[1] += player_speed
通过获取键盘按键状态keys
,当玩家按下左、右、上、下方向键时,并且玩家位置在窗口边界内,就相应地改变玩家的位置坐标,实现玩家的移动操作。
(二)敌人移动函数
def move_enemy(): for enemy in enemy_list: if random.random() < 0.1: # 随机移动 if random.random() < 0.5: enemy['pos'][0] += enemy['speed'] else: enemy['pos'][0] -= enemy['speed'] if random.random() < 0.5: enemy['pos'][1] += enemy['speed'] else: enemy['pos'][1] -= enemy['speed'] # 保持敌人在窗口内 enemy['pos'][0] = max(0, min(enemy['pos'][0], SCREEN_WIDTH - enemy_size)) enemy['pos'][1] = max(0, min(enemy['pos'][1], SCREEN_HEIGHT - enemy_size))
敌人的移动采用了简单的随机移动策略。在每次循环中,有10%
的概率敌人会进行移动,移动方向在上下左右四个方向中随机选择,并且移动速度为enemy_speed
。同时,确保敌人的位置始终在游戏窗口内。
(三)放置炸弹函数
def place_bomb(): global bomb_timer if bomb_timer == 0 and player_bombs > 0: bomb_list.append({'pos': [player_pos[0] // 40, player_pos[1] // 40], 'timer': BOMB_TIMER}) bomb_timer = BOMB_TIMER player_bombs -= 1
当炸弹定时器为0
且玩家还有炸弹时,在玩家当前位置对应的地图格子坐标处创建一个炸弹信息并添加到bomb_list
中,同时更新炸弹定时器和减少玩家的炸弹数量。
(四)炸弹爆炸函数
def explode_bombs(): for bomb in bomb_list[:]: x, y = bomb['pos'] if bomb['timer'] == 0: bomb_list.remove(bomb) if map_grid[y][x] == '1': map_grid[y][x] = '0' for dx in [-1, 0, 1]: for dy in [-1, 0, 1]: if dx!= 0 or dy!= 0: nx, ny = x + dx, y + dy if 0 <= nx < map_width and 0 <= ny < map_height and map_grid[ny][nx] == '1': map_grid[ny][nx] = '0' else: bomb['timer'] -= 1
该函数遍历炸弹列表bomb_list
,当炸弹定时器归零时,炸弹爆炸。如果爆炸位置是墙体('1'
),则将其变为可通行区域('0'
),并且对爆炸周围的格子(九宫格范围内除中心格)进行遍历,如果是墙体也将其变为可通行区域。如果炸弹定时器未归零,则将其减1
。
(五)碰撞检测函数
def check_collision(): global player_lives for enemy in enemy_list[:]: if (enemy['pos'][0] >= player_pos[0] and enemy['pos'][0] <= player_pos[0] + player_size) and \ (enemy['pos'][1] >= player_pos[1] and enemy['pos'][1] <= player_pos[1] + player_size): player_lives -= 1 enemy_list.remove(enemy) if player_lives <= 0: return True return False
此函数用于检测玩家与敌人之间的碰撞。遍历敌人列表,如果某个敌人与玩家的位置有重叠,则减少玩家生命值,移除该敌人。如果玩家生命值小于等于0
,则游戏结束,返回True
,否则返回False
。
五、游戏主循环
def game_loop(): running = True clock = pygame.time.Clock() score = 0 while running: for event in pygame.event.get(): if event.type == pygame.QUIT: running = False keys = pygame.key.get_pressed() move_player(keys) if keys[pygame.K_SPACE] and player_bombs > 0: place_bomb() move_enemy() explode_bombs() screen.fill(BLACK) draw_grid() draw_player() draw_enemy() for bomb in bomb_list: pygame.draw.rect(screen, (255, 255, 0), (bomb['pos'][0] * 40, bomb['pos'][1] * 40, 40, 40)) if check_collision(): running = False score_text = FONT.render(f'Score: {score}', True, GREEN) lives_text = FONT.render(f'Lives: {player_lives}', True, GREEN) screen.blit(score_text, (10, 10)) screen.blit(lives_text, (SCREEN_WIDTH - 150, 10)) pygame.display.flip() clock.tick(30) pygame.quit() sys.exit()
游戏主循环game_loop
中,首先处理游戏退出事件。然后获取键盘按键状态并进行玩家移动和炸弹放置操作。接着移动敌人、处理炸弹爆炸逻辑。之后绘制游戏背景、地图、玩家、敌人和炸弹等元素。再进行碰撞检测,如果游戏结束则跳出循环。最后绘制得分和生命值信息,并更新屏幕显示,控制游戏帧率为30
帧 / 秒。
六、游戏入口
if __name__ == "__main__": game_loop()
在if __name__ == "__main__"
语句块中调用game_loop
函数,启动游戏。
七、优化内容总结
- 敌人 AI:通过简单的随机移动策略,使敌人具有一定的自主性,增加了游戏的挑战性。
- 得分系统:虽然代码中未详细展示得分增加逻辑(可在放置炸弹时增加得分等),但已预留了得分变量
score
,为后续完善得分系统提供了基础。 - 生命值:玩家拥有生命值,当与敌人碰撞时生命值减少,当生命值为
0
时游戏结束,使游戏更加合理和具有紧张感。 - 游戏结束逻辑:明确了游戏结束的条件,即玩家生命值耗尽,使游戏有完整的开始和结束流程。
八、后续扩展方向
这个优化后的代码已经提供了一个较为完整的炸弹人游戏框架。你可以根据需要进一步扩展和优化这个游戏,例如添加更多的敌人类型,不同类型敌人具有不同的移动策略和攻击方式;改进地图生成逻辑,生成更加复杂和有趣的地图;增加更多的游戏元素,如道具、陷阱等,以丰富游戏玩法和提高游戏的趣味性与可玩性。
通过以上对炸弹人游戏代码的详细解析,希望能帮助读者更好地理解游戏开发过程中的逻辑构建和功能实现,从而在游戏开发的学习和实践中取得更大的进步。
到此这篇关于利用Python实现炸弹人游戏的文章就介绍到这了,更多相关Python实现炸弹人游戏内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!