1

我正在制作一个程序,它会发牌并为每个玩家分配 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)
4

4 回答 4

2

首先,您的assignCard函数不会修改全局变量(我假设这是您实际上不会做的),因此您必须在此处添加一行,就像global cardLoc 修改了此全局变量一样,您可以使用以下代码打印您的卡片

for i in range(NUMCARDS-1):
    if cardLoc[i] == str:

打印分配给你牌组中位置的任何i牌。

于 2013-06-15T23:51:18.363 回答
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()

关于该示例的一些一般要点:

  • 这个例子不是从列表中选择随机项目(然后担心后续选择是否与先前选择重复),而是简单地洗牌然后从顶部开始发牌。

  • 交易函数不依赖任何全局变量。相反,它接收牌组和其他参数作为参数,然后返回所需的手牌。如果您可以组织您的程序以最小化(和本地化)对全局变量的依赖,那么您通常会更好(出于多种原因)。

  • 该示例使用列表推导,这是一种在 Python 中创建列表的便捷技术(在哪里deckhands被初始化)。

于 2013-06-16T01:02:37.167 回答
2

我认为您需要一个全局卡片对象,该对象被初始化并包含标签。类似于你在showDeck. 它可能只是一个数组NUMCARDS。然后在showHand您遍历 cardLoc 并仅打印给用户的那些:

for i in NUMCARDS:
    if cardLoc[i] == str:
        print cards[i]

我只是不确定您的对象层次结构是否最适合这种情况,但我只是想在不大量修改代码的情况下解决您的问题。

于 2013-06-15T23:23:17.063 回答
2

有很多问题,所以我建议真正的解决办法是把它扔掉并重新开始。

首先要做的事情:字符串是用于人的,而不是用于计算机的,因此在必须打印某些内容之前不要将卡片表示为字符串。在其他任何地方,它们都应该是数字。每张卡片都有一个数字,或者是一个带有数字的“卡片”对象,用于等级和花色。玩家手牌和牌组都只是简单的数组(或在 Python 中为列表)。

创建一个单一的全局“牌组”列表,从中处理所有牌,用每张牌初始化它,然后发给玩家手牌。有两种方法可以从一副牌中随机发牌——你的方法都不是。(1)使用一种称为 Fisher-Yates 的算法“洗牌”牌组(Python 会这样做random.shuffle())并在将牌附加到手牌阵列时从牌组阵列的末端弹出牌,或者(2)要处理每张牌,请选择一个从剩余的牌组中随机抽出一张牌,加入手牌,然后从牌组中取出。这在 Python 中也很容易使用random.choose()remove()

一个小的 Python 主义:不要使用“str”作为变量名,它已经是一个内置类型。

于 2013-06-16T02:30:06.110 回答