【问题标题】:How to stop getting repeated random values?如何停止获得重复的随机值?
【发布时间】:2017-07-20 16:51:11
【问题描述】:

CPU 和用户得到重复卡。我使用了shuffle 函数以及pop。有没有办法防止用户和CPU重复卡?

这是一个执行示例:

这是你的卡片:
1) 俱乐部 10
2) 钻石 4
3) 钻石 6
4) 俱乐部 7
5) 俱乐部 10

要玩牌,只需一次输入一张牌即可。完成后, 输入空格

2 1 3 4

您玩过: 方块 4 梅花 10 方块 6 方块 7 俱乐部

CPU 播放:黑桃J 黑桃J

如您所见,用户两次获得了 10 of Clubs。

我的代码:

import random
import math
from collections import Counter
print("Gui-less poker sucks, but it sure is addicting probably")
if 1:
    deck = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52]
    random.shuffle(deck)
    hcardss = [""]
    hcardsc = [""]
    hcardsh = [""]
    ccardss = [""]
    ccardsc = [""]
    ccardsh = [""]
    ingame = "true"
    while (ingame == "true"):
        undone = 5
        while (undone > 0):
            card = deck.pop()
            # print(card)
            temp = card / 13
            temp2 = card / 4
            temp = math.floor(temp)
            temp2 = math.floor(temp2)
            temp = temp + 1
            # temp2 = temp2 + 1
            #print(temp)
            #print(temp2)
            # undone -= 1
            hcardss.append(temp)
            hcardsc.append(temp2)
            if (temp == 1):
                temp3 = " of Spades"
            elif (temp == 2):
                temp3 = " of Diamonds"
            elif (temp == 3):
                temp3 = " of Clubs"
            else:
                temp3 = " of Hearts"
            if (temp2 == 10):
                temp4 = "Jack"
            elif (temp2 == 11):
                temp4 = "Queen"
            elif (temp2 == 12):
                temp4 = "King"
            elif (temp2 == 13):
                temp4 = "Ace"
            else:
                temp4 = str(temp2 + 1)
            # print("Your card was the " + temp4 + temp3)
            hcardsh.append("The " + temp4 + temp3)
            undone -= 1
        undone = 5
        random.shuffle(deck)
        while (undone > 0):
            # THIS ONE IS THE COMPUTER
            card = deck.pop()
            # print(card)
            temp = card / 13
            temp2 = card / 4
            temp = math.floor(temp)
            temp2 = math.floor(temp2)
            temp = temp + 1
            # temp2 = temp2 + 1
            #print(temp)
            #print(temp2)
            # undone -= 1
            ccardss.append(temp)
            ccardsc.append(temp2)
            if (temp == 1):
                temp3 = " of Spades"
            elif (temp == 2):
                temp3 = " of Diamonds"
            elif (temp == 3):
                temp3 = " of Clubs"
            else:
                temp3 = " of Hearts"
            if (temp2 == 10):
                temp4 = "Jack"
            elif (temp2 == 11):
                temp4 = "Queen"
            elif (temp2 == 12):
                temp4 = "King"
            elif (temp2 == 13):
                temp4 = "Ace"
                temp4 = str(temp2 + 1)
            # print("Your card was the " + temp4 + temp3)
            ccardsh.append("The " + temp4 + temp3)
            undone -= 1
        print()
        print()
        print()
        print("Here are your cards:")
        print("1) " + hcardsh[1])
        print("2) " + hcardsh[2])
        print("3) " + hcardsh[3])
        print("4) " + hcardsh[4])
        print("5) " + hcardsh[5])
        print("To play cards, simply type their number one at a time. When done, input blank")
        instant = "true"
        doneinput = "false"
        hplay = [""]
        while (doneinput == "false"):
            latestinput = input("> ")
            if (latestinput == ""):
                if (instant == "true"):
                    print("Okay, you fold")
                    ingame = "false"
                    exit()
                doneinput = "true"
            else:
                if (int(latestinput) in hplay):
                    print("You already picked that one!")
                else:
                    hplay.append(int(latestinput))
        # print("The cards you played are " + str(hplay))
        doneinput = "false"
        cplay = [""]
        while (doneinput == "false"):
            latestinput = random.randint(1,5)
            if (latestinput == ""):
                doneinput = "true"
            else:
                if (int(latestinput) in cplay):
                    doneinput = "true"
                else:
                    cplay.append(int(latestinput))
        #print("So you played " + str(hplay))
        #print("And the cpu played " + str(cplay))
        #print("So you played the " + hcardsh[hplay[1]] + hcardsh[hplay[2]]
        times = len(hplay)
        # times = times - 1
        hplayh = [""]
        cplayh = [""]
        sub = 1
        print()
        print()
        print("You played:")
        while (sub < times):
            hplayh.append(hcardsh[hplay[sub]])
            print(hcardsh[hplay[sub]])
            sub += 1
        sub = 1
        times = len(cplay)
        print()
        print()
        print("CPU played:")
        while (sub < times):
            cplayh.append(ccardsh[cplay[sub]])
            print(ccardsh[cplay[sub]])
            sub += 1
        #print(str(hplay)
        #print(str(cplayh))
        hscore = 0
        cscore = 0
        #checker = 1
        #highnumber = 0
        #quantity = [""]
        #quancheck = 0
        htrans = [""]
        temp5 = 1
        while (len(hplay) > temp5):
            htrans.append(int(hcardsc[hplay]))
            temp5 += 1
        ctrans = [""]
        temp5 = 1
        while (len(cplay) > temp5):
            ctrans.append(int(ccardsc[cplay]))
            temp5 += 1

        hoccur = Counter(htrans).most_common()
        coccur = Counter(ctrans).most_common()
        print(hoccur)
        #while (len(hplay) > checker):
         #   if (hcardsc[hplay[checker]] > highnumber):
          #      quancheck += 1
           # quantity.append(quancheck)
            #checker += 1


        ingame = "false"

【问题讨论】:

  • 你可以创建一个set(或者list,如果你真的想要),选择一个随机元素并将其删除。那么接下来你就不可能拿到同一张卡了。
  • 我认为您应该将deck 的声明移到外部while 循环内。
  • 另外,我很确定如果它得到两个数字,如 1415,因为这些数字除以 413 返回相同的值。
  • 对随机函数使用种子,时间戳将是一个很好的种子
  • ingame = "true" .... 你为什么不使用布尔值,ingame=True

标签: python random shuffle poker


【解决方案1】:

通过洗牌生成1到52之间的卡号并从中弹出值的方式是正确的。

问题在于您从牌号生成花色和牌面值的方式。

例如,

  • 地板(26/4) = 7,地板(27/4) = 7
  • 地板(26/13) = 2, 地板(27/13) = 2

所以 26 和 27 将被解释为同一张卡片。

保持您最初的想法,您可以使用除以 13 的商和余数:

q = card_num // 13 # integer division
r = card_num % 13  # modulo operator

或者,同时使用divmod

q, r = divmod(26, 13)
print(q,r)
# (2, 0)
q, r = divmod(27, 13)
print(q,r)
# (2, 1)

你将有 0

附注:
您可以改进代码中的一些内容。一个简单的改变:

deck = list(range(1, 53))

会更短! ;)

【讨论】:

  • 非常感谢!这有帮助!
【解决方案2】:

这似乎是一个学习与课堂合作的好机会......我一直认为纸牌游戏是课堂的绝佳测试场

首先定义一个卡片类

class Card(object):
    def __init__(self,value,suite):
        self.value = value
        self.suite = suite
    def __str__(self):
       # override behaviour of printing a card object
       card_names = ["Ace","Two","Three","Four","Five","Six","Seven","Eight","Nine","Ten","Jack","Queen","King"]
        return card_names[self.value]

    def __repr__(self):
        #override the repr of a card to print the card name and suite
        suites = "Clubs Spades Diamonds Hearts"
        return "%s of %s"%(self,suites[self.suite])

    def __cmp__(self,other_card):
        return cmp(self.value,other_card.value)

然后是包含我们所有卡片的套牌类

class Deck(object):
    def __init__(self):
        self.cards = []
        for suite in range(4):
            for value in range(13):
                self.cards.append(Card(value,suite))
    def shuffle(self):
        self.cards.shuffle()
    def deal(self):
        if self.cards:
           return self.cards.pop()
        raise StopIteration("Out Of Cards...")
    def __len__(self):
        return len(self.cards)

现在你可以创建一个播放方法

def play_game():
    deck = Deck()
    player_1 = [deck.deal() for _ in range(5) ] # deal 5 cards to player1
    player_2 = [deck.deal() for _ in range(5) ] # deal 5 cards to player2(cpu)
    game_over = False
    while not game_over:
    for i,card in enumerate(player_1):
        #play a turn
        print("%d. %r"%(i,card))
        player_1.append(deck.deal()
        player_2.append(deck.deal()
     print("Winner is Player 1")

那么你的主程序循环就是

while still_playing:
     play_game()
     still_playing = check_with_player()

【讨论】:

  • 小吹牛:你写的是suite而不是suit,并且文本中有一些其他错别字。
猜你喜欢
  • 2010-12-19
  • 1970-01-01
  • 2017-12-25
  • 1970-01-01
  • 2015-06-12
  • 1970-01-01
  • 2021-04-22
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多