2022年 11月 7日

python使用字典完成斗地主

【开发该软件的操作系统】:windows10

【软件开发环境/开发工具】:PyCharm

【编程语言】:Python

【开发目的】:这是老师布置的作业啦~ 供初学者参考学习

【开发者】:江西农业大学2020级大二学生

题目要求:

使用字典完成斗地主

思路如下:

完成发牌任务就好,这篇文章主要是参考的,脑洞大开了啦!

代码(一)如下:(参考文章)Python实现斗地主

  1. #---------------第一种方法:初始化所有牌并随机分配法---------------------
  2. import random
  3. cardList = [('红桃','A'),('红桃','2'),('红桃','3'),('红桃','4'),('红桃','5'),('红桃','6'),('红桃','7'),
  4. ('红桃','8'),('红桃','9'),('红桃','10'),('红桃','J'),('红桃','Q'),('红桃','K'),
  5. ('方块','A'),('方块','2'),('方块','3'),('方块','4'),('方块','5'),('方块','6'),('方块','7'),
  6. ('方块','8'),('方块','9'),('方块','10'),('方块','J'),('方块','Q'),('方块','K'),
  7. ('黑桃','A'),('黑桃','2'),('黑桃','3'),('黑桃','4'),('黑桃','5'),('黑桃','6'),('黑桃','7'),
  8. ('黑桃','8'),('黑桃','9'),('黑桃','10'),('黑桃','J'),('黑桃','Q'),('黑桃','K'),
  9. ('梅花','A'),('梅花','2'),('梅花','3'),('梅花','4'),('梅花','5'),('梅花','6'),('梅花','7'),
  10. ('梅花','8'),('梅花','9'),('梅花','10'),('梅花','J'),('梅花','Q'),('梅花','K'),('大王','RedJoker'),('小王','BlackJoker')]
  11. cardRand = random.sample(cardList,54)
  12. HandCard = cardRand[0:3] #3张底牌
  13. player1 = cardRand[3:20]
  14. player2 = cardRand[20:37]
  15. player3 = cardRand[37:54]
  16. print('底牌:')
  17. print(HandCard)
  18. print('玩家一的牌:')
  19. print(player1)
  20. print('玩家二的牌:')
  21. print(player2)
  22. print('玩家三的牌:')
  23. print(player3)

结果如下:

  1. 底牌:
  2. [('黑桃', '3'), ('方块', 'A'), ('梅花', '5')]
  3. 玩家一的牌:
  4. [('梅花', '4'), ('梅花', '3'), ('红桃', 'A'), ('红桃', '7'), ('方块', '3'), ('方块', '5'), ('梅花', '9'), ('黑桃', 'Q'), ('红桃', '10'), ('方块', '2'), ('梅花', '2'), ('方块', 'K'), ('方块', '10'), ('方块', '8'), ('黑桃', 'K'), ('梅花', 'Q'), ('黑桃', '2')]
  5. 玩家二的牌:
  6. [('黑桃', '9'), ('方块', '9'), ('梅花', 'A'), ('红桃', 'K'), ('大王', 'RedJoker'), ('黑桃', '7'), ('黑桃', '4'), ('红桃', '6'), ('红桃', '9'), ('黑桃', '10'), ('红桃', '2'), ('黑桃', 'A'), ('梅花', 'J'), ('梅花', '8'), ('方块', 'Q'), ('黑桃', '5'), ('红桃', '5')]
  7. 玩家三的牌:
  8. [('方块', '6'), ('黑桃', '6'), ('红桃', 'J'), ('梅花', 'K'), ('方块', '7'), ('红桃', '3'), ('红桃', 'Q'), ('黑桃', 'J'), ('方块', 'J'), ('方块', '4'), ('红桃', '4'), ('梅花', '7'), ('梅花', '10'), ('黑桃', '8'), ('红桃', '8'), ('小王', 'BlackJoker'), ('梅花', '6')]

代码(二)如下:  (参考文章)Python实现斗地主

  1. # #---------------第二种方法:类方法和装饰器---------------------
  2. import random
  3. class Poke():
  4. poke = [] # 扑克牌牌堆
  5. p1 = [] # 玩家一牌堆
  6. p2 = [] # 玩家二牌堆
  7. p3 = [] # 玩家三牌堆
  8. last = None # 底牌牌堆
  9. def __init__(self,f,num): # 初始化牌堆
  10. self.flower = f # 花色
  11. self.num = num # 点数
  12. def __str__(self):
  13. return "%s%s" % (self.flower,self.num) # 返回牌值
  14. @classmethod
  15. def init(cls): # 定义牌堆
  16. ph = ("♥","♠","♣","♦") # 花色元组
  17. pnum = ("2","3","4","5","6","7","8","9","10","J","Q","K","A") # 点数元组
  18. king = {"big":"大王","small":"小王"} # 大小王
  19. for p in ph: # 循环遍历花色
  20. for _nump in pnum: # 循环遍历点数
  21. cls.poke.append(Poke(p,_nump)) # 装牌
  22. cls.poke.append(Poke(king["big"],"")) # 装大王
  23. cls.poke.append(Poke(king["small"],"")) # 装小王
  24. @classmethod
  25. def wash(cls): # 洗牌
  26. random.shuffle(cls.poke)
  27. @classmethod
  28. def send(cls): # 发牌
  29. for _ in range(0,17): # 三个人每人发17张牌,_表示一个随机参数和i一样,实际用不到,循环17次
  30. cls.p1.append(cls.poke.pop(0)) # 玩家一发牌,牌堆抛出第1个元素附加给p1
  31. cls.p2.append(cls.poke.pop(0)) #剩下的牌堆抛出第1个元素附加给p2
  32. cls.p3.append(cls.poke.pop(0)) #剩下的牌堆抛出第1个元素附加给p3
  33. cls.last= tuple(cls.poke) # 最后三张牌做底牌
  34. @classmethod
  35. def show(cls): # 展示牌
  36. print("玩家1:")
  37. for pokes in cls.p1:
  38. print(pokes,end = " ")
  39. print()
  40. print("玩家2:")
  41. for pokes in cls.p2:
  42. print(pokes, end=" ")
  43. print()
  44. print("玩家3:")
  45. for pokes in cls.p3:
  46. print(pokes, end=" ")
  47. print()
  48. print("底牌:")
  49. for pokes in cls.last:
  50. print(pokes, end=" ")
  51. print()
  52. Poke.init()
  53. Poke.wash()
  54. Poke.send()
  55. Poke.show()
  56. '''
  57. 类方法:是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,
  58. 第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,
  59. 但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
  60. 静态方法:需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,实例对象和类对象都可以调用
  61. '''

结果如下:

  1. 玩家1:
  2. ♠Q ♠A ♥J ♦10 ♠10 ♦K ♥10 ♥K ♣2 ♥3 ♥A ♠7 ♥5 ♣6 ♣7 ♠8 ♥8
  3. 玩家2:
  4. ♣8 ♦9 ♥4 ♣3 ♦3 ♦Q ♦7 ♣4 ♠3 ♠K ♦4 ♠4 ♠6 ♥7 ♠9 ♣10 ♥Q
  5. 玩家3:
  6. ♦8 ♦6 ♦A ♣J ♦2 ♥6 ♣K 大王 ♠5 ♥2 ♠2 ♣Q ♣A ♣9 ♦J ♣5 小王
  7. 底牌:
  8. ♥9 ♠J ♦5

 代码(二)如下:

  1. import random
  2. # 初始化一副牌
  3. def init_cards():
  4. cards_list = []
  5. for i in range(54):
  6. cards_list.append(i + 1)
  7. return cards_list
  8. def swap(the_list, num1, num2):
  9. temp = the_list[num1]
  10. the_list[num1] = the_list[num2]
  11. the_list[num2] = temp
  12. # 洗牌
  13. def make_cards_random(cards_list):
  14. for i in range(100):
  15. a = random.randint(0, 53)
  16. b = random.randint(0, 53)
  17. swap(cards_list, a, b)
  18. # 底牌
  19. def back_cards(list_cards):
  20. index_a = random.randint(36, 53)
  21. index_b = random.randint(18, 35)
  22. index_c = random.randint(0, 17)
  23. get_a = list_cards.pop(index_a)
  24. get_b = list_cards.pop(index_b)
  25. get_c = list_cards.pop(index_c)
  26. return get_a, get_b, get_c
  27. # 发牌给三个人
  28. def get_cards(cards_list):
  29. return cards_list[0:17], cards_list[17:34], cards_list[34:51]
  30. def to_card(number):
  31. if number % 13 == 1:
  32. number = "A"
  33. elif number % 13 == 11:
  34. number = "J"
  35. elif number % 13 == 12:
  36. number = "Q"
  37. elif number % 13 == 0:
  38. number = "K"
  39. else:
  40. number %= 13
  41. return str(number)
  42. # 把数字装换成对应的花色+数字
  43. def show_cards(list_cards):
  44. for i in list_cards:
  45. if i > 0 and i <= 13:
  46. print("♠" + to_card(i), end=' ')
  47. elif i > 13 and i <= 26:
  48. print("♥" + to_card(i), end=' ')
  49. elif i > 26 and i <= 39:
  50. print("♣" + to_card(i), end=' ')
  51. elif i > 39 and i <= 52:
  52. print("♦" + to_card(i), end=' ')
  53. elif i == 53:
  54. print("小王", end=' ')
  55. elif i == 54:
  56. print("大王", end=' ')
  57. else:
  58. print("出错啦!", end=' ')
  59. # 开始游戏
  60. def play_game():
  61. cards = init_cards()
  62. make_cards_random(cards)
  63. back = back_cards(cards)
  64. person_1, person_2, person_3 = get_cards(cards)
  65. for i in back:
  66. person_1.append(i)
  67. print("\n底牌是:")
  68. show_cards(back)
  69. print("\n地主牌是:")
  70. show_cards(person_1)
  71. print("\n农民1的牌是:")
  72. show_cards(person_2)
  73. print("\n农民2的牌是:")
  74. show_cards(person_3)
  75. if __name__ == '__main__':
  76. play_game()

结果如下:

  1. 底牌是:
  2. 62 ♦K
  3. 地主牌是:
  4. 6 ♠K ♠775 ♥J ♣K ♦76 ♣J ♦93 ♦J ♥A10QA62 ♦K
  5. 农民1的牌是:
  6. 43910Q3Q884109Q4862
  7. 农民2的牌是:
  8. 7A458A ♠J ♦52 小王 ♠9 ♥K ♦1053 大王 ♠2

 共同进步,祝大家学有所成!