0

我正在用python制作一个快速而肮脏的扑克游戏,并且无法确定哪个玩家赢得了这手牌。我有发牌的功能,以 0-8 对应于高牌的方式确定手的“价值” - 同花顺,然后是使每手独特的关键部分。

我遇到的问题是当有两个或更多玩家的牌型相同(对子、两对等)时,确定谁赢,更糟糕的是,当他们有相同的对子时,我必须下去看看踢球者。

我无法确定一种存储数据的好方法,并根据需要将它们进行比较。我不想包括我所有的功能来检查手值等等,因为它会变得太长。我真的很感兴趣人们对如何存储和比较这些数据的想法,尤其是提到的具有相似值的手(粗体字)

每个玩家的手牌都由一个字典条目表示,由表格中的玩家编号键入

mydict = {(1 :(2,'Spades)), (2 :(3,'Diamonds')), etc}

players = 5
# Creates deck of cards and deals to each player
Cards = Shuffle_Deck(Suits,Values,1)
All_Players, Cards = deal_hand(players,5,Cards)

# scores and orders hands
def order_hands(All_Players):
    rank_hands = []
    for i in range(1,len(All_Players)+1):
        rank_hands.append([i,score_hand(All_Players[i],printhand=False,printvalue=False)])
    sorted_hands = rank_hands[:]
    sorted_hands.sort(key=lambda x: x[1][0],reverse=True)
    return sorted_hands

Sorted_Hands = order_hands(All_Players)
#print Sorted_Hands
def who_Wins(Sorted_Hands):
    Tied_Hands = []
    winning_index = Sorted_Hands[0][1][0]
    for i in range(len(Sorted_Hands)):
        if Sorted_Hands[i][1][0] == winning_index:
#            print Sorted_Hands[i]
            Tied_Hands.append([Sorted_Hands[i][0],Sorted_Hands[i][1][1:]])

    return winning_index,Tied_Hands

winning_index,Tied_Hands = who_Wins(Sorted_Hands)
Tied_Hands.sort(key=lambda x: x[1], reverse=True)
print Tied_Hands
for i in range(len(Tied_Hands)):
    vals = [val for (val,suit) in All_Players[Tied_Hands[i][0]]]
    print 'vals',sorted(vals,reverse=True)
#for hands in Tied_Hands:
#    if
print Tied_Hands[0][0]
4

2 回答 2

4

这是我写的一个例子:

http://www.paulgriffiths.net/program/python/pcards.php

_set_score()方法是解决问题的方法。我想出的解决方案是在列表中对手上的组件进行评分。例如,对于满堂彩,列表中的第一项是整手牌的分数(例如,满堂彩击败一对,顺子击败三张同类),列表中的第二项是三张牌的排名一种,列表中的第三项是该对的排名。这样,您可以非常简单地通过使用常规的 <、>、<=、>= 运算符将一只手与另一只手(即一个列表与另一个列表)进行比较,而 Python 会为您完成所有艰苦的工作。对于一个完整的房子,当你比较列表时,Python 会依次查看每个项目。如果双手都是葫芦,它会比较同类的三,最高的三将获胜。如果三个相同,它会比较对,最高的一对将获胜。如果三分球和对子相等,则双手相等。这种方法通常有效,允许您通过比较列表来比较任意两只手。

于 2013-06-15T05:13:34.470 回答
3

像这样构建您的评估函数:

1)首先,确定它是什么类型的手(最高牌,对子,两对...皇家同花顺)。手型应该是从最差到最好的枚举。

2)其次,对手中的牌进行排序 - 构成手牌类型的牌应该先走(特别是,对于满堂彩,同类三应该先于同类二),然后对所有剩余的牌进行分类从最好到最差的卡片。

3) 将手牌类型和排序的牌组合起来——这是对手牌好坏的评价。

像这样构造你的比较函数:

1)首先,比较手型。如果一个更高,那只手更好。

2) 否则,比较排序后的第一张牌。如果一个更高,那只手更好。

3) 在每张卡片上继续做 2)。

例如,现在您可以使用比较器将任意数量的牌按从最差到最好的顺序进行排序。

您也可以为每手牌创建一个分数,然后只比较整数 - 例如,最差(在最不重要的意义上)牌 + 次差牌*11 + 第三张牌*11^2 + 第四张牌*11^3 + 最佳牌*11^4 + 手牌*11^5

于 2013-06-15T05:03:30.473 回答