91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

如何用Python代碼實現擲骰子游戲

發布時間:2022-02-21 15:32:54 來源:億速云 閱讀:767 作者:iii 欄目:開發技術

今天小編給大家分享一下如何用Python代碼實現擲骰子游戲的相關知識點,內容詳細,邏輯清晰,相信大部分人都還太了解這方面的知識,所以分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后有所收獲,下面我們一起來了解一下吧。

構思

骰子是個立方體,有六個面,每個面上,標有不同地點,從 1 個 到 6 個,代表 1 到 6 六個數字,玩的時候,將骰子一擲,等它停下,朝上的面是幾點,就表示搖到了幾。

不同的游戲中,對搖到的點數有不同的玩法,例如飛行棋中,搖到 5 或者 6,可以起飛一架飛機。

現在我需要用程序來模擬這個過程,實際上就是產生 1 到 6 直接的隨機數,直接用 random.randint(1, 6) 就可以搞定,不過我不想就這樣簡單完成,一是對于小孩子來說,直接給出數字不夠直觀,二是,能有機會給兒子炫技一把,何樂不為?

于是構思如下:

  • 找一些骰子的素材,需要有每個數字向上的圖片

  • 為了制造骰子的轉動效果,還需要一些處于轉動中間狀態的圖片

  • 隨機產生 0 到 5 之間的數字,0 代表點數 1,1 代表點數 2,依次類推,5 代表點數 6,為什么不直接生成 1 到 6 呢?后面有解答

  • 擲骰子過程有兩種狀態,即 顯示點數 和 轉動,那么就需要有觸發機制,考慮到小孩子對鼠標操作不靈活,選用空格鍵來控制,按一下就相當于擲一次

實現

素材

先從網上找了些骰子的素材,最終選擇了以微信擲骰子表情圖為元素的一系列 gif 圖片,通過圖片解析工具,從 gif 圖片中提取出每個幀,其中包括了點數朝上的圖片,和轉動中間的圖片,這樣圖片素材就搞定了。

實踐時如果不方便獲得圖片素材,可從本文示例代碼中獲得

接下來,就是編程部分了,使用 pygame 這個 python 游戲引擎庫。

骰子

首先,寫一個 骰子類,用來定義骰子的各種資源,以及管理骰子的狀態,代碼如下:

import random
import pygame


class Dice:
    def __init__(self):
        self.diceRect = pygame.Rect(200, 225, 100, 100)
        self.diceSpin = [
            pygame.image.load("asset/rolling/4.png"),
            pygame.image.load("asset/rolling/3.png"),
            pygame.image.load("asset/rolling/2.png"),
            pygame.image.load("asset/rolling/1.png")
        ]
        self.diceStop = [
            pygame.image.load("asset/dice/1.png"),
            pygame.image.load("asset/dice/2.png"),
            pygame.image.load("asset/dice/3.png"),
            pygame.image.load("asset/dice/4.png"),
            pygame.image.load("asset/dice/5.png"),
            pygame.image.load("asset/dice/6.png")
        ]


        self.StopStatus = random.randint(0, 5)
        self.SpinStatus = 0


    def move(self):
        self.SpinStatus += 1
        if self.SpinStatus == len(self.diceSpin):
            self.SpinStatus = 0
  • 初始化方法中,用 pygame.Rect 方法設定了一個矩形區域,即游戲窗口坐標為(200, 225),高度和寬度都為 100,這個矩形區域是為了在游戲窗口中繪制骰子用的

  • diceSpin 存儲了骰子轉動過程中的圖片素材,注意需要用 pygame.image.load 方法加載圖片資源

  • diceStop 存儲了骰子點數的圖片素材

  • StopStatus 記錄骰子停止狀態的點數值,在 0 ~ 5 之間,初始化為一個隨機數

  • SpinStatus 記錄轉動過程中當前幀的圖片索引,默認為 0

  • move 方法相當于一個轉動控制器,每調用一次會改變一次轉動中圖片的索引,骰子轉動過程中會反復被調用

引擎

接下來,編寫一個游戲引擎類,用于驅動游戲過程,代碼如下:

import random
import sys
import pygame


class Game:
    def __init__(self, width=500, height=600):
        pygame.init()
        size = width, height
        self.screen = pygame.display.set_mode(size)
        self.clock = pygame.time.Clock()
        self.screen.fill((255, 255, 255))


        self.rollTimes = 0  # 擲骰子過程的幀數記錄
        self.Dice = Dice()
        self.start = False  # 狀態標識
        self.rollCount = random.randint(3, 10)  # 初始投擲幀數


    def roll(self):
        self.screen.blit(self.Dice.diceSpin[self.Dice.SpinStatus], self.Dice.diceRect)
        self.Dice.move()
        self.rollTimes += 1
        if self.rollTimes > self.rollCount:
            self.start = False
            self.rollCount = random.randint(3, 10)
            self.Dice.StopStatus = random.randint(0, 5)
            self.rollTimes = 0


    def stop(self):
        self.screen.blit(self.Dice.diceStop[self.Dice.StopStatus], self.Dice.diceRect)


    def run(self):
        while True:
            self.clock.tick(10)
            for event in pygame.event.get():
                if event.type == pygame.QUIT:
                    sys.exit()
                if ((event.type == pygame.KEYDOWN and event.key==pygame.K_SPACE) \
                or event.type == pygame.MOUSEBUTTONDOWN) \
                and self.start == False:
                    self.start = True


            if self.start:
                self.roll()
            else:
                self.stop()
            pygame.display.update()
  • 初始化方法中,做了游戲窗口的初始化,并設定了窗口大小,然后對過程中的控制類變量做了初始化

  • roll 方法為拋擲,拋擲過程中會被反復調用,先設置一個轉動中圖片,然后,調用骰子的 move 方法,得到一個新的轉動狀態

  • roll 方法中,接下來是一個控制器,如果達到了設定的轉動次數,就停止,并得到隨機的點數

  • stop 方法,在停止轉動時調用,將轉動停止時的點數圖片繪制到窗口上,這里StopStatus 范圍是 0 ~ 5,剛好對應 diceStop 列表的索引,這就是隨機數范圍是 0~5 的原因

  • run 方法是引擎的啟動入口,它啟動了一個事件循環

  • 循環中,檢查一遍事件記錄,如果接收到了退出事件,則結束循環

  • 如果接收到了按下空格鍵或者鼠標鍵,且投擲狀態為停止時,將投擲狀態設置為開始

  • 檢查完事件記錄,判斷投擲狀態,如果是開始狀態,調用 roll 方法,否則調用 stop 方法

  • 最后每次循環都需要調用 pygame.display.update() 刷新一次窗口

這里需要說明下 clock.tick,它的作用是讓循環每秒執行多少次,抽象來說可以理解為動畫的幀,即每秒多少幀。

相對于 clock.tick,我們更熟悉 time.sleep,后者表示等待多久再執行,那么 clock.tick(10) 的效果就相當于 time.sleep(0.1),即每秒執行 10 次,就等于每次等待十分之一秒。

運行

if __name__ == '__main__':
    Game().run()

注意:將目錄切換到代碼目錄下運行,否則可能提示找不到圖片文件。

以上就是“如何用Python代碼實現擲骰子游戲”這篇文章的所有內容,感謝各位的閱讀!相信大家閱讀完這篇文章都有很大的收獲,小編每天都會為大家更新不同的知識,如果還想學習更多的知識,請關注億速云行業資訊頻道。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

顺平县| 抚顺县| 阿瓦提县| 黔西| 中卫市| 萨迦县| 蒙阴县| 武乡县| 天祝| 开远市| 大余县| 沿河| 平度市| 互助| 荥经县| 克东县| 永州市| 合阳县| 两当县| 平山县| 巩留县| 和田市| 马龙县| 和政县| 德钦县| 高州市| 芜湖县| 庆安县| 工布江达县| 芦山县| 闽清县| 安泽县| 汝城县| 太保市| 加查县| 白山市| 昌平区| 钟祥市| 城固县| 丰县| 广德县|