鱼C论坛

 找回密码
 立即注册
查看: 8457|回复: 35

[技术交流] 小练习分发扑克牌程序选手作品投票

[复制链接]
发表于 2016-1-20 18:09:49 | 显示全部楼层 |阅读模式
1月9日出了小练习:分发扑克牌 -> http://bbs.fishc.com/thread-67841-1-1.html

大家踊跃答题,本想10天后结束答题,但因昨天有事,改在今天了。

这次大家用了不同的方法完成题意,我也深受启发。

为评出最佳的答案,采用大家投票的方式,投票时间5天。每个选手可以在跟帖中拉票,说明为什么自己的最好。但不得以作弊的方式投票。


原题目要求:

  • 列出完整的程序。
  • 牌为随机分发。
  • 程序以“添加代码文字”方式发布。4. 每个花色从大到小列出,即A,K,Q,J,10...2。


奖励:

  • 前10名回帖奖励。
  • 第一个答出符合题意的和最佳回答的给予奖励。最好写出思路和注释。

多选投票: ( 最多可选 5 项 ), 共有 4 人参与投票

投票已经结束

42.86% (3)
14.29% (1)
0.00% (0)
14.29% (1)
0.00% (0)
14.29% (1)
0.00% (0)
0.00% (0)
0.00% (0)
14.29% (1)
您所在的用户组没有投票权限

评分

参与人数 3荣誉 +14 鱼币 +14 贡献 +13 收起 理由
康小泡 + 5 + 5 + 5 楼主辛苦了
小甲鱼 + 8 + 8 + 8 NICE~
zooo + 1 + 1 感谢楼主无私奉献!

查看全部评分

本帖被以下淘专辑推荐:

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:12:40 | 显示全部楼层
zooo的答案:

思路:
cardList存52张牌(也可以用循环代替手打。。)
实现
random.sample([cardlist,  52)产生52个不同的随机数,然后分给4个list
============== RESTART: C:\Users\Administrator\Desktop\test.py ==============
玩家一的牌:
[('方块', '9'), ('梅花', '2'), ('红桃', '8'), ('梅花', '8'), ('红桃', '5'), ('梅花', '9'), ('红桃', '9'), ('梅花', 'K'), ('方块', '6'), ('红桃', '10'), ('红桃', '6'), ('黑桃', '3')]
玩家二的牌:
[('方块', '2'), ('黑桃', 'Q'), ('方块', 'K'), ('方块', '8'), ('梅花', '5'), ('红桃', 'A'), ('梅花', '7'), ('黑桃', '6'), ('红桃', 'K'), ('方块', '3'), ('方块', 'J'), ('黑桃', '4')]
玩家三的牌:
[('黑桃', 'A'), ('黑桃', '5'), ('梅花', '10'), ('梅花', 'J'), ('红桃', 'J'), ('梅花', '3'), ('方块', '5'), ('方块', '10'), ('梅花', '6'), ('红桃', '3'), ('黑桃', '2'), ('黑桃', '8')]
玩家四的牌:
[('方块', '4'), ('方块', '7'), ('黑桃', '10'), ('方块', 'A'), ('红桃', '4'), ('黑桃', 'J'), ('红桃', '7'), ('黑桃', 'K'), ('梅花', 'A'), ('梅花', '4'), ('梅花', 'Q'), ('红桃', '2')]


  1. import random
  2. cardList = [('红桃','A'),('红桃','2'),('红桃','3'),('红桃','4'),('红桃','5'),('红桃','6'),('红桃','7'),
  3.             ('红桃','8'),('红桃','9'),('红桃','10'),('红桃','J'),('红桃','Q'),('红桃','K'),
  4.             ('方块','A'),('方块','2'),('方块','3'),('方块','4'),('方块','5'),('方块','6'),('方块','7'),
  5.             ('方块','8'),('方块','9'),('方块','10'),('方块','J'),('方块','Q'),('方块','K'),
  6.             ('黑桃','A'),('黑桃','2'),('黑桃','3'),('黑桃','4'),('黑桃','5'),('黑桃','6'),('黑桃','7'),
  7.             ('黑桃','8'),('黑桃','9'),('黑桃','10'),('黑桃','J'),('黑桃','Q'),('黑桃','K'),
  8.             ('梅花','A'),('梅花','2'),('梅花','3'),('梅花','4'),('梅花','5'),('梅花','6'),('梅花','7'),
  9.             ('梅花','8'),('梅花','9'),('梅花','10'),('梅花','J'),('梅花','Q'),('梅花','K')]
  10. cardRand = random.sample(cardList,52)

  11. player1 = cardRand[0:12]
  12. player2 = cardRand[13:25]
  13. player3 = cardRand[26:38]
  14. player4 = cardRand[39:51]

  15. print('玩家一的牌:')
  16. print(player1)
  17. print('玩家二的牌:')
  18. print(player2)
  19. print('玩家三的牌:')
  20. print(player3)
  21. print('玩家四的牌:')
  22. print(player4)
复制代码


又发帖补充:
思路:
cardList存52张牌
每一张牌有3个属性,exp:('红桃','0','2')->第1和第3个属性为牌的花色和点数,第2个属性用于排序
实现
random.sample([cardlist,  52)产生52个不同的随机数,然后分给4个list
player.sort()排序
cardDisp():显示

第一位玩家的牌:
黑桃-2 红桃-A 红桃-8 红桃-2 红桃-10 梅花-8 梅花-7 梅花-10 方块-J 方块-9 方块-6 方块-5
第二位玩家的牌:
黑桃-A 黑桃-9 黑桃-6 黑桃-10 红桃-K 红桃-Q 红桃-5 红桃-4 梅花-K 梅花-2 方块-A 方块-4
第三位玩家的牌:
黑桃-K 黑桃-Q 黑桃-J 黑桃-7 黑桃-3 红桃-J 红桃-6 红桃-3 梅花-Q 梅花-5 方块-2 方块-10
第四位玩家的牌:
黑桃-8 黑桃-5 黑桃-4 红桃-9 梅花-A 梅花-9 梅花-6 梅花-4 梅花-3 方块-K 方块-Q 方块-7
  1. #发牌程序
  2. import random
  3. cardList = [('红桃','4','A'),('红桃','0','2'),('红桃','0','3'),('红桃','0','4'),('红桃','0','5'),('红桃','0','6'),('红桃','0','7'),
  4.             ('红桃','0','8'),('红桃','0','9'),('红桃','0','10'),('红桃','1','J'),('红桃','2','Q'),('红桃','3','K'),
  5.             ('方块','4','A'),('方块','0','2'),('方块','0','3'),('方块','0','4'),('方块','0','5'),('方块','0','6'),('方块','0','7'),
  6.             ('方块','0','8'),('方块','0','9'),('方块','0','10'),('方块','1','J'),('方块','2','Q'),('方块','3','K'),
  7.             ('黑桃','4','A'),('黑桃','0','2'),('黑桃','0','3'),('黑桃','0','4'),('黑桃','0','5'),('黑桃','0','6'),('黑桃','0','7'),
  8.             ('黑桃','0','8'),('黑桃','0','9'),('黑桃','0','10'),('黑桃','1','J'),('黑桃','2','Q'),('黑桃','3','K'),
  9.             ('梅花','4','A'),('梅花','0','2'),('梅花','0','3'),('梅花','0','4'),('梅花','0','5'),('梅花','0','6'),('梅花','0','7'),
  10.             ('梅花','0','8'),('梅花','0','9'),('梅花','0','10'),('梅花','1','J'),('梅花','2','Q'),('梅花','3','K')]
  11. cardRand = random.sample(cardList,52)#打乱顺序
  12. #分割
  13. player1 = cardRand[0:12]
  14. player2 = cardRand[13:25]
  15. player3 = cardRand[26:38]
  16. player4 = cardRand[39:51]
  17. #排序
  18. player1.sort(reverse = 1)
  19. player2.sort(reverse = 1)
  20. player3.sort(reverse = 1)
  21. player4.sort(reverse = 1)
  22. #显示
  23. def cardDisp(player):
  24.     for j in range(12):
  25.         print(player[j][0],player[j][2],sep='-',end=' ')
  26.     print()
  27. print('第一位玩家的牌:')
  28. cardDisp(player1)
  29. print('第二位玩家的牌:')
  30. cardDisp(player2)
  31. print('第三位玩家的牌:')
  32. cardDisp(player3)
  33. print('第四位玩家的牌:')
  34. cardDisp(player4)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:13:46 | 显示全部楼层
VVFock3r答案
  1. #!/usr/bin/env python
  2. #coding:utf-8
  3. #Python Version: 3.x
  4. import random
  5. import copy

  6. CardType = ['黑桃', '红心', '方块', '草花']
  7. CardNumber = ['2','3','4' ,'5','6','7','8','9','10','J','Q','K','A']
  8. Player = {'玩家1':{}, '玩家2':{}, '玩家3':{}, '玩家4':{}}

  9. #获取所有的纸牌
  10. CARDS = {}
  11. for i in CardType:
  12.     CARDS[i] = copy.copy(CardNumber)

  13. #给玩家占坑
  14. for i in Player.copy().keys():
  15.     for j in CardType:
  16.         Player[i][j] = []

  17. #print('*' * 10,'初始化纸牌','*' * 10)
  18. #print(CARDS,'\n')
  19. #print('*' * 10,'初始化玩家','*' * 10)
  20. #print(Player,'\n')

  21. def GetRandomCard():
  22.     '''随机获取纸牌'''
  23.     RandomType = random.choice(list(CARDS.keys()))
  24.     RandomNumber = random.choice(CARDS[RandomType])
  25.     return {RandomType:RandomNumber}

  26. def RemoveCard(card):
  27.     '''删除纸牌'''
  28.     Key = ''.join(list(card.keys()))
  29.     Value = card[Key]
  30.     CARDS[Key].remove(Value)
  31.     if len(CARDS[Key]) == 0:
  32.         del CARDS[Key]

  33. Result = []
  34. while True:
  35.     try:
  36.         CurrentPlayer = Player.popitem()
  37.     except KeyError:
  38.         break
  39.     for i in range(13):
  40.         RandomCard = GetRandomCard()
  41.         Type = ''.join(list(RandomCard.keys()))
  42.         Number = list(RandomCard.values())[0]
  43.         CurrentPlayer[1][Type].append(Number)
  44.         RemoveCard(RandomCard)
  45.     Result.append(CurrentPlayer)

  46. #重新排序,格式化输出
  47. Result = sorted(Result, key=lambda x: x[0])
  48. for i in Result:
  49.     print(i[0] + '手中纸牌:')
  50.     for j in CardType:
  51.         print(j, end=' ' * 3)
  52.         hero = i[1][j]
  53.         #对纸牌进行排序
  54.         herobuffer = copy.copy(CardNumber)
  55.         for x in copy.copy(herobuffer):
  56.             if x not in hero:
  57.                 herobuffer.remove(x)
  58.         herobuffer.reverse()
  59.         hero = herobuffer

  60.         for z in hero:
  61.             print('{z:3}'.format(z=z), end='')
  62.         print()
  63.     print()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:14:22 | 显示全部楼层
kebikobe答案
  1. import random

  2. # 定义扑克牌
  3. list = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 'J', 'Q', 'K']
  4. heitao = []
  5. hongxin = []
  6. fangkuai = []
  7. caohua = []
  8. for i in range(len(list)):
  9.     heitao.append('黑桃' + str(list[i]))
  10. for i in range(len(list)):
  11.     hongxin.append('红心' + str(list[i]))
  12. for i in range(len(list)):
  13.     fangkuai.append('方块' + str(list[i]))
  14. for i in range(len(list)):
  15.     caohua.append('草花' + str(list[i]))
  16. puke = heitao + hongxin + fangkuai + caohua

  17. # 打乱牌序
  18. random.shuffle(puke)

  19. # 将扑克牌分发给四位玩家
  20. player1 = puke[:13]
  21. player2 = puke[13:26]
  22. player3 = puke[26:39]
  23. player4 = puke[39:]
  24. player = [player1, player2, player3, player4]

  25. # 将四位玩家的扑克牌按花色分组
  26. puke1 = [[], [], [], []]
  27. puke2 = [[], [], [], []]
  28. puke3 = [[], [], [], []]
  29. puke4 = [[], [], [], []]
  30. puke = [puke1, puke2, puke3, puke4]

  31. for p in range(4):
  32.     for each in player[p]:
  33.         if each[:2] == '黑桃':
  34.             puke[p][0].append(each)
  35.         elif each[:2] == '红心':
  36.             puke[p][1].append(each)
  37.         elif each[:2] == '方块':
  38.             puke[p][2].append(each)
  39.         else:
  40.             puke[p][3].append(each)

  41. # 打印输出
  42. for i in range(4):
  43.     print('\n玩家%d手中的纸牌:' % (i+1))
  44.     print('黑桃:', end=' ')
  45.     for each in puke[i][0]:
  46.         if each[-1] == '0':
  47.             print(each[-2:], end=' ')
  48.         else:
  49.             print(each[-1], end=' ')
  50.     print('\n红心:', end=' ')
  51.     for each in puke[i][1]:
  52.         if each[-1] == '0':
  53.             print(each[-2:], end=' ')
  54.         else:
  55.             print(each[-1], end=' ')
  56.     print('\n方块:', end=' ')
  57.     for each in puke[i][2]:
  58.         if each[-1] == '0':
  59.             print(each[-2:], end=' ')
  60.         else:
  61.             print(each[-1], end=' ')
  62.     print('\n草花:', end=' ')
  63.     for each in puke[i][3]:
  64.         if each[-1] == '0':
  65.             print(each[-2:], end=' ')
  66.         else:
  67.             print(each[-1], end=' ')
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:15:58 | 显示全部楼层
herdboy答案
  1. import random
  2. dict_init = {
  3.             '黑桃':['A','K','Q','J','10','9','8','7','6','5','4','3','2'],
  4.             '红心':['A','K','Q','J','10','9','8','7','6','5','4','3','2'],
  5.             '方块':['A','K','Q','J','10','9','8','7','6','5','4','3','2'],
  6.             '草花':['A','K','Q','J','10','9','8','7','6','5','4','3','2']
  7.             }
  8. #random.shuffle的函数原型为:random.shuffle(x[, random]),用于将一个列表中的元素打乱
  9. def shuffle(dict_init,num_card,num):
  10.     #四个玩家依次产生牌
  11.     #发三次牌最后一个人用dict_init 这个字典
  12.    
  13.     while(num_card):
  14.         '''
  15.         random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。
  16.         其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
  17.         '''
  18.         a = random.randint(0,3)
  19.         if a ==0:
  20.             color = '黑桃'

  21.         elif a==1:
  22.             color = '红心'

  23.         elif a==2:
  24.             color = '方块'

  25.         else:
  26.             color = '草花'

  27.         #洗牌
  28.         random.shuffle(dict_init[color])
  29.         #弹出牌存入
  30.         num.setdefault(color,[])
  31.         num[color].append(dict_init[color].pop())
  32.         num_card -= 1
  33.         
  34. def print_card(num,number):
  35.     print('玩家%d手中的牌' %number)
  36.     for key,value in num.items():
  37.         print(key,value)

  38. num1 = {}
  39. num2 = {}
  40. num3 = {}
  41. num_card = 13

  42. shuffle(dict_init,num_card,num1)
  43. shuffle(dict_init,num_card,num2)
  44. shuffle(dict_init,num_card,num3)

  45. print_card(num1,1)
  46. print_card(num2,2)
  47. print_card(num3,3)
  48. print_card(dict_init,4)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:16:33 | 显示全部楼层
bvac答案
  1. import random
  2. huase = ['黑桃','红心','方块','草花']

  3. num = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']
  4. # r = random.choice(huase)
  5. # total2 = list(map(lambda x: r + x, num))
  6. total = []
  7. for i in huase:
  8.         total3 = list(map(lambda x: i + x, num))
  9.         total.extend(total3)
  10. # 玩家 = [[],[],[],[]]
  11. random.shuffle(total)
  12. 玩家1 = total[:13]
  13. 玩家2 = total[13:26]
  14. 玩家3 = total[26:39]
  15. 玩家4 = total[39:]
  16. # print(玩家1,len(玩家1))
  17. # print(玩家2,len(玩家2))
  18. # print(玩家3,len(玩家3))
  19. # print(玩家4,len(玩家4))

  20. def printinfo(listinfo,count):
  21.     方块 = []
  22.     黑桃 = []
  23.     红心 = []
  24.     草花 = []
  25.     for i in listinfo:
  26.         if '方块' in i:
  27.             方块.append(i[2:])
  28.         elif '黑桃' in i:
  29.             黑桃.append(i[2:])
  30.         elif '草花' in i:
  31.             草花.append(i[2:])
  32.         else:
  33.             红心.append(i[2:])
  34.     黑桃 = sorted(黑桃, key=lambda x:num.index(x), reverse=True)
  35.     草花 = sorted(草花, key=lambda x:num.index(x), reverse=True)
  36.     方块 = sorted(方块, key=lambda x:num.index(x), reverse=True)
  37.     红心 = sorted(红心, key=lambda x:num.index(x), reverse=True)

  38.     msg = '''
  39.         玩家%s的牌
  40.         黑桃:%s
  41.         红心:%s
  42.         方块:%s
  43.         草花:%s
  44.     ''' %(count,黑桃,红心,方块,草花)
  45.     print(msg,end='------------')

  46. count = 1
  47. for i in [玩家1,玩家2,玩家3,玩家4]:
  48.     printinfo(i, count)
  49.     count += 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:17:13 | 显示全部楼层
黎明晨曦答案
  1. #!/usr/bin/python
  2. paidui=['A','K','Q','J']
  3. num=[10,9,8,7,6,5,4,3,2]
  4. for i in num:
  5.         paidui.append(str(i))
  6. #生成1-13的牌
  7. huase=["heitao","hongtao","meihua","fangkuai"]
  8. xinpaidui=[]
  9. for i in huase:
  10.         for j in paidui:
  11.                 xinpaidui.append([i,j])
  12. #生成四种花色的牌堆
  13. import random
  14. A=[]
  15. for i in range(0,13):
  16.         length=len(xinpaidui)
  17.         getnum=random.randint(0,length-1)
  18.         puke=xinpaidui[getnum]
  19.         A.append(puke)
  20.         del xinpaidui[getnum]
  21. print('A de pai\n')
  22. print(A)
  23. #给A发牌,以下是给BCD发牌
  24. B=[]
  25. for i in range(0,13):
  26.         length=len(xinpaidui)
  27.         getnum=random.randint(0,length-1)
  28.         puke=xinpaidui[getnum]
  29.         B.append(puke)
  30.         del xinpaidui[getnum]
  31. print('B de pai\n')

  32. print(B)

  33. C=[]
  34. for i in range(0,13):
  35.         length=len(xinpaidui)
  36.         getnum=random.randint(0,length-1)
  37.         puke=xinpaidui[getnum]
  38.         C.append(puke)
  39.         del xinpaidui[getnum]
  40. print('C de pai\n')

  41. print(C)
  42. D=[]
  43. for i in range(0,13):
  44.         length=len(xinpaidui)
  45.         getnum=random.randint(0,length-1)
  46.         puke=xinpaidui[getnum]
  47.         D.append(puke)
  48.         del xinpaidui[getnum]
  49. print('D de pai\n')

  50. print(D)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:17:53 | 显示全部楼层
kunaiai答案
  1. class PlayCard:
  2.     '牌类'
  3.     def __init__(self,card_type,num,big_2 = False,card_type_order = False):
  4.         self._card_type = card_type
  5.         if num == 11:
  6.             self._card_num = "J"
  7.         elif  num == 12:
  8.             self._card_num = "Q"
  9.         elif  num == 13:
  10.             self._card_num = "K"
  11.         elif  num == 14:
  12.             self._card_num = "A"
  13.         elif  num == 200:
  14.             self._card_num = "小"
  15.         elif  num == 210:
  16.             self._card_num = "大"
  17.         else:
  18.             self._card_num = str(num)
  19.                     
  20.         self._num = str(num).zfill(2) #接拼比大小(排序)字符串
  21.         
  22.         if big_2 and num == 2: #2是大牌
  23.             self._num = "15"
  24.             
  25.         if card_type_order:  #同点不同花色大小问题         
  26.             if card_type == '黑桃':
  27.                 self._num += '4'
  28.             elif card_type == '红心':
  29.                 self._num += '3'
  30.             elif card_type == '方块':
  31.                 self._num += '2'
  32.             elif card_type == '草花':
  33.                 self._num += '1'
  34.         else:
  35.             self._num += '0'
  36.             
  37.         self._card_name = card_type + self._card_num

  38. class PlayCards:
  39.     '一副牌  用组合'
  40.     def __init__(self, king = False, big_2 = False):
  41.         self._list_card = []#一副牌 52或54张牌对象
  42.         self._list_card_last = []#发牌后剩余的牌 比如斗地主会剩3张牌

  43.         self._list_type_card = ['黑桃','红心','方块','草花']
  44.         for type_card in self._list_type_card:
  45.             for i in range(2,15):
  46.                 self._list_card.append(PlayCard(type_card, i, big_2))

  47.         if king: #2张王牌
  48.             self._list_card.append(PlayCard('王', 200)) #小王
  49.             self._list_card.append(PlayCard('王', 210)) #大王
  50.             self._list_type_card.append('王')
  51.                
  52.     def resetCardLast(self):
  53.         '重置_list_card_last 多次发牌就不用在实例化PlayCards'
  54.         #self._list_card_last.clear()
  55.         self._list_card_last = self._list_card.copy() #需用浅拷贝 要不然也会把_list_card的记录删除掉
  56.         
  57. class Player:
  58.     '玩家类'
  59.     def __init__(self,name):
  60.         self._play_name = name
  61.         self._play_card = []
  62.     def sort(self):
  63.         '排序 大的在前'
  64.         lenght = len(self._play_card)-2 #最后一个数不用循环 所以-2
  65.         for i in range(0,lenght):
  66.             for j in range(0,lenght-i+1):
  67.                 if self._play_card[j]._num < self._play_card[j+1]._num:
  68.                     tem = self._play_card[j+1]
  69.                     self._play_card[j+1] = self._play_card[j]
  70.                     self._play_card[j] = tem

  71.     def clearPlayCard(self):
  72.         '重置玩家手上的牌'
  73.         self._play_card.clear()
  74.         
  75. class Players:
  76.     '玩家类组合 3人 4人'
  77.     def __init__(self,num):
  78.         self._plays = [Player('玩家'+str(i+1)) for i in range(num)]

  79.     def clearPlayCardAll(self):
  80.         '每轮发牌前都要重置所有玩家手上的牌'
  81.         for play in self._plays:
  82.             play.clearPlayCard()

  83.             
  84. import random as r
  85. class OperateCard:
  86.     '牌的一些动作  比如发牌'
  87.     @staticmethod
  88.     def sendPlayCard(play,card_last):
  89.         '给玩家发牌从card_last里随机取并把取到的牌在card_last里删除'
  90.         this_card = r.choice(card_last)
  91.         play._play_card.append(this_card)
  92.         card_last.remove(this_card)

  93.     @staticmethod
  94.     def sendPlayCardPop(play,card_last):
  95.         '''给玩家发牌取card_last的最后一张牌并在card_last里删除(pop方法)
  96.            但是发牌前需把card_last的内容乱序下
  97.            这种发牌方法更符合实际'''
  98.         play._play_card.append(card_last.pop())
  99.       
  100.     @staticmethod
  101.     def shuffleCard(card_last):
  102.         '把card_last的顺序打乱,类似于洗牌'
  103.         r.shuffle(card_last)
  104.      
  105.     @staticmethod   
  106.     def printPlayCard(play,card_type):
  107.         print('%s手中纸牌:' % play._play_name)
  108.         play.sort()
  109.         for card_type in card_type:
  110.             print(card_type,': ',end='')
  111.             for card in play._play_card:            
  112.                 if card_type == card._card_type:
  113.                     print(card._card_num,' ',end='')
  114.             print()
  115.         print()

  116.     @staticmethod   
  117.     def printCardLast(card_last,has_king):
  118.         '显示发剩的牌'
  119.         if has_king:
  120.             print('发剩的纸牌:')
  121.             for last in card_last:
  122.                 print(last._card_name,' ',end='')
  123.             print()
  124.         print()

  125.         
  126.         
  127. def play(num):
  128.     'num=3是斗地主 4是一般不带王的'
  129.     has_king = False
  130.     big_2 = False
  131.     if num == 3:
  132.         has_king = True
  133.         big_2 = True
  134.     #初始化N个玩家和一副牌
  135.     plays = Players(num)
  136.     card = PlayCards(has_king,big_2)

  137.     count = 3
  138.     while count:
  139.         print('第 %d 次发牌!!!' % (4 - count))
  140.         #开始发牌
  141.         card.resetCardLast() #重置_list_card_last变量 里面有一副牌        
  142.         OperateCard.shuffleCard(card._list_card_last) #先打乱牌的顺序 类似于洗牌
  143.         plays.clearPlayCardAll() #清空所有玩家手上的牌
  144.         
  145.         len_card = len(card._list_card)//num
  146.         if num == 3:
  147.             len_card -= 1 #斗地主要少发一张
  148.         
  149.         for i in range(len_card):
  150.             for play in plays._plays:
  151.                 OperateCard.sendPlayCardPop(play,card._list_card_last)#因为temp是可变变量 只要是通过方法修改 就不需要返回

  152.         
  153.         for play in plays._plays:        
  154.             OperateCard.printPlayCard(play,card._list_type_card)

  155.         OperateCard.printCardLast(card._list_card_last,has_king)
  156.         
  157.         count -= 1
  158.         
  159. play(3)
  160. print()
  161. print()
  162. play(4)
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:18:47 | 显示全部楼层
秋水南雁答案
序列分取元素,通过打乱列表每人一轮提取列表中的一个元素。
  1. #-*-conding:utf-8 -*-
  2. import random
  3. a=['a1','a2','a3','a4','a5','a6','a7','a8','a9','a10','aJ','aQ','aK'] #黑桃

  4. b=['b1','b2','b3','b4','b5','b6','b7','b8','b9','b10','bJ','bQ','bK'] #红桃

  5. c=['c1','c2','c3','c4','c5','c6','c7','c8','c9','c10','cJ','cQ','cK'] #梅花

  6. d=['d1','d2','d3','d4','d5','d6','d7','d8','d9','d10','dJ','dQ','dK'] #方块
  7. k=[] #玩家1
  8. f=[] #玩家2
  9. e=[] #玩家3
  10. q=[] #玩家4
  11. v=a+b+c+d
  12. random.shuffle(v) #洗牌
  13. while len(v)>0:
  14.     k.append(v[0])
  15.     f.append(v[1])
  16.     e.append(v[2])
  17.     q.append(v[3])
  18.     del v[:4]
  19. print('玩家1手中纸牌:')
  20. print('黑桃:')
  21. for k in k:
  22.     if k[0]=='a':
  23.         print(k[1])
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-20 18:19:30 | 显示全部楼层
a1104201答案
  1. #-*- coding:UTF-8 -*-;
  2. import random as r;
  3. t_type = ['黑桃','红桃','梅花','方块']
  4. pai = {
  5.     '黑桃':['A','2','3','4','5','6','7','8','9','10','J','Q','K'],
  6.     '红桃':['A','2','3','4','5','6','7','8','9','10','J','Q','K'],
  7.     '梅花':['A','2','3','4','5','6','7','8','9','10','J','Q','K'],
  8.     '方块':['A','2','3','4','5','6','7','8','9','10','J','Q','K']
  9. }
  10. game = [
  11.     {},
  12.     {},
  13.     {},
  14.     {}
  15. ]
  16. shu = 1;
  17. def getHuase(t_type):
  18.     h_len = len(t_type);
  19.     h = h_len-1;
  20.     h1 = r.randint(0,h);
  21.     huase = t_type[h1];
  22.     h1_len = len(pai[huase]);
  23.     if h1_len==0:
  24.         del pai[huase];
  25.         del t_type[h1];
  26.         huase,h1_len = getHuase(t_type);
  27.         h1_len = len(pai[huase]);
  28.     return (huase,h1_len);

  29. def paixu(a):
  30.     for i in a:
  31.         print(ord(i));
  32. while shu<=52:
  33.     for i in range(4):
  34.         huase,h1_len = getHuase(t_type);
  35.         h2 = r.randint(0,h1_len-1);
  36.         p = pai[huase][h2];
  37.         game.setdefault(huase,[]).append(p);
  38.         del pai[huase][h2];
  39.         shu += 1;
  40. num = 1;


  41. for i in game:
  42.     print("第%s位玩家的牌面为:" % num);
  43.     for a in i:
  44.         #print(sorted(i[a]));
  45.         p = reversed(sorted(i[a]));
  46.         print(a," ".join(p));
  47.     num += 1;
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-21 00:47:22 | 显示全部楼层
本帖最后由 zooo 于 2016-1-26 16:36 编辑

首先为版主点个赞,感谢为我们提供一次交流的机会!辛苦了
看了各位鱼油的程序,真心学习了(虽然还有部分没看懂,到后面学完之后再研究研究

最后还是要为自己拉下票~
手打了52个三元组还是很累的,看在辛苦份上,各位鱼油投请我一票吧~

评分

参与人数 1荣誉 +5 鱼币 +5 贡献 +5 收起 理由
冬雪雪冬 + 5 + 5 + 5 最佳答案奖!恭喜了!

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-21 09:52:09 | 显示全部楼层
zooo 发表于 2016-1-21 00:47
首先为版主点个赞,感谢为我们提供一次交流的机会!辛苦了
看了各位鱼油的程序,真心学 ...

如果程序编的好,选手自己也可为自己投票。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-21 16:18:02 | 显示全部楼层
没人气啊  来顶一个
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2016-1-21 18:38:45 | 显示全部楼层
bvac 发表于 2016-1-21 16:18
没人气啊  来顶一个

是呀,好像让大家把每个答案看明白再选出最佳的有些困难。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-22 21:36:03 | 显示全部楼层
哈哈~这弄得挺有意思的。支持版主~顺便默默拉个票~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-25 09:31:26 | 显示全部楼层
每个人的答案不一样,但是做的事情是一样的。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-25 18:46:14 | 显示全部楼层
这个小活动不错啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-26 09:13:54 | 显示全部楼层
冬雪雪冬 发表于 2016-1-20 18:12
zooo的答案:

思路:

请教下楼主,他的排序是怎么排的?
根据list里面的tuple的的第二个值不是只能排出A,K,Q,J么,其他的排第二个值都是0啊?
不同的花色又是根据什么排序的呢?

评分

参与人数 1鱼币 +3 收起 理由
冬雪雪冬 + 3 勤于思考

查看全部评分

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-26 10:45:29 | 显示全部楼层
非常赞,顶一个,看了半天,还是有些不太懂
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2016-1-26 16:50:59 | 显示全部楼层
本帖最后由 zooo 于 2016-1-26 16:52 编辑
John_farmer 发表于 2016-1-26 09:13
请教下楼主,他的排序是怎么排的?
根据list里面的tuple的的第二个值不是只能排出A,K,Q,J么,其他的 ...


排序是利用了list的成员函数sort完成的
每个人的list中每个元组相当于一张手牌,想办法通过sort对这些元组排序就可以了
例如:
(黑桃,0,2)表示黑桃2,(黑桃,0,3)表示黑桃3
sort的排序过程为逐一比较各元素,直到比出大小为止,上面两张牌要比较到第三个元素才能分出大小
(黑桃,4,A)表示黑桃A,(黑桃,3,K)表示黑桃K,(黑桃,0,2)表示黑桃2
它们比较到第二个元素就能分出大小
由于没有规定花色的顺序,所以是黑桃排在前还是红桃在前就由系统默认指定的,如果想对花色进行排序可以再向元组中添加一个元素
例如:
(0,黑桃,0,2)表示黑桃2,(1,红桃,0,2)表示红桃2,这样通过sort就可确定顺序了

小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-9-25 13:05

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表