【开发该软件的操作系统】:windows10
【软件开发环境/开发工具】:PyCharm
【编程语言】:Python
【开发目的】:这是老师布置的作业啦~ 供初学者参考学习
【开发者】:江西农业大学2020级大二学生
题目要求:
使用字典完成斗地主
思路如下:
完成发牌任务就好,这篇文章主要是参考的,脑洞大开了啦!
代码(一)如下:(参考文章)Python实现斗地主
- #---------------第一种方法:初始化所有牌并随机分配法---------------------
- import random
- cardList = [('红桃','A'),('红桃','2'),('红桃','3'),('红桃','4'),('红桃','5'),('红桃','6'),('红桃','7'),
- ('红桃','8'),('红桃','9'),('红桃','10'),('红桃','J'),('红桃','Q'),('红桃','K'),
- ('方块','A'),('方块','2'),('方块','3'),('方块','4'),('方块','5'),('方块','6'),('方块','7'),
- ('方块','8'),('方块','9'),('方块','10'),('方块','J'),('方块','Q'),('方块','K'),
- ('黑桃','A'),('黑桃','2'),('黑桃','3'),('黑桃','4'),('黑桃','5'),('黑桃','6'),('黑桃','7'),
- ('黑桃','8'),('黑桃','9'),('黑桃','10'),('黑桃','J'),('黑桃','Q'),('黑桃','K'),
- ('梅花','A'),('梅花','2'),('梅花','3'),('梅花','4'),('梅花','5'),('梅花','6'),('梅花','7'),
- ('梅花','8'),('梅花','9'),('梅花','10'),('梅花','J'),('梅花','Q'),('梅花','K'),('大王','RedJoker'),('小王','BlackJoker')]
- cardRand = random.sample(cardList,54)
-
- HandCard = cardRand[0:3] #3张底牌
- player1 = cardRand[3:20]
- player2 = cardRand[20:37]
- player3 = cardRand[37:54]
-
- print('底牌:')
- print(HandCard)
- print('玩家一的牌:')
- print(player1)
- print('玩家二的牌:')
- print(player2)
- print('玩家三的牌:')
- print(player3)
结果如下:
- 底牌:
- [('黑桃', '3'), ('方块', 'A'), ('梅花', '5')]
- 玩家一的牌:
- [('梅花', '4'), ('梅花', '3'), ('红桃', 'A'), ('红桃', '7'), ('方块', '3'), ('方块', '5'), ('梅花', '9'), ('黑桃', 'Q'), ('红桃', '10'), ('方块', '2'), ('梅花', '2'), ('方块', 'K'), ('方块', '10'), ('方块', '8'), ('黑桃', 'K'), ('梅花', 'Q'), ('黑桃', '2')]
- 玩家二的牌:
- [('黑桃', '9'), ('方块', '9'), ('梅花', 'A'), ('红桃', 'K'), ('大王', 'RedJoker'), ('黑桃', '7'), ('黑桃', '4'), ('红桃', '6'), ('红桃', '9'), ('黑桃', '10'), ('红桃', '2'), ('黑桃', 'A'), ('梅花', 'J'), ('梅花', '8'), ('方块', 'Q'), ('黑桃', '5'), ('红桃', '5')]
- 玩家三的牌:
- [('方块', '6'), ('黑桃', '6'), ('红桃', 'J'), ('梅花', 'K'), ('方块', '7'), ('红桃', '3'), ('红桃', 'Q'), ('黑桃', 'J'), ('方块', 'J'), ('方块', '4'), ('红桃', '4'), ('梅花', '7'), ('梅花', '10'), ('黑桃', '8'), ('红桃', '8'), ('小王', 'BlackJoker'), ('梅花', '6')]
代码(二)如下: (参考文章)Python实现斗地主
- # #---------------第二种方法:类方法和装饰器---------------------
- import random
- class Poke():
- poke = [] # 扑克牌牌堆
- p1 = [] # 玩家一牌堆
- p2 = [] # 玩家二牌堆
- p3 = [] # 玩家三牌堆
- last = None # 底牌牌堆
- def __init__(self,f,num): # 初始化牌堆
- self.flower = f # 花色
- self.num = num # 点数
- def __str__(self):
- return "%s%s" % (self.flower,self.num) # 返回牌值
- @classmethod
- def init(cls): # 定义牌堆
- ph = ("♥","♠","♣","♦") # 花色元组
- pnum = ("2","3","4","5","6","7","8","9","10","J","Q","K","A") # 点数元组
- king = {"big":"大王","small":"小王"} # 大小王
- for p in ph: # 循环遍历花色
- for _nump in pnum: # 循环遍历点数
- cls.poke.append(Poke(p,_nump)) # 装牌
- cls.poke.append(Poke(king["big"],"")) # 装大王
- cls.poke.append(Poke(king["small"],"")) # 装小王
- @classmethod
- def wash(cls): # 洗牌
- random.shuffle(cls.poke)
- @classmethod
- def send(cls): # 发牌
- for _ in range(0,17): # 三个人每人发17张牌,_表示一个随机参数和i一样,实际用不到,循环17次
- cls.p1.append(cls.poke.pop(0)) # 玩家一发牌,牌堆抛出第1个元素附加给p1
- cls.p2.append(cls.poke.pop(0)) #剩下的牌堆抛出第1个元素附加给p2
- cls.p3.append(cls.poke.pop(0)) #剩下的牌堆抛出第1个元素附加给p3
- cls.last= tuple(cls.poke) # 最后三张牌做底牌
- @classmethod
- def show(cls): # 展示牌
- print("玩家1:")
- for pokes in cls.p1:
- print(pokes,end = " ")
- print()
- print("玩家2:")
- for pokes in cls.p2:
- print(pokes, end=" ")
- print()
- print("玩家3:")
- for pokes in cls.p3:
- print(pokes, end=" ")
- print()
- print("底牌:")
- for pokes in cls.last:
- print(pokes, end=" ")
- print()
-
- Poke.init()
- Poke.wash()
- Poke.send()
- Poke.show()
-
- '''
- 类方法:是类对象所拥有的方法,需要用修饰器@classmethod来标识其为类方法,对于类方法,
- 第一个参数必须是类对象,一般以cls作为第一个参数(当然可以用其他名称的变量作为其第一个参数,
- 但是大部分人都习惯以'cls'作为第一个参数的名字,就最好用'cls'了),能够通过实例对象和类对象去访问。
- 静态方法:需要通过修饰器@staticmethod来进行修饰,静态方法不需要多定义参数,实例对象和类对象都可以调用
- '''
结果如下:
- 玩家1:
- ♠Q ♠A ♥J ♦10 ♠10 ♦K ♥10 ♥K ♣2 ♥3 ♥A ♠7 ♥5 ♣6 ♣7 ♠8 ♥8
- 玩家2:
- ♣8 ♦9 ♥4 ♣3 ♦3 ♦Q ♦7 ♣4 ♠3 ♠K ♦4 ♠4 ♠6 ♥7 ♠9 ♣10 ♥Q
- 玩家3:
- ♦8 ♦6 ♦A ♣J ♦2 ♥6 ♣K 大王 ♠5 ♥2 ♠2 ♣Q ♣A ♣9 ♦J ♣5 小王
- 底牌:
- ♥9 ♠J ♦5
代码(二)如下:
- import random
-
-
- # 初始化一副牌
- def init_cards():
- cards_list = []
- for i in range(54):
- cards_list.append(i + 1)
- return cards_list
-
-
- def swap(the_list, num1, num2):
- temp = the_list[num1]
- the_list[num1] = the_list[num2]
- the_list[num2] = temp
-
-
- # 洗牌
- def make_cards_random(cards_list):
- for i in range(100):
- a = random.randint(0, 53)
- b = random.randint(0, 53)
- swap(cards_list, a, b)
-
-
- # 底牌
- def back_cards(list_cards):
- index_a = random.randint(36, 53)
- index_b = random.randint(18, 35)
- index_c = random.randint(0, 17)
-
- get_a = list_cards.pop(index_a)
- get_b = list_cards.pop(index_b)
- get_c = list_cards.pop(index_c)
- return get_a, get_b, get_c
-
-
- # 发牌给三个人
- def get_cards(cards_list):
- return cards_list[0:17], cards_list[17:34], cards_list[34:51]
-
-
- def to_card(number):
- if number % 13 == 1:
- number = "A"
- elif number % 13 == 11:
- number = "J"
- elif number % 13 == 12:
- number = "Q"
- elif number % 13 == 0:
- number = "K"
- else:
- number %= 13
- return str(number)
-
-
- # 把数字装换成对应的花色+数字
- def show_cards(list_cards):
- for i in list_cards:
- if i > 0 and i <= 13:
- print("♠" + to_card(i), end=' ')
- elif i > 13 and i <= 26:
- print("♥" + to_card(i), end=' ')
- elif i > 26 and i <= 39:
- print("♣" + to_card(i), end=' ')
- elif i > 39 and i <= 52:
- print("♦" + to_card(i), end=' ')
- elif i == 53:
- print("小王", end=' ')
- elif i == 54:
- print("大王", end=' ')
- else:
- print("出错啦!", end=' ')
-
-
- # 开始游戏
- def play_game():
- cards = init_cards()
- make_cards_random(cards)
-
- back = back_cards(cards)
-
- person_1, person_2, person_3 = get_cards(cards)
-
- for i in back:
- person_1.append(i)
-
- print("\n底牌是:")
- show_cards(back)
- print("\n地主牌是:")
- show_cards(person_1)
- print("\n农民1的牌是:")
- show_cards(person_2)
- print("\n农民2的牌是:")
- show_cards(person_3)
-
-
- if __name__ == '__main__':
- play_game()
结果如下:
- 底牌是:
- ♦6 ♦2 ♦K
- 地主牌是:
- ♠6 ♠K ♠7 ♥7 ♥5 ♥J ♣K ♦7 ♣6 ♣J ♦9 ♥3 ♦J ♥A ♥10 ♣Q ♣A ♦6 ♦2 ♦K
- 农民1的牌是:
- ♥4 ♣3 ♥9 ♣10 ♥Q ♦3 ♠Q ♣8 ♦8 ♦4 ♠10 ♣9 ♦Q ♠4 ♥8 ♥6 ♥2
- 农民2的牌是:
- ♣7 ♠A ♣4 ♣5 ♠8 ♦A ♠J ♦5 ♣2 小王 ♠9 ♥K ♦10 ♠5 ♠3 大王 ♠2