Python 如何在玩家之间随机洗牌?

Python 如何在玩家之间随机洗牌?,python,list,loops,random,list-comprehension,Python,List,Loops,Random,List Comprehension,我在使用一个函数处理另一个函数时遇到问题。这是我到目前为止所拥有的 import random as rand def create(): ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A'] suites = ['H', 'C', 'D', 'S'] deck = [[r + s] for s in suites for r in ranks]

我在使用一个函数处理另一个函数时遇到问题。这是我到目前为止所拥有的

import random as rand 

def create(): 
     ranks = ['2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K', 'A']   
     suites = ['H', 'C', 'D', 'S'] 
     deck = [[r + s] for s in suites for r in ranks]    
     return deck   

def cards_dealt (num_cards, num_players, deck): 
     rand.shuffle(deck) 


print(cards_dealt(5, 3, deck)) 
我知道该功能不完整。我需要num_cards是每个玩家收到的牌数,num_players是玩家数,deck是函数create()中的牌串列表。
例如,print语句将显示三名玩家各自从已洗牌的列表牌堆中获得的5张牌。我的问题是,每当我写东西的时候,它都会说甲板没有定义

忘掉你的两个函数吧,因为它们都是正确的,看看你的顶级代码:

import random as rand
def ...
def ...
print(cards_dealt(5, 3, deck)) 
deck
来自哪里?没有。因此有例外

很明显,您希望它从何而来?您有一个
create
函数,该函数以
返回甲板
结尾。你哪儿也不叫它

所以你想要:

import random as rand
def ...
def ...
deck = create()
print(cards_dealt(5, 3, deck)) 
…或者,如果您想更清楚地说明全局变量与两个局部变量无关:

import random as rand
def ...
def ...
mydeck = create()
print(cards_dealt(5, 3, mydeck)) 
…或者,如果你想让事情更简洁:

import random as rand
def ...
def ...
print(cards_dealt(5, 3, create())) 

除此之外,
cards\u deposed
没有
return
,因此它只返回
None
。当您的函数完成时,可能有一些内容值得打印出来,但就目前而言,当您调试到目前为止所拥有的内容时,它并不是很有用

同时,如果您想打印洗牌组,这可能很有用,您可以执行以下操作:

import random as rand
def ...
def ...
mydeck = create()
cards_dealt(5, 3, mydeck)
print(mydeck)
import random as rand
def ...
def ...
mydeck = create()
hands = cards_dealt(5, 3, mydeck)
for hand in hands:
    print(hand)
当您稍后完成该函数,使其返回(例如)一个由3个列表(共5张卡)组成的元组时,您可能希望存储这些返回值,以便稍后打印它们,因此它可能会如下所示:

import random as rand
def ...
def ...
mydeck = create()
cards_dealt(5, 3, mydeck)
print(mydeck)
import random as rand
def ...
def ...
mydeck = create()
hands = cards_dealt(5, 3, mydeck)
for hand in hands:
    print(hand)

忘记这两个函数吧,因为它们都是正确的,请查看顶级代码:

import random as rand
def ...
def ...
print(cards_dealt(5, 3, deck)) 
deck
来自哪里?没有。因此有例外

很明显,您希望它从何而来?您有一个
create
函数,该函数以
返回甲板
结尾。你哪儿也不叫它

所以你想要:

import random as rand
def ...
def ...
deck = create()
print(cards_dealt(5, 3, deck)) 
…或者,如果您想更清楚地说明全局变量与两个局部变量无关:

import random as rand
def ...
def ...
mydeck = create()
print(cards_dealt(5, 3, mydeck)) 
…或者,如果你想让事情更简洁:

import random as rand
def ...
def ...
print(cards_dealt(5, 3, create())) 

除此之外,
cards\u deposed
没有
return
,因此它只返回
None
。当您的函数完成时,可能有一些内容值得打印出来,但就目前而言,当您调试到目前为止所拥有的内容时,它并不是很有用

同时,如果您想打印洗牌组,这可能很有用,您可以执行以下操作:

import random as rand
def ...
def ...
mydeck = create()
cards_dealt(5, 3, mydeck)
print(mydeck)
import random as rand
def ...
def ...
mydeck = create()
hands = cards_dealt(5, 3, mydeck)
for hand in hands:
    print(hand)
当您稍后完成该函数,使其返回(例如)一个由3个列表(共5张卡)组成的元组时,您可能希望存储这些返回值,以便稍后打印它们,因此它可能会如下所示:

import random as rand
def ...
def ...
mydeck = create()
cards_dealt(5, 3, mydeck)
print(mydeck)
import random as rand
def ...
def ...
mydeck = create()
hands = cards_dealt(5, 3, mydeck)
for hand in hands:
    print(hand)

当然还有其他方法,但您也可以这样完成您的功能,以便返回玩家及其手的字典:

def cards_dealt(num_cards, num_players, deck):
    rand.shuffle(deck)
    return {player:[deck.pop() for _ in range(num_cards)] for player in range(num_players)}
然后,创建你的组(这就是出现“组未定义”问题的地方)并调用你的函数:

my_deck = create()

print(cards_dealt(5, 3, my_deck))
返回:

{0: [['10S'], ['8S'], ['7D'], ['6S'], ['4C']], 
 1: [['JD'], ['AC'], ['QD'], ['2D'], ['JS']], 
 2: [['6D'], ['4H'], ['AS'], ['4S'], ['9S']]}
等效的
cards\u处理
函数,但使用循环代替dict和list理解:

def cards_dealt (num_cards, num_players, deck): 
     rand.shuffle(deck)
     player_hands = {i:[] for i in range(num_players)}
     for player in range(num_players):
         for num in range(num_cards):
             player_hands[player].append(deck.pop())
     return player_hands

当然还有其他方法,但您也可以这样完成您的功能,以便返回玩家及其手的字典:

def cards_dealt(num_cards, num_players, deck):
    rand.shuffle(deck)
    return {player:[deck.pop() for _ in range(num_cards)] for player in range(num_players)}
然后,创建你的组(这就是出现“组未定义”问题的地方)并调用你的函数:

my_deck = create()

print(cards_dealt(5, 3, my_deck))
返回:

{0: [['10S'], ['8S'], ['7D'], ['6S'], ['4C']], 
 1: [['JD'], ['AC'], ['QD'], ['2D'], ['JS']], 
 2: [['6D'], ['4H'], ['AS'], ['4S'], ['9S']]}
等效的
cards\u处理
函数,但使用循环代替dict和list理解:

def cards_dealt (num_cards, num_players, deck): 
     rand.shuffle(deck)
     player_hands = {i:[] for i in range(num_players)}
     for player in range(num_players):
         for num in range(num_cards):
             player_hands[player].append(deck.pop())
     return player_hands

让我建议一种面向对象的方法,我们将在其中定义类
Card
Deck
Player

使用对象而不是卡片列表将提供一个简洁的API来实现游戏。当你实现游戏逻辑时,它也会使你更容易保持关于每张牌在哪里以及哪位玩家拥有每张牌的单一真相来源

甲板空气污染指数 交易卡 输出 打牌
卡。其中
属性可以更新以指示卡的位置。由于它是卡牌位置的唯一真实来源,因此会更新
player.hand
属性

deck = Deck()
players = [Player(id, deck) for id in range(2)]

deck.deal(players, n=1)

players[0].hand[0].where = players[1]

for p in players:
    print(p.hand)
输出 更多功能
上面的API提供了处理卡片和将卡片从一手移动到另一手的基础,但可以扩展以实现新功能。

让我建议一种面向对象的方法,我们将在其中定义类
Card
Deck
Player

使用对象而不是卡片列表将提供一个简洁的API来实现游戏。当你实现游戏逻辑时,它也会使你更容易保持关于每张牌在哪里以及哪位玩家拥有每张牌的单一真相来源

甲板空气污染指数 交易卡 输出 打牌
卡。其中
属性可以更新以指示卡的位置。由于它是卡牌位置的唯一真实来源,因此会更新
player.hand
属性

deck = Deck()
players = [Player(id, deck) for id in range(2)]

deck.deal(players, n=1)

players[0].hand[0].where = players[1]

for p in players:
    print(p.hand)
输出 更多功能
上面的API提供了处理卡和将卡从一手移动到另一手的基础,但可以扩展以实现新功能。

deck
是函数
create
中的局部变量。它在函数外部不可见。您必须将其设置为全局或返回。回到你的Python101,但我把它还给你了?这就是我感到困惑的原因。@DyZ
create
return-deck
结尾<代码>卡片有一个名为
deck
的参数。缺少的是对代码中某个地方的
create
的调用。不幸的是,您没有调用create()函数,您只需定义它,在打印之前添加一个简单的
deck=create()
。但是,我必须注意在内部和外部使用相同的变量名