大家好,我是Lex 喜歡欺負超人那個Lex
擅長領域:python開發、網路安全滲透、Windows域控Exchange架構
今日重點:今天,我們一起用pygame來寫一個星空滿天的接盤俠小游戲吧~~~
【詳細步驟+完整原始碼 見 文末,建議收藏!!!】
一、環境要求
環境搭建博客鏈接
一起來學pygame吧 游戲開發30例(開篇詞)——環境搭建+游戲效果展示
windows系統,python3.6+ pip21+
安裝游戲依賴模塊
pip install pygame
二、游戲介紹
1、游戲目標
今天做一個小時候,紅白機上玩過的一個小游戲,天上掉下各種水果、錢幣等等,然后 我們的主角在下面 來回走動,抓住錢幣加分,
并且右上角加上時間限制,如果超過時間 自動結束,這些我們都可以在程式中進行設定,
2、先上游戲效果圖

三、完整開發流程
1、專案主結構
首先,先整理一下專案的主結構,其實看一下主結構,基本就清晰了
mduls:存放自己寫的python類
——endinterface.py:
——food.py:定義我們天上 往下掉的各種物品
——hero.py:定義我們的主人公類
res:存放參考到的圖片、音頻等等
——auds:音瞥澩
——imgs:圖片資源
——fonts:字體
cfg.py:為主組態檔
money.py:主程式檔案
requirements.txt:需要引入的python依賴包

2、詳細配置
cfg.py
組態檔中,需要引入os模塊,并且配置打開游戲的螢屏大小,
'''組態檔'''
import os
'''圖片素材路徑'''
IMAGE_PATHS = {
'gold': os.path.join(os.getcwd(), 'resources/images/gold.png'),
'apple': os.path.join(os.getcwd(), 'resources/images/apple.png'),
'background': os.path.join(os.getcwd(), 'resources/images/background.jpg'),
'hero': [os.path.join(os.getcwd(), 'resources/images/%d.png' % i) for i in range(1, 11)],
}
'''音頻素材路徑'''
AUDIO_PATHS = {
'bgm': os.path.join(os.getcwd(), 'resources/audios/bgm.mp3'),
'get': os.path.join(os.getcwd(), 'resources/audios/get.wav'),
}
'''字體路徑'''
FONT_PATH = os.path.join(os.getcwd(), 'resources/font/font.TTF')
'''最高分記錄的路徑'''
HIGHEST_SCORE_RECORD_FILEPATH = 'highest.rec'
'''游戲螢屏大小'''
SCREENSIZE = (800, 600)
'''背景顏色'''
BACKGROUND_COLOR = (0, 160, 233)
'''fps'''
FPS = 30
3、錢幣和掉下物品的類
food.py:第一部分
這是我們主要的第一個模塊,我們把天上往下掉落的物品,在這里進行定義,通過random讓物品隨機產生,并且掉落,
'''
Function:
定義金幣等掉落的物品
Author:
Lex
微信公眾號:
hacklex
'''
import pygame
import random
'''定義食物類'''
class Food(pygame.sprite.Sprite):
def __init__(self, images_dict, selected_key, screensize, **kwargs):
pygame.sprite.Sprite.__init__(self)
self.screensize = screensize
self.image = images_dict[selected_key]
self.mask = pygame.mask.from_surface(self.image)
self.rect = self.image.get_rect()
self.rect.left, self.rect.bottom = random.randint(20, screensize[0]-20), -10
self.speed = random.randrange(5, 10)
self.score = 1 if selected_key == 'gold' else 5
'''更新食物位置'''
def update(self):
self.rect.bottom += self.speed
if self.rect.top > self.screensize[1]:
return True
return False
4、我們的主角類
hero.py 第二部分
初始化我們的主角,接收金幣的小人,讓他可以左右移動,
詳細注釋,都寫在代碼里了,大家一定要看一遍,不要跑起來,就不管了哦
'''
Function:
定義接金幣的小人
Author:
Lex
微信公眾號:
hacklex
'''
import pygame
'''定義hero類'''
class Hero(pygame.sprite.Sprite):
def __init__(self, images, position=(375, 520), **kwargs):
pygame.sprite.Sprite.__init__(self)
self.images_right = images[:5]
self.images_left = images[5:]
self.images = self.images_right.copy()
self.image = self.images[0]
self.mask = pygame.mask.from_surface(self.image)
self.rect = self.image.get_rect()
self.rect.left, self.rect.top = position
self.diretion = 'right'
self.speed = 8
self.switch_frame_count = 0
self.switch_frame_freq = 1
self.frame_index = 0
'''左右移動hero'''
def move(self, screensize, direction):
assert direction in ['left', 'right']
if direction != self.diretion:
self.images = self.images_left.copy() if direction == 'left' else self.images_right.copy()
self.image = self.images[0]
self.diretion = direction
self.switch_frame_count = 0
self.switch_frame_count += 1
if self.switch_frame_count % self.switch_frame_freq == 0:
self.switch_frame_count = 0
self.frame_index = (self.frame_index + 1) % len(self.images)
self.image = self.images[self.frame_index]
if direction == 'left':
self.rect.left = max(self.rect.left-self.speed, 0)
else:
self.rect.left = min(self.rect.left+self.speed, screensize[0])
'''畫到螢屏上'''
def draw(self, screen):
screen.blit(self.image, self.rect)
5、游戲結束的畫面

6、歷史最高得分記錄
創建一個highest.rec檔案來存盤,歷史最高得分記錄,

7、資源相關
包括游戲背景音頻、圖片和字體設計
resources
audios:加載游戲背景音樂
fonts:記分牌相關字體
images:這個是關鍵了哦,如果這個加載不了,我們的消消樂 就啥都沒得了
8、啟動主程式
money.py
在主程式中,通過讀取組態檔,引入專案資源:包括圖片、音頻等,并從我們的modules里引入所有我們的模塊,
'''
Function:
接金幣小游戲
Author:
Lex
微信公眾號:
hacklex
'''
import os
import cfg
import sys
import pygame
import random
from modules import *
'''游戲初始化'''
def initGame():
# 初始化pygame, 設定展示視窗
pygame.init()
screen = pygame.display.set_mode(cfg.SCREENSIZE)
pygame.display.set_caption('catch coins —— hacklex')
# 加載必要的游戲素材
game_images = {}
for key, value in cfg.IMAGE_PATHS.items():
if isinstance(value, list):
images = []
for item in value: images.append(pygame.image.load(item))
game_images[key] = images
else:
game_images[key] = pygame.image.load(value)
game_sounds = {}
for key, value in cfg.AUDIO_PATHS.items():
if key == 'bgm': continue
game_sounds[key] = pygame.mixer.Sound(value)
# 回傳初始化資料
return screen, game_images, game_sounds
'''主函式'''
def main():
# 初始化
screen, game_images, game_sounds = initGame()
# 播放背景音樂
pygame.mixer.music.load(cfg.AUDIO_PATHS['bgm'])
pygame.mixer.music.play(-1, 0.0)
# 字體加載
font = pygame.font.Font(cfg.FONT_PATH, 40)
# 定義hero
hero = Hero(game_images['hero'], position=(375, 520))
# 定義食物組
food_sprites_group = pygame.sprite.Group()
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
# 當前分數/歷史最高分
score = 0
highest_score = 0 if not os.path.exists(cfg.HIGHEST_SCORE_RECORD_FILEPATH) else int(open(cfg.HIGHEST_SCORE_RECORD_FILEPATH).read())
# 游戲主回圈
clock = pygame.time.Clock()
while True:
# --填充背景
screen.fill(0)
screen.blit(game_images['background'], (0, 0))
# --倒計時資訊
countdown_text = 'Count down: ' + str((90000 - pygame.time.get_ticks()) // 60000) + ":" + str((90000 - pygame.time.get_ticks()) // 1000 % 60).zfill(2)
countdown_text = font.render(countdown_text, True, (0, 0, 0))
countdown_rect = countdown_text.get_rect()
countdown_rect.topright = [cfg.SCREENSIZE[0]-30, 5]
screen.blit(countdown_text, countdown_rect)
# --按鍵檢測
for event in pygame.event.get():
if event.type == pygame.QUIT:
pygame.quit()
sys.exit()
key_pressed = pygame.key.get_pressed()
if key_pressed[pygame.K_a] or key_pressed[pygame.K_LEFT]:
hero.move(cfg.SCREENSIZE, 'left')
if key_pressed[pygame.K_d] or key_pressed[pygame.K_RIGHT]:
hero.move(cfg.SCREENSIZE, 'right')
# --隨機生成食物
generate_food_count += 1
if generate_food_count > generate_food_freq:
generate_food_freq = random.randint(10, 20)
generate_food_count = 0
food = Food(game_images, random.choice(['gold',] * 10 + ['apple']), cfg.SCREENSIZE)
food_sprites_group.add(food)
# --更新食物
for food in food_sprites_group:
if food.update(): food_sprites_group.remove(food)
# --碰撞檢測
for food in food_sprites_group:
if pygame.sprite.collide_mask(food, hero):
game_sounds['get'].play()
food_sprites_group.remove(food)
score += food.score
if score > highest_score: highest_score = score
# --畫hero
hero.draw(screen)
# --畫食物
food_sprites_group.draw(screen)
# --顯示得分
score_text = f'Score: {score}, Highest: {highest_score}'
score_text = font.render(score_text, True, (0, 0, 0))
score_rect = score_text.get_rect()
score_rect.topleft = [5, 5]
screen.blit(score_text, score_rect)
# --判斷游戲是否結束
if pygame.time.get_ticks() >= 90000:
break
# --更新螢屏
pygame.display.flip()
clock.tick(cfg.FPS)
# 游戲結束, 記錄最高分并顯示游戲結束畫面
fp = open(cfg.HIGHEST_SCORE_RECORD_FILEPATH, 'w')
fp.write(str(highest_score))
fp.close()
return showEndGameInterface(screen, cfg, score, highest_score)
'''run'''
if __name__ == '__main__':
while main():
pass

四、游戲啟動方法
1、開發工具啟動
如果你配置了開發工具的環境VScode、sublimeText、notepad+、pycharm什么的,可以直接在工具中,運行游戲,
如果沒配置,可以使用命令啟動,
2、命令列啟動 gif

五、專案完整代碼
游戲完整原始碼
1、pygame開發實戰開發30例 完整原始碼
https://download.csdn.net/download/weixin_42350212/15836285
2、訂閱專欄,獲取完整原始碼+教程
一起來學pygame吧 游戲開發30例(四)——俄羅斯方塊小游戲
一起來學pygame吧 游戲開發30例(二)——塔防游戲
優質資源
- Java實作照片GPS定位【完整腳本】
- https://download.csdn.net/download/weixin_42350212/20024262
- Python實作照片GPS定位【完整腳本】
- https://download.csdn.net/download/weixin_42350212/19776215
- 女神忘記相冊密碼 python20行代碼打開【完整腳本】
- https://download.csdn.net/download/weixin_42350212/19871942
- python修改證件照底色、大小、背景、摳圖【完整原始碼】
- https://download.csdn.net/download/weixin_42350212/19815306
推薦閱讀
【python實戰】前女友婚禮,python破解婚禮現場的WIFI,把名稱改成了
【python實戰】前女友發來加密的 “520快樂.pdf“,我用python破解開之后,卻發現
【python實戰】昨晚,我用python幫隔壁小姐姐P證件照 自拍,然后發現...
【python實戰】女友半夜加班發自拍 python男友用30行代碼發現驚天秘密
【python實戰】python你TM太皮了——區區30行代碼就能記錄鍵盤的一舉一動
【python實戰】女神相冊密碼忘記了,我只用Python寫了20行代碼~~~
推薦專欄
滲透測驗實戰專欄
Windows AD/Exchange管理專欄
Linux高性能服務器搭建
PowerShell自動化專欄
CSDN官方學習推薦 ↓ ↓ ↓
CSDN出的Python和Java的全堆疊知識圖譜,太強了,推薦給大家!

轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/292236.html
標籤:其他
