利用Python實(shí)現(xiàn)炸彈人游戲的完整代碼
一、引言
炸彈人游戲是一款經(jīng)典的游戲,在本文中,我們將深入探討如何使用 Python 的 Pygame 庫(kù)來實(shí)現(xiàn)一個(gè)炸彈人游戲,并對(duì)其進(jìn)行多方面的優(yōu)化,包括添加敵人 AI、得分系統(tǒng)、生命值以及游戲結(jié)束邏輯,從而為玩家?guī)砀暾S富的游戲體驗(yàn)。
二、游戲初始化與設(shè)置
(一)Pygame 初始化與窗口設(shè)置
首先,我們導(dǎo)入必要的庫(kù)pygame
、random
和sys
,并對(duì)pygame
進(jìn)行初始化操作。
import pygame import random import sys # 初始化pygame pygame.init() # 設(shè)置游戲窗口大小 SCREEN_WIDTH = 800 SCREEN_HEIGHT = 600 BOMB_TIMER = 10 # 炸彈爆炸時(shí)間 # 設(shè)置顏色 WHITE = (255, 255, 255) BLACK = (0, 0, 0) RED = (255, 0, 0) BLUE = (0, 0, 255) GREEN = (0, 255, 0) # 設(shè)置字體 FONT = pygame.font.SysFont('Arial', 24) # 游戲窗口 screen = pygame.display.set_mode((SCREEN_WIDTH, SCREEN_HEIGHT)) pygame.display.set_caption('Bomber Man')
這里我們?cè)O(shè)定了游戲窗口的大小為800x600
像素,炸彈的爆炸時(shí)間為10
個(gè)單位時(shí)間,同時(shí)定義了游戲中會(huì)用到的各種顏色以及字體樣式,并創(chuàng)建了游戲窗口并設(shè)置了窗口標(biāo)題為Bomber Man
。
(二)玩家、敵人與炸彈的初始設(shè)置
接下來,我們對(duì)游戲中的主要元素 —— 玩家、敵人和炸彈進(jìn)行初始設(shè)置。
# 玩家設(shè)置 player_size = 30 player_pos = [SCREEN_WIDTH // 2, SCREEN_HEIGHT // 2] player_speed = 5 player_bombs = 3 player_lives = 3 # 敵人設(shè)置 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}] # 炸彈設(shè)置 bomb_size = 20 bomb_list = [] bomb_timer = 0
對(duì)于玩家,我們?cè)O(shè)定了其初始大小為30
像素,初始位置在窗口中心,移動(dòng)速度為5
像素 / 單位時(shí)間,初始擁有3
顆炸彈且生命值為3
。對(duì)于敵人,其初始大小也為30
像素,初始位置隨機(jī)生成在窗口內(nèi),移動(dòng)速度為3
像素 / 單位時(shí)間,并將其信息存儲(chǔ)在enemy_list
列表中。炸彈則設(shè)置了初始大小,創(chuàng)建了一個(gè)空的炸彈列表bomb_list
用于存儲(chǔ)炸彈信息,同時(shí)初始化炸彈定時(shí)器為0
。
(三)地圖設(shè)置
最后,我們進(jìn)行地圖的設(shè)置。
# 地圖設(shè)置 map_width = 20 map_height = 15 map_grid = [['1' for _ in range(map_width)] for _ in range(map_height)]
這里創(chuàng)建了一個(gè)20x15
的地圖網(wǎng)格map_grid
,其中'1'
表示不可通過的墻體,后續(xù)可根據(jù)炸彈爆炸等情況對(duì)地圖進(jìn)行修改。
三、游戲元素繪制函數(shù)
(一)繪制地圖網(wǎng)格函數(shù)
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)
該函數(shù)用于繪制游戲地圖的網(wǎng)格。通過遍歷地圖網(wǎng)格中的每個(gè)格子,根據(jù)格子的值('1'
為黑色墻體,'0'
為白色可通行區(qū)域)繪制對(duì)應(yīng)的矩形,并且根據(jù)格子類型決定是否繪制邊框。
(二)繪制玩家函數(shù)
def draw_player(): pygame.draw.rect(screen, RED, (player_pos[0], player_pos[1], player_size, player_size))
此函數(shù)簡(jiǎn)單地在玩家當(dāng)前位置繪制一個(gè)紅色的矩形來表示玩家。
(三)繪制敵人函數(shù)
def draw_enemy(): for enemy in enemy_list: pygame.draw.rect(screen, BLUE, (enemy['pos'][0], enemy['pos'][1], enemy_size, enemy_size))
該函數(shù)遍歷敵人列表enemy_list
,在每個(gè)敵人的位置繪制一個(gè)藍(lán)色的矩形來表示敵人。
四、游戲元素移動(dòng)與操作函數(shù)
(一)玩家移動(dòng)函數(shù)
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
通過獲取鍵盤按鍵狀態(tài)keys
,當(dāng)玩家按下左、右、上、下方向鍵時(shí),并且玩家位置在窗口邊界內(nèi),就相應(yīng)地改變玩家的位置坐標(biāo),實(shí)現(xiàn)玩家的移動(dòng)操作。
(二)敵人移動(dòng)函數(shù)
def move_enemy(): for enemy in enemy_list: if random.random() < 0.1: # 隨機(jī)移動(dòng) 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'] # 保持?jǐn)橙嗽诖翱趦?nèi) 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))
敵人的移動(dòng)采用了簡(jiǎn)單的隨機(jī)移動(dòng)策略。在每次循環(huán)中,有10%
的概率敵人會(huì)進(jìn)行移動(dòng),移動(dòng)方向在上下左右四個(gè)方向中隨機(jī)選擇,并且移動(dòng)速度為enemy_speed
。同時(shí),確保敵人的位置始終在游戲窗口內(nèi)。
(三)放置炸彈函數(shù)
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
當(dāng)炸彈定時(shí)器為0
且玩家還有炸彈時(shí),在玩家當(dāng)前位置對(duì)應(yīng)的地圖格子坐標(biāo)處創(chuàng)建一個(gè)炸彈信息并添加到bomb_list
中,同時(shí)更新炸彈定時(shí)器和減少玩家的炸彈數(shù)量。
(四)炸彈爆炸函數(shù)
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
該函數(shù)遍歷炸彈列表bomb_list
,當(dāng)炸彈定時(shí)器歸零時(shí),炸彈爆炸。如果爆炸位置是墻體('1'
),則將其變?yōu)榭赏ㄐ袇^(qū)域('0'
),并且對(duì)爆炸周圍的格子(九宮格范圍內(nèi)除中心格)進(jìn)行遍歷,如果是墻體也將其變?yōu)榭赏ㄐ袇^(qū)域。如果炸彈定時(shí)器未歸零,則將其減1
。
(五)碰撞檢測(cè)函數(shù)
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
此函數(shù)用于檢測(cè)玩家與敵人之間的碰撞。遍歷敵人列表,如果某個(gè)敵人與玩家的位置有重疊,則減少玩家生命值,移除該敵人。如果玩家生命值小于等于0
,則游戲結(jié)束,返回True
,否則返回False
。
五、游戲主循環(huán)
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()
游戲主循環(huán)game_loop
中,首先處理游戲退出事件。然后獲取鍵盤按鍵狀態(tài)并進(jìn)行玩家移動(dòng)和炸彈放置操作。接著移動(dòng)敵人、處理炸彈爆炸邏輯。之后繪制游戲背景、地圖、玩家、敵人和炸彈等元素。再進(jìn)行碰撞檢測(cè),如果游戲結(jié)束則跳出循環(huán)。最后繪制得分和生命值信息,并更新屏幕顯示,控制游戲幀率為30
幀 / 秒。
六、游戲入口
if __name__ == "__main__": game_loop()
在if __name__ == "__main__"
語(yǔ)句塊中調(diào)用game_loop
函數(shù),啟動(dòng)游戲。
七、優(yōu)化內(nèi)容總結(jié)
- 敵人 AI:通過簡(jiǎn)單的隨機(jī)移動(dòng)策略,使敵人具有一定的自主性,增加了游戲的挑戰(zhàn)性。
- 得分系統(tǒng):雖然代碼中未詳細(xì)展示得分增加邏輯(可在放置炸彈時(shí)增加得分等),但已預(yù)留了得分變量
score
,為后續(xù)完善得分系統(tǒng)提供了基礎(chǔ)。 - 生命值:玩家擁有生命值,當(dāng)與敵人碰撞時(shí)生命值減少,當(dāng)生命值為
0
時(shí)游戲結(jié)束,使游戲更加合理和具有緊張感。 - 游戲結(jié)束邏輯:明確了游戲結(jié)束的條件,即玩家生命值耗盡,使游戲有完整的開始和結(jié)束流程。
八、后續(xù)擴(kuò)展方向
這個(gè)優(yōu)化后的代碼已經(jīng)提供了一個(gè)較為完整的炸彈人游戲框架。你可以根據(jù)需要進(jìn)一步擴(kuò)展和優(yōu)化這個(gè)游戲,例如添加更多的敵人類型,不同類型敵人具有不同的移動(dòng)策略和攻擊方式;改進(jìn)地圖生成邏輯,生成更加復(fù)雜和有趣的地圖;增加更多的游戲元素,如道具、陷阱等,以豐富游戲玩法和提高游戲的趣味性與可玩性。
通過以上對(duì)炸彈人游戲代碼的詳細(xì)解析,希望能幫助讀者更好地理解游戲開發(fā)過程中的邏輯構(gòu)建和功能實(shí)現(xiàn),從而在游戲開發(fā)的學(xué)習(xí)和實(shí)踐中取得更大的進(jìn)步。
到此這篇關(guān)于利用Python實(shí)現(xiàn)炸彈人游戲的文章就介紹到這了,更多相關(guān)Python實(shí)現(xiàn)炸彈人游戲內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
關(guān)于torch.scatter與torch_scatter庫(kù)的使用整理
這篇文章主要介紹了關(guān)于torch.scatter與torch_scatter庫(kù)的使用整理,具有很好的參考價(jià)值,希望對(duì)大家有所幫助,如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2023-09-09淺談Python3中datetime不同時(shí)區(qū)轉(zhuǎn)換介紹與踩坑
最近的項(xiàng)目需要根據(jù)用戶所屬時(shí)區(qū)制定一些特定策略,學(xué)習(xí)、應(yīng)用了若干python3的時(shí)區(qū)轉(zhuǎn)換相關(guān)知識(shí),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下2021-08-08用scikit-learn和pandas學(xué)習(xí)線性回歸的方法
這篇文章主要介紹了用scikit-learn和pandas學(xué)習(xí)線性回歸的方法,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-06-06python3 sleep 延時(shí)秒 毫秒實(shí)例
這篇文章主要介紹了python3 sleep 延時(shí)秒 毫秒實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-05-05python+opencv打開攝像頭,保存視頻、拍照功能的實(shí)現(xiàn)方法
今天小編就為大家分享一篇python+opencv打開攝像頭,保存視頻、拍照功能的實(shí)現(xiàn)方法,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01Python面向?qū)ο蠖鄳B(tài)實(shí)現(xiàn)原理及代碼實(shí)例
這篇文章主要介紹了Python面向?qū)ο蠖鄳B(tài)實(shí)現(xiàn)原理及代碼實(shí)例,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-09-09