用Python处理卡片?
我正在制作一个程序,发牌并给每个玩家随机分配5张牌,直到我尝试打印每个玩家的手为止(showHand函数)。我试图打印给定玩家的牌,但它告诉我“牌”不是全局属性。我知道不是,但我不知道如何为玩家打印卡片。帮忙用Python处理卡片?,python,arrays,loops,for-loop,Python,Arrays,Loops,For Loop,我正在制作一个程序,发牌并给每个玩家随机分配5张牌,直到我尝试打印每个玩家的手为止(showHand函数)。我试图打印给定玩家的牌,但它告诉我“牌”不是全局属性。我知道不是,但我不知道如何为玩家打印卡片。帮忙 import random NUMCARDS = 52 DECK = 0 PLAYER = 1 COMP = 2 cardLoc = [0] * NUMCARDS suitName = ("hearts", "diamonds", "spades", "clubs") rankName
import random
NUMCARDS = 52
DECK = 0
PLAYER = 1
COMP = 2
cardLoc = [0] * NUMCARDS
suitName = ("hearts", "diamonds", "spades", "clubs")
rankName = ("Ace", "Two", "Three", "Four", "Five", "Six", "Seven",
"Eight", "Nine", "Ten", "Jack", "Queen", "King")
playerName = ("deck", "player", "computer")
#assigns random card to given player
def assignCard(str):
#generates random card number to assign to player
randomNum = random.randrange(0, NUMCARDS-1)
#makes sure card being picked for player is not already assigned to another player
while cardLoc[randomNum] != 0:
randomNum = random.randrange(0, NUMCARDS-1)
cardLoc[randomNum] = str
#shows all the cards in the deck
def showDeck():
print "# Card Location"
print "---------------------------"
cardNum = 0
for x in rankName:
#assigns all ranks
rank = x
for y in suitName:
#assigns all suits
suit = y
cards = "%s of %s" % (rank, suit)
cardNum += 1
location = cardLoc[cardNum-1]
location = detLocation(location)
print "%s %s %s" % (cardNum, cards, location)
global cards
#has program print out appropriate location instead of number
def detLocation(location):
if location == PLAYER:
return "Player"
elif location == COMP:
return "Computer"
else:
return "Deck"
#shows given player's hand... but not their foot (;
def showHand(str):
global cards
location = detLocation(str)
print "Displaying %s Hand:" %location
for i in range(5):
cardLoc[cards] = str
print "%s" % cardNum
#calls all functions necessary
def main():
clearDeck()
for i in range(5):
assignCard(PLAYER)
assignCard(COMP)
#showDeck()
showHand(PLAYER)
showHand(COMP)
我认为您需要一个全局cards对象来初始化并包含标签。与您在showDeck中的操作类似。它可能只是一个
NUMCARDS
数组。然后在showHand
中迭代cardLoc并仅打印给用户的内容:
for i in NUMCARDS:
if cardLoc[i] == str:
print cards[i]
我只是不确定您的对象层次结构是否最适合这种情况,但我只是尝试在不大量修改代码的情况下解决您的问题。我认为您需要一个初始化并包含标签的全局cards对象。与您在showDeck中的操作类似。它可能只是一个
NUMCARDS
数组。然后在showHand
中迭代cardLoc并仅打印给用户的内容:
for i in NUMCARDS:
if cardLoc[i] == str:
print cards[i]
我只是不确定您的对象层次结构是否最适合这种情况,但我只是尝试在不大量修改代码的情况下解决您的问题。首先,您的
assignCard
函数不会修改全局变量(我假设您实际上不会这样做)
因此,您必须在那里添加一行,如global cardLoc
修改此全局变量后,您可以使用以下代码打印卡
for i in range(NUMCARDS-1):
if cardLoc[i] == str:
打印分配给组中
i
位置的任何卡。首先,您的assignCard
函数不会修改全局变量(我假设这是您实际上不愿意做的)
因此,您必须在那里添加一行,如global cardLoc
修改此全局变量后,您可以使用以下代码打印卡
for i in range(NUMCARDS-1):
if cardLoc[i] == str:
打印分配给组中
i
位置的任何卡片。这可能对解决您的特定问题没有帮助,但在继续使用Python时,它可能会给您一些想法
import random
def main():
suits = 'S H D C'.split()
ranks = '2 3 4 5 6 7 8 9 X J Q K A'.split()
deck = [r + s for s in suits for r in ranks]
n_players = 4
hand_size = 5
random.shuffle(deck)
hands = deal(deck, n_players, hand_size)
for h in hands:
print h
def deal(deck, n_players, hand_size):
# A general-purpose dealing function.
# It takes a deck and returns a list of hands.
# Each hand is a list of cards dealt from the top of the deck.
hands = [[] for _ in range(n_players)]
i = -1
for _ in range(hand_size):
for h in hands:
i += 1
h.append(deck[i])
return hands
main()
关于该示例,有几个要点:
- 本例并不从列表中随机选择项目(然后担心后续选择是否与先前选择重复),而是简单地洗牌,然后从顶部开始交易
- 交易函数不依赖于任何全局变量。相反,它接收数据组和其他参数作为参数,然后返回所需的指针。在一定程度上,你可以组织你的程序,以尽量减少(和本地化)对全局变量的依赖,你通常会更好(出于许多原因)
- 该示例使用列表理解,这是一种在Python中创建列表的便捷技术(其中,
和deck
被初始化)hands
import random
def main():
suits = 'S H D C'.split()
ranks = '2 3 4 5 6 7 8 9 X J Q K A'.split()
deck = [r + s for s in suits for r in ranks]
n_players = 4
hand_size = 5
random.shuffle(deck)
hands = deal(deck, n_players, hand_size)
for h in hands:
print h
def deal(deck, n_players, hand_size):
# A general-purpose dealing function.
# It takes a deck and returns a list of hands.
# Each hand is a list of cards dealt from the top of the deck.
hands = [[] for _ in range(n_players)]
i = -1
for _ in range(hand_size):
for h in hands:
i += 1
h.append(deck[i])
return hands
main()
关于该示例,有几个要点:
- 本例并不从列表中随机选择项目(然后担心后续选择是否与先前选择重复),而是简单地洗牌,然后从顶部开始交易
- 交易函数不依赖于任何全局变量。相反,它接收数据组和其他参数作为参数,然后返回所需的指针。在一定程度上,你可以组织你的程序,以尽量减少(和本地化)对全局变量的依赖,你通常会更好(出于许多原因)
- 该示例使用列表理解,这是一种在Python中创建列表的便捷技术(其中,
和deck
被初始化)hands
random.shuffle()
执行此操作)对牌组进行“洗牌”,并在将牌附加到手牌阵列时将牌从牌组阵列的末端弹出,要么(2)要处理每张牌,从剩余牌组中随机选择一张牌,将其附加到手牌,然后将其从牌组中移除。这在Python中使用random也很容易。选择()
和remove()
一个次要的pythonism:不要使用“str”作为变量名,它已经是一个内置类型。有很多问题,所以我建议真正的解决方法是扔掉它,重新开始 首先要做的事情是:字符串是给人的,而不是给计算机的,所以在你打印一些东西之前不要把卡片表示成字符串。在其他任何地方,它们都应该是数字。每张牌都有一个数字,或者是一个“牌”对象,上面有等级和等级的数字。玩家的手牌和牌组都是简单的数组(或者在Python中是列表) 创建一个单一的全局“牌组”列表,从中处理所有牌,用每一张牌初始化,然后处理到玩家手中。有两种方法可以从牌组中随机发牌——你的方法不是这两种。(1)使用名为Fisher-Yates的算法(Python的
random.shuffle()
执行此操作)对牌组进行“洗牌”,并在将牌附加到手牌阵列时将牌从牌组阵列的末端弹出,或者(2)要处理每张牌,请从剩余牌组中随机选择一张牌,然后