主頁 > 軟體設計 > 滿天星空小游戲—小白一學就會的python游戲開發實戰【原始碼+教程】

滿天星空小游戲—小白一學就會的python游戲開發實戰【原始碼+教程】

2021-08-07 08:38:53 軟體設計

大家好,我是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

標籤:其他

上一篇:CPU、MPU、MCU、SOC的概念與區別

下一篇:??三萬字《C/C++面試突擊200題》四年面試官爆肝整合??(附答案,建議收藏)

標籤雲
其他(157675) Python(38076) JavaScript(25376) Java(17977) C(15215) 區塊鏈(8255) C#(7972) AI(7469) 爪哇(7425) MySQL(7132) html(6777) 基礎類(6313) sql(6102) 熊猫(6058) PHP(5869) 数组(5741) R(5409) Linux(5327) 反应(5209) 腳本語言(PerlPython)(5129) 非技術區(4971) Android(4554) 数据框(4311) css(4259) 节点.js(4032) C語言(3288) json(3245) 列表(3129) 扑(3119) C++語言(3117) 安卓(2998) 打字稿(2995) VBA(2789) Java相關(2746) 疑難問題(2699) 细绳(2522) 單片機工控(2479) iOS(2429) ASP.NET(2402) MongoDB(2323) 麻木的(2285) 正则表达式(2254) 字典(2211) 循环(2198) 迅速(2185) 擅长(2169) 镖(2155) 功能(1967) .NET技术(1958) Web開發(1951) python-3.x(1918) HtmlCss(1915) 弹簧靴(1913) C++(1909) xml(1889) PostgreSQL(1872) .NETCore(1853) 谷歌表格(1846) Unity3D(1843) for循环(1842)

熱門瀏覽
  • 面試突擊第一季,第二季,第三季

    第一季必考 https://www.bilibili.com/video/BV1FE411y79Y?from=search&seid=15921726601957489746 第二季分布式 https://www.bilibili.com/video/BV13f4y127ee/?spm_id_fro ......

    uj5u.com 2020-09-10 05:35:24 more
  • 第三單元作業總結

    1.前言 這應該是本學期最后一次寫作業總結了吧。總體來說,對作業的節奏也差不多掌握了,作業做起來的效率也更高了。雖然和之前的作業一樣,作業中都要用到新的知識,但是相比之前,更加懂得了如何利用工具以及資料。雖然之間卡過殼,但總體而言,這幾次作業還算完成的比較好。 2.作業程序總結 相比前兩個單元,此單 ......

    uj5u.com 2020-09-10 05:35:41 more
  • 北航OO(2020)第四單元博客作業暨課程總結博客

    北航OO(2020)第四單元博客作業暨課程總結博客 本單元作業的架構設計 在本單元中,由于UML圖具有比較清晰的樹形結構,因此我對其中需要進行查詢操作的元素進行了包裝,在樹的父節點中存盤所有孩子的參考。考慮到性能問題,我采用了快取機制,一次查詢后盡可能快取已經遍歷過的資訊,以減少遍歷次數。 本單元我 ......

    uj5u.com 2020-09-10 05:35:48 more
  • BUAA_OO_第四單元

    一、UML決議器設計 ? 先看下題目:第四單元實作一個基于JDK 8帶有效性檢查的UML(Unified Modeling Language)類圖,順序圖,狀態圖分析器 MyUmlInteraction,實際上我們要建立一個有向圖模型,UML中的物件(元素)可能與同級元素連接,也可與低級元素相連形成 ......

    uj5u.com 2020-09-10 05:35:54 more
  • 6.1邏輯運算子

    邏輯運算子 1. && 短路與 運算式1 && 運算式2 01.運算式1為true并且運算式2也為true 整體回傳為true 02.運算式1為false,將不會執行運算式2 整體回傳為false 03.只要有一個運算式為false 整體回傳為false 2. || 短路或 運算式1 || 運算式2 ......

    uj5u.com 2020-09-10 05:35:56 more
  • BUAAOO 第四單元 & 課程總結

    1. 第四單元:StarUml檔案決議 本單元采用了圖模型決議UML。 UML檔案可以抽象為圖、子圖、邊的邏輯結構。 在實作中,圖的節點包括類、介面、屬性,子圖包括狀態圖、順序圖等。 采用了三次遍歷UML元素的方法建圖,第一遍遍歷建點,第二、三次遍歷設定屬性、連邊,實作圖物件的初始化。這里借鑒了一些 ......

    uj5u.com 2020-09-10 05:36:06 more
  • 談談我對C# 多型的理解

    面向物件三要素:封裝、繼承、多型。 封裝和繼承,這兩個比較好理解,但要理解多型的話,可就稍微有點難度了。今天,我們就來講講多型的理解。 我們應該經常會看到面試題目:請談談對多型的理解。 其實呢,多型非常簡單,就一句話:呼叫同一種方法產生了不同的結果。 具體實作方式有三種。 一、多載 多載很簡單。 p ......

    uj5u.com 2020-09-10 05:36:09 more
  • Python 資料驅動工具:DDT

    背景 python 的unittest 沒有自帶資料驅動功能。 所以如果使用unittest,同時又想使用資料驅動,那么就可以使用DDT來完成。 DDT是 “Data-Driven Tests”的縮寫。 資料:http://ddt.readthedocs.io/en/latest/ 使用方法 dd. ......

    uj5u.com 2020-09-10 05:36:13 more
  • Python里面的xlrd模塊詳解

    那我就一下面積個問題對xlrd模塊進行學習一下: 1.什么是xlrd模塊? 2.為什么使用xlrd模塊? 3.怎樣使用xlrd模塊? 1.什么是xlrd模塊? ?python操作excel主要用到xlrd和xlwt這兩個庫,即xlrd是讀excel,xlwt是寫excel的庫。 今天就先來說一下xl ......

    uj5u.com 2020-09-10 05:36:28 more
  • 當我們創建HashMap時,底層到底做了什么?

    jdk1.7中的底層實作程序(底層基于陣列+鏈表) 在我們new HashMap()時,底層創建了默認長度為16的一維陣列Entry[ ] table。當我們呼叫map.put(key1,value1)方法向HashMap里添加資料的時候: 首先,呼叫key1所在類的hashCode()計算key1 ......

    uj5u.com 2020-09-10 05:36:38 more
最新发布
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:20:47 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:20:25 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:20:17 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:20:10 more
  • 【中介者設計模式詳解】C/Java/JS/Go/Python/TS不同語言實作

    * 中介者模式是一種行為型設計模式,它可以用來減少類之間的直接依賴關系,
    * 將物件之間的通信封裝到一個中介者物件中,從而使得各個物件之間的關系更加松散。
    * 在中介者模式中,物件之間不再直接相互互動,而是通過中介者來中轉訊息。 ......

    uj5u.com 2023-04-20 08:19:44 more
  • 露天煤礦現場調研和交流案例分享

    他們集團的資訊化公司及研究院在一個礦區正在做智能礦山的統一平臺的 試點,專案投資大概1億,包括了礦山的各方面的內容,顯示得我們這次交流有點多余。他們2年前開始做智能礦山的規劃,有很多煤礦行業專家的加持,他們的描述是非常完美,但是去年底應該上線的平臺,現在還沒有看到影子。他們確實有很多場景需求,但是被... ......

    uj5u.com 2023-04-20 08:19:07 more
  • 《社區人員管理》實戰案例設計&個人案例分享

    設計是一個讓人夢想成真程序,開始編碼、測驗、除錯之前進行需求分析和架構設計,才能保證關鍵方面都做正確 ......

    uj5u.com 2023-04-20 08:18:57 more
  • 軟體架構生態化-多角色交付的探索實踐

    作為一個技術架構師,不僅僅要緊跟行業技術趨勢,還要結合研發團隊現狀及痛點,探索新的交付方案。在日常中,你是否遇到如下問題 “ 業務需求排期長研發是瓶頸;非研發角色感受不到研發技改提效的變化;引入ISV 團隊又擔心質量和安全,培訓周期長“等等,基于此我們探索了一種新的技術體系及交付方案來解決如上問題。 ......

    uj5u.com 2023-04-20 08:18:49 more
  • 05單件模式

    #經典的單件模式 public class Singleton { private static Singleton uniqueInstance; //一個靜態變數持有Singleton類的唯一實體。 // 其他有用的實體變數寫在這里 //構造器宣告為私有,只有Singleton可以實體化這個類! ......

    uj5u.com 2023-04-19 08:42:51 more
  • 【架構與設計】常見微服務分層架構的區別和落地實踐

    軟體工程的方方面面都遵循一個最基本的道理:沒有銀彈,架構分層模型更是如此,每一種都有各自優缺點,所以請根據不同的業務場景,并遵循簡單、可演進這兩個重要的架構原則選擇合適的架構分層模型即可。 ......

    uj5u.com 2023-04-19 08:42:41 more