Python小遊戲—計算機發牌(二)

原創不易,轉載前請註明博主的鏈接地址: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庫的使用,內容相對較簡單,思路也不復雜,比較考驗基礎。這篇內容寫到這了,同時也希望大佬們批評指正,因爲是新手難免會有說的不恰當甚至錯誤的內容,還請大佬們不要手下留情。
 

 在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章