python實作CRAPS賭博游戲(搖骰子)
如果你是大佬,請跳過這篇文章,這篇文章是寫給入門級童鞋看的,下面,我將站在小白的角度去剖析這樣一個游戲的代碼實作,
首先,每一個初學特困者肯定都會在編程初期產生一個誤區:代碼是一次性寫出來的,但是確不知,實際上就算是大佬,一個程式就算他寫過很多遍,他再次寫這個程式時,也不可能是按照“順序結構”撰寫代碼,因為從來沒有一個人可以在短時間內將一件事所有可能發生的情況考慮的非常周到,而任何程式實際上都是在撰寫時都是先搭好一個簡單的框架,而再差缺補漏,慢慢完善,最終得到一份優質的代碼,一個大佬級的程式員,寫代碼都是先“搭框架”,所謂的搭框架就像是你在寫考試試卷時寫的草稿,先繪制一份解決問題的草圖,這份草圖可能并不能作為最終的設計圖,但是它卻產生了重要的作用,而往往這樣一份草圖是不可或缺的,所以,如果你覺得編程難,可能只是你編程的方式不對,而并非是思維上的限制,看完這篇文章,相信你會有識訓的,
CRAPS賭博游戲(搖骰子)規則:
玩家搖兩顆色子,如果第一次搖出了7點或11點,玩家勝;如果搖出了2點、3點、12點,莊家勝;
如果搖出了其他的點數,游戲繼續,玩家重新搖色子;如果玩家搖出了第一次搖的點數,玩家勝;
如果玩家搖出了7點,莊家勝;如果玩家搖出其他點數,游戲繼續,玩家重新搖色子,直到分出勝負,
游戲開始之前,玩家有1000元的初始資金,玩家可以下注,贏了獲得下注的金額,輸了就扣除下注的金額,游戲結束的條件是玩家把錢輸光,
一開始,看著這樣長長的規則,相信很多小伙伴就已經覺得繁瑣了,然后就拋出一句“好難”,或放棄,或直接不加思索的看別人寫好的代碼,例如這樣
import random # 匯入隨機模塊,不知道沒關系,這里知道它能用來產生亂數就行
money = 1000
while money > 0:
print(f"你的余額為{money}元")
xiazhu = int(input("請輸入下注金額:"))
flag = False # 記錄玩家輸贏狀態
ran = random.randrange(1, 7) + random.randrange(1, 7)# 生成玩家產生的骰子搖出隨機點數
print(f"你搖出了{ran}點")
if ran == 7 and ran == 11:
print("玩家勝利")
flag = True
elif ran in (2,3,12): # ran 在這個元組里面說明搖到了這幾個點數之一
print("莊家勝利")
else:
while True:
# 再搖一次
ran1 = random.randrange(1, 7) + random.randrange(1, 7)
print(f"你搖出了{ran1}點")
# 比較ran1和第一次搖的ran
if ran1 == ran:
print("玩家勝利")
flag = True # 玩家勝利
break # 跳出當前回圈
elif ran1 == 7:
print("莊家勝利") # 莊家勝利
break
# 都不符合條件說明沒有判斷出勝負,繼續回圈
if flag:
money += xiazhu
print(f"你贏的了{xiazhu}元")
else:
money -= xiazhu
print(f"你輸掉了{xiazhu}元")
print("游戲結束!")
接下來,看一眼這樣的代碼,很多人覺得太長了,肯定很復雜,于是,很可能你的編程之路就停在這里,
但是,其實,這樣的代碼,并沒有什么難度,可以這樣說,不需要很高深的數學知識,也不需要你有很強的邏輯推斷能力,只要你敢開始敲,你就已經成功一半了,
搖骰子大家都會吧?我們首先來看一下第一個要求:**玩家搖兩顆色子,如果第一次搖出了7點或11點,玩家勝;如果搖出了2點、3點、12點,莊家勝;**注意這里說的是搖兩顆骰子,既然是兩顆骰子,那是不是拿這兩顆骰子出現的點數相加,然后判斷它等于幾點,這里的如果是不是就是程式中的if ,很明顯,產生點數后,需要用到分支結構去判斷往哪里執行,于是,根據這些,可以初略寫出下面的代碼:
產生骰子隨機點數ran
if ran == 7 and ran == 11:
pass #(先用pass占上一個位置,后面來補全,實際上這里應該是寫玩家勝利相關代碼)
elif ran == 2 or ran == 3 or ran == 12:
pass # 莊家勝利
也可以先寫成這樣
import random # 匯入隨機模塊,不知道沒關系,這里知道它能用來產生亂數就行
ran1 = random.randrange(1, 7) # 產生一個1到6的亂數
ran2 = random.randrange(1, 7) # 產生第二個1到6的亂數
ran = ran1 + ran2 # 生成玩家產生的骰子搖出的隨機點數,以上三行代碼可以寫成一行,看下面一個代碼塊
if ran == 7 and ran == 11:
print("玩家勝利")
elif ran == 2 or ran == 3 or ran == 12:
print("莊家勝利")
調整一下
import random # 匯入隨機模塊,不知道沒關系,這里知道它能用來產生亂數就行
ran = random.randrange(1, 7) + random.randrange(1, 7)# 生成玩家產生的骰子搖出隨機點數
if ran == 7 and ran == 11:
print("玩家勝利")
elif ran in (2,3,12): # ran 在這個元組里面說明搖到了這幾個點數之一
print("莊家勝利")
是不是第一個要求就寫好了呢?編程似乎也沒有這么難對不對?
下面接著看,如果搖出了其他的點數,游戲繼續,玩家重新搖色子;如果玩家搖出了第一次搖的點數,玩家勝;如果玩家搖出了7點,莊家勝;如果玩家搖出其他點數,游戲繼續,玩家重新搖色子,直到分出勝負,
繼續看,若搖出了其他點數是不是緊接著剛才的分支結構,是前面的分支結構中的一種情況,然后接著是不是就是在這種情況下重新再搖骰子,再判斷,值得注意的是,這里說若搖出的骰子仍然沒有分出勝負,還要繼續搖,那是否這里就要用一個回圈的?沒有分出勝負就要再重復之前的動作,而且我們并不知道搖具體搖多少次才能分出勝負,因此不能用for回圈,要用while回圈,知道回圈需要執行多少次用for回圈,不知道用while回圈
因此,下面的代碼也可以初略寫成這樣:
while True:
# 再搖一次
ran1 = random.randrange(1, 7) + random.randrange(1, 7)
# 比較ran和第一次搖的
if ran1 == ran:
pass # 玩家勝利
break # 跳出當前回圈
elif ran1 == 7:
pass # 莊家勝利
break
# 都不符合條件說明沒有判斷出勝負,繼續回圈
這樣是不是就實作了一大半了?
實際上到這兒,整個程式的核心代碼就已經寫好了,剩下的就是看看還差點什么小要求,
接著看
**游戲開始之前,玩家有1000元的初始資金,玩家可以下注,贏了獲得下注的金額,輸了就扣除下注的金額,游戲結束的條件是玩家把錢輸光,**現在我們的代碼已經如下:
import random # 匯入隨機模塊,不知道沒關系,這里知道它能用來產生亂數就行
ran = random.randrange(1, 7) + random.randrange(1, 7)# 生成玩家產生的骰子搖出隨機點數
if ran == 7 and ran == 11:
print("玩家勝利")
elif ran in (2,3,12): # ran 在這個元組里面說明搖到了這幾個點數之一
print("莊家勝利")
while True:
# 再搖一次
ran1 = random.randrange(1, 7) + random.randrange(1, 7)
# 比較ran1和第一次搖的ran
if ran1 == ran:
pass # 玩家勝利
break # 跳出當前回圈
elif ran1 == 7:
pass # 莊家勝利
break
# 都不符合條件說明沒有判斷出勝負,繼續回圈
游戲開始之前,玩家有1000元的初始資金這個不用想吧,直接在前面定義就行了,接著,玩家可以下注,贏了獲得下注的金額,輸了就扣除下注的金額,那么是不是要給出一個input讓用戶下注,接著要判斷玩家的輸贏,那么,我們可以用一個布林值(bool)來記錄玩家的勝敗狀態,先定義一個布爾變數flag,令它等于False代表當前沒有勝利,如果在代碼中有它勝利了的地方,就將這個值改變True,那么,在游戲的最后再看看flag是不是就可以知道是莊家還是玩家贏了,同時,我們只要判斷除了勝負,就可以決定對玩家下注的錢扣除還是賠付了,最后,游戲結束的條件是玩家把錢輸光,那我們就再做一個死回圈,將這代碼放進去,設定停下的條件是金額<=0就行了,現在代碼就可以寫成這樣了(完整代碼)
import random # 匯入隨機模塊,不知道沒關系,這里知道它能用來產生亂數就行
money = 1000
while money > 0:
print(f"你的余額為{money}元")
xiazhu = int(input("請輸入下注金額:"))
flag = False # 記錄玩家輸贏狀態
ran = random.randrange(1, 7) + random.randrange(1, 7)# 生成玩家產生的骰子搖出隨機點數
print(f"你搖出了{ran}點")
if ran == 7 and ran == 11:
print("玩家勝利")
flag = True
elif ran in (2,3,12): # ran 在這個元組里面說明搖到了這幾個點數之一
print("莊家勝利")
else:
while True:
# 再搖一次
ran1 = random.randrange(1, 7) + random.randrange(1, 7)
print(f"你搖出了{ran1}點")
# 比較ran1和第一次搖的ran
if ran1 == ran:
print("玩家勝利")
flag = True # 玩家勝利
break # 跳出當前回圈
elif ran1 == 7:
print("莊家勝利") # 莊家勝利
break
# 都不符合條件說明沒有判斷出勝負,繼續回圈
if flag:
money += xiazhu
print(f"你贏的了{xiazhu}元")
else:
money -= xiazhu
print(f"你輸掉了{xiazhu}元")
print("游戲結束!")
這樣,這個游戲就完全實作好了,學廢了嗎,趕緊讓代碼跑起來吧
如果對你有幫助,不要忘記點贊、關注、評論加收藏哦!
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/292590.html
標籤:其他
