原創不易,轉載前請註明博主的鏈接地址:Blessy_Zhu https://blog.csdn.net/weixin_42555080
本次代碼的環境:
運行平臺: Windows
Python版本: Python3.x
IDE: PyCharm
1. 遊戲背景
4個牌手打牌,計算機隨機將52張牌(不含大小王)發給4名牌手,並在屏幕上顯示每牌手的牌,要求發牌要顯示正確的花色和牌面。如:方塊10 方塊9 方塊K
2.代碼及結果展示
廢話不多說,還是先給出代碼:
import random
class cardGame(object):
def __init__(self):
self.n = 52
self.pocker = [i for i in range(self.n)] # 列表生成器,生成0-53的數字
#洗牌
def shuffle(self,n):
x = 100
while (x > 0):
x = x - 1
p1 = random.randint(0, n - 1)
p2 = random.randint(0, n - 1)
t = self.pocker[p1]
self.pocker[p1] = self.pocker[p2]
self.pocker[p2] = t
return self.pocker
# 獲取拍的花色
def getColor(self,x):
color = ['草花', '方塊', '紅桃', '黑桃']
c = int(x / 13)
if c < 0 or c >= 4:
return 'ERROR!'
return color[c]
# 獲取拍的牌面大小
def getValue(self,x):
value = x % 13
if value == 0:
return 'A'
elif value >= 1 and value <= 9:
return str(value + 1)
elif value == 10:
return 'J'
elif value == 11:
return 'Q'
elif value == 12:
return 'K'
#顯示畫面和牌數
def getPuk(self,x):
return self.getColor(x) + self.getValue(x)
if __name__ == '__main__':
cg = cardGame()
(a, b, c, d) = ([], [], [], [])
disorderCard = cg.shuffle(cg.n)
for x in range(13):
m = x * 4
a.append(cg.getPuk(disorderCard[m]))
b.append(cg.getPuk(disorderCard[m + 1]))
c.append(cg.getPuk(disorderCard[m + 2]))
d.append(cg.getPuk((disorderCard[m + 3])))
a.sort()#將發的牌按順序排列
b.sort()
c.sort()
d.sort()
print('\n牌手1', end=':')
for x in a:
print(x, end=' ')
print('\n牌手2', end=":")
for x in b:
print(x, end=' ')
print('\n牌手3', end=":")
for x in c:
print(x, end=' ')
print('\n牌手4', end=":")
for x in d:
print(x, end=' ')
結果如圖1所示:
圖1
3.代碼分析
這個問題中主要的問題有三個:
- (1)如何洗牌
- (2)如何表示不同花色的牌面,如:方塊10 方塊9 方塊K
- (3)如何在一行顯示牌手接收的牌
針對第(1)個問題可以通過定義一個函數shuffle()隨機產生兩個位置索引,交換兩個位置的牌,進行100次隨機交換兩張牌,從而達到洗牌目的。針對第(2)將要發的52張牌按梅花0-12方塊13-25 ,紅桃26-38,黑桃39-51順序編號並存儲在pocker列表(未洗牌之前),pocker的0-51的數字用列表生成器生成。如果列表某元素存儲是14則說明是方塊2,26則說明是紅桃A。針對第三個問題可以通過 一個for循環和print(’’, end=":")使得牌手的牌在一行顯示
這樣就定義一個cardGame類:在__init__(self)中定義公共變量;
在shuffle(self,n)完成洗牌的動作,其中代碼:
x = 100
while (x > 0):
x = x - 1
p1 = random.randint(0, n - 1)
p2 = random.randint(0, n - 1)
t = self.pocker[p1]
self.pocker[p1] = self.pocker[p2]
self.pocker[p2] = t
是隨機產生兩個位置索引,交換兩個位置的牌,進行100次隨機交換兩張牌,從而達到洗牌目的。
getColor()函數是獲取花色,前面已經定義了:將要發的52張牌按梅花0-12方塊13-25 ,紅桃26-38,黑桃39-51,那麼比如51的牌就是黑桃51/13 = 3,color[3] = ‘黑桃’
def getColor(self,x):
color = ['草花', '方塊', '紅桃', '黑桃']
c = int(x / 13)
if c < 0 or c >= 4:
return 'ERROR!'
return color[c]
下面代碼,定義getValue()函數,如果牌面是2-10則正常輸出,如果牌面是1----》A,11---->J,12---->Q,13---->K(因爲隨機數比實際小1,所以以上說的都是+1後的對應)
def getValue(self,x):
value = x % 13
if value == 0:
return 'A'
elif value >= 1 and value <= 9:
return str(value + 1)
elif value == 10:
return 'J'
elif value == 11:
return 'Q'
elif value == 12:
return 'K'
如下代碼getPuk()是將花色和牌面統一起來,組合成如:草花4 草花9 草花K 草花Q 黑桃10 黑桃J
def getPuk(self,x):
return self.getColor(x) + self.getValue(x)
最後通過主函數調用cardGame類中的函數,生成最終的結果。
for x in range(13):
m = x * 4
a.append(cg.getPuk(disorderCard[m]))
b.append(cg.getPuk(disorderCard[m + 1]))
c.append(cg.getPuk(disorderCard[m + 2]))
d.append(cg.getPuk((disorderCard[m + 3])))
a.sort()#將發的牌按順序排列
b.sort()
c.sort()
d.sort()
X.append()函數是將生成的亂序的牌按照順序一張張發給牌手,X.sort()函數是將發的牌按照順序排列(先按字母順序:方塊、紅桃、草花、黑桃,再按數字順序:1-10,J、Q、K)
總結
這個小遊戲又是random庫的使用,內容相對較簡單,思路也不復雜,比較考驗基礎。這篇內容寫到這了,同時也希望大佬們批評指正,因爲是新手難免會有說的不恰當甚至錯誤的內容,還請大佬們不要手下留情。