我正在制作一个能够处理牌并为每个玩家分配5张随机牌的程序,直到我尝试打印每个玩家的手牌(showHand功能)。我正在尝试打印给定玩家的牌,但是它告诉我"卡"不是全局属性。我知道它不是,但我不知道如何为玩家打印卡片。帮助
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)
答案 0 :(得分:2)
我认为你需要一个初始化并包含标签的全局卡片对象。与您在showDeck
中的操作类似。它可能只是NUMCARDS
的数组。然后在showHand
中,您遍历cardLoc并仅打印给用户的那些:
for i in NUMCARDS:
if cardLoc[i] == str:
print cards[i]
我只是不确定你的对象层次结构是否适用于这种情况,但我只是试图解决你的问题而不需要大量修改你的代码。
答案 1 :(得分:2)
首先,您的assignCard
函数不会修改全局变量(我假设您实际上不会这样做)
所以你必须在global cardLoc
添加一行
修改过这个全局变量后,您可以使用以下代码打印您的卡片
for i in range(NUMCARDS-1):
if cardLoc[i] == str:
打印任何卡片分配到您牌组中i
的位置。
答案 2 :(得分:2)
这可能对您的具体问题没有帮助,但也许在您推进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()
关于这个例子的一些一般观点:
这个例子不是从列表中选择随机项(然后担心后续选择是否与之前的选择重复),而是简单地将牌组洗牌,然后从顶部开始处理。
处理函数不依赖于任何全局变量。相反,它接收甲板和其他参数作为参数,然后返回所需的手。在某种程度上,您可以组织程序以最大限度地减少(并本地化)对全局变量的依赖,通常情况会更好(出于多种原因)。
该示例使用list comprehension,这是一种在Python中创建列表的便捷技术(其中deck
和hands
已初始化)。
答案 3 :(得分:1)
一些问题,所以我建议真正解决的问题是抛弃它并重新开始。
要做的第一件事:字符串适用于人,而不是计算机,因此在您必须打印某些内容之前,不要将卡表示为字符串。在其他地方,他们应该是数字。每张卡片的单个数字,或者带有等级和套装数字的“卡片”对象。玩家手和套牌都只是简单的数组(或Python,列表)。
创建一个单独的全局“套牌”列表,从中处理所有牌,用每个牌初始化,然后交易给玩家。从甲板上处理随机卡有两种方法 - 你的方法既不是它们也不是。要么(1)使用称为Fisher-Yates的算法“洗牌”牌组(Python的random.shuffle()
执行此操作),并在将它们附加到手牌阵列时从牌组末端弹出牌,或者(2)交易每张卡片,从剩余卡片卡片中随机选择一张卡片,将其贴在手上,然后从卡片中取出。使用random.choose()
和remove()
。
小蟒蛇:不要使用“str”作为变量名,它已经是内置类型。