Python 玩家1总是赢。这是因为random.shuffle不是';真的是随机的还是我犯了逻辑错误?

Python 玩家1总是赢。这是因为random.shuffle不是';真的是随机的还是我犯了逻辑错误?,python,python-3.x,random,Python,Python 3.x,Random,代码总是显示玩家1为赢家,尽管随机。shuffle假定每次的赔率都是随机的。在牌是如何洗牌的,或者玩家1如何总是赢这场比赛中,我没有看到任何直接的模式,因为他们并不总是赢每一轮。不管怎样,他们总是赢得整场比赛 我想知道这是我使用sudo随机洗牌的问题,还是我在某个点上犯了一个我没有注意到的逻辑错误 我试着在不同的地方印上指纹,看看我是否在不同的地方得到了不可预见的结果,但没有注意到任何奇怪的结果 我尝试了两次洗牌的价值观,看看是否改变了什么,但结果仍然是球员1 当我不洗牌时,玩家2确实赢了,所以

代码总是显示玩家1为赢家,尽管随机。shuffle假定每次的赔率都是随机的。在牌是如何洗牌的,或者玩家1如何总是赢这场比赛中,我没有看到任何直接的模式,因为他们并不总是赢每一轮。不管怎样,他们总是赢得整场比赛

我想知道这是我使用sudo随机洗牌的问题,还是我在某个点上犯了一个我没有注意到的逻辑错误

我试着在不同的地方印上指纹,看看我是否在不同的地方得到了不可预见的结果,但没有注意到任何奇怪的结果

我尝试了两次洗牌的价值观,看看是否改变了什么,但结果仍然是球员1

当我不洗牌时,玩家2确实赢了,所以我假设所有的计算和检查都是正确的

cards = ['r1','r2','r3','r4','r5','r6','r7','r8','r9','r10','b1','b2','b3','b4','b5','b6','b7','b8','b9','b10','y1','y2','y3','y4','y5','y6','y7','y8','y9','y10']

#cardShuffler
def cardShuffler(cards):
    from random import shuffle
    shuffle(cards)
    print(cards)
    return(cards)


#cardArrayDeciphers
#colour
def cardColour(selectedCard):
    colour = selectedCard[0] #takes the letter on the card intidacting colour
    return colour
#number
def cardNum(selectedCard):
    number = int(selectedCard[1]) #takes number in a card and convert str to int
    return number

#winnerCalc
def winnerCalc(p1Card, p2Card):
    colour1 = cardColour(p1Card)
    colour2 = cardColour(p2Card)
    num1 = cardNum(p1Card)
    num2 = cardNum(p2Card)
    #pattern should go red > black > yellow > red
    if(colour1 == "r")and(colour2 == "b"):
        winner = ("p1")
    elif(colour1 == "b")and(colour2 == "y"):
        winner = ("p1")
    elif(colour1 == "y")and(colour2 == "r"):
        winner = ("p1")
    elif num1 > num2:
        winner = ("p1")
    else:
        winner = ("p2")
    print("winner "+str(winner)) #debug
    return winner

#gameVals
searchVal = -1
p1WinCards = []
p2WinCards = []
cards = cardShuffler(cards) #function = cardShuffle

#gameLoop [player 1 always wins!]
while (searchVal != 29):
    p1Given = searchVal + 1 #where the code looks for p1 card
    p2Given = searchVal + 2
    p1Card = cards[p1Given]
    p2Card = cards[p2Given]
    searchVal = p2Given
    winner = winnerCalc(p1Card, p2Card) #function = winnerCalc
    if winner == "p1": #giving the winner all the cards
        p1WinCards.append(p1Card)
        p1WinCards.append(p2Card)
    else:
        p2WinCards.append(p1Card)
        p2WinCards.append(p2Card)
    print("p1 " +str(len(p1WinCards))) #debug
    print("p2 " +str(len(p2WinCards))) #debug
if len(p1WinCards) > len(p2WinCards): #finding the final winner by the length of win cards
     winnerAbsolute = p1WinCards
     winnerName = input("Player 1 won! Please enter your name: ")
else:
    winnerAbsolute = p2WinCards
    winnerName = input("Player 2 won! Please enter your name: ")

我希望WinneRable Solute的输出是sudo_random,但结果总是玩家1。

您的if语句非常支持p1获胜。示例代码,其中我希望“p2”获胜,因为p2的颜色更好:

colour1 = 'b'
colour2 = 'r'
num1 = 2
num2 = 1

if(colour1 == "r")and(colour2 == "b"):
    print("p1")
elif(colour1 == "b")and(colour2 == "y"):
    print("p1")
elif(colour1 == "y")and(colour2 == "r"):
    print("p1")
elif num1 > num2:
    print("p1")
else:
    print("p2")

>>> p1
玩家1在这里获胜,因为没有检查玩家2是否有更好的颜色。要正确检查正确的赢家,您可以将if语句修改为以下逻辑:

colour1 = 'b'
colour2 = 'r'
num1 = 2
num2 = 1

if (colour1 == "r" and colour2 == "b") or (colour1 == "b" and colour2 == "y") or (colour1 == "y" and colour2 == "r"):
    print("p1")
elif (colour2 == "r" and colour1 == "b") or (colour2 == "b" and colour1 == "y") or (colour2 == "y" and colour1 == "r"):
    print("p2")
elif num1 > num2:
    print("p1")
else:
    print("p2")

>>> p2
在其中,您可以将最后一个elif和else重构为以下代码行:

colour1 = 'b'
colour2 = 'r'
num1 = 2
num2 = 1

if (colour1 == "r" and colour2 == "b") or (colour1 == "b" and colour2 == "y") or (colour1 == "y" and colour2 == "r"):
    print("p1")
elif (colour2 == "r" and colour1 == "b") or (colour2 == "b" and colour1 == "y") or (colour2 == "y" and colour1 == "r"):
    print("p2")
else:
    print("p1" if num1 > num2 else "p2")

>>> p2

首先,玩游戏的乐趣。 第二,正如我所怀疑的,错误总是存在于multiple if语句中,这是特别棘手的,因为您认为自己是彻底的,在ned中它会咬到您

为了清楚起见,让我们举一个例子:

p1Card = y8 ,p2Card = b1
让我们来看看:

if(colour1 == "r")and(colour2 == "b") # False
    winner = ("p1")
elif(colour1 == "b")and(colour2 == "y")# False
    winner = ("p1")
elif(colour1 == "y")and(colour2 == "r")# False
    winner = ("p1")
elif num1 > num2: # True
    winner = ("p1")
else:
    winner = ("p2")
因此,赢家P1应该是P2。
有多种方法可以避免这种情况,但这应该留给您来解决:)

嘿,我们可以快速查看一下您的卡片数据集吗。老实说,我只是想试试代码:)