Python 喜欢

Python Uno Game

我正在尝试玩 uno

试试这个:if __name__ == "main": main(),现在我得到这个错误; NameError:名称 'Deck' 未定义

import random

class UnoCard:
    def __init__(self, c,n):
        self.color = c
        self.num = n
    def __str__(self):
        if self.c == 0:
            return "green" + str(self.n)
        if self.c == 1:
            return "yellow" + str(self.n)
        if self.c == 2:
            return "blue" + str(self.n)
        if self.c == 3:
            return "red" + str(self.n)
    def canPlay(self,other):
        if (self.num == other.num) or (self.color == other.color):
            return True
        return False 

class CollectionOfUnoCards:
    def __init__(self):
        self.l = []
    def addCard (self,c):
        self.l.append(c)
    def __str__(self):
        if(self.l):
            col_str = ""
            for i in range (0, len(self.l)):
                col_str = col_str + ' ' + str(self.l[i])
            return col_str
    def makeDeck(self):
        for num in range (1,10):
            for color in ["Yellow", "Red", "Blue", "Green"]:
                newcard = UnoCard(color,num)
                Deck.addCard(newcard)
                Deck.addCard(newcard)


    def shuffle(self):
        shuffle = random.randint(0,73)

    def getNumCards(self):
        return len(CollectionOfUnoCards)

    def getTopCard(self):
        return CollectionOfUnoCards[0]

    def canPlay(self, other):
        for card in self.l:
            if(card.canPlay(other)):
                return True
        return False        

    def getCard(self,index):
        return makeDeck(CollectionOfUnoCards)


class Uno:
    def __init__(self):
        self.Deck = CollectionOfUnoCards()
        self.Deck.makeDeck()
        self.Deck.shuffle()
        self.hand1 = CollectionOfUnoCards()
        self.hand2 = CollectionOfUnoCards()
        for i in range(7):
            self.hand1.Collection.append(deck.Collection.pop( ))
            self.hand1.Collection.append(deck.Collection.pop( ))

    def playGame(self):
        self.hand1.l.pop()
        self.lastPlayedCard = hand1.l.pop()
        while(True):
            self.playTurn(1)
            self.playTurn(2)
            if len(self.hand1.l) == 0 or len(self.hand2.l) == 0 :
                if len(self.hand1.l) == 0:
                    print("Player1 is winner")
                elif len(self.hand2.l) == 0:
                    print("player2 is winner")
                else:
                    print("The game ends in a draw")
                return False


    def playTurn(self, Player):
        if Player == 1:
            if canPlay(lastPlayedCard):
                hand1.pop()
                lastPlayedCard = hand1.pop()
            else: 
                hand1.Collection.append(deck.Collection.pop())
        else: 
            if canPlay(lastPlayedCard):
                hand2.pop()
                lastPlayedCard = hand2.pop()
            else: 
                hand2.Collection.append(deck.Collection.pop())

    def printResult(self):
        print (hand1)
        print (hand2)

def main():
    my_game = Uno()
    my_game.playGame()

我在 Windows 10 日用 Anaconda 写的。 当我 运行 它时程序自动关闭。 我没有得到任何输出..

我认为您构建套牌的方式不正确。

您在 makeDeck 函数中没有 Deck 变量。相反,您想像这样将卡添加到自身

def makeDeck(self):
    duplicates = 2
    for num in range (1,10):
        for color in ["Yellow", "Red", "Blue", "Green"]:
            newcard = UnoCard(color,num)
            for _ in range(duplicates):
                self.addCard(newcard)

此外,color 必须是数字而不是字符串才能使 self.c == 0 行起作用,实际上应该是 self.color == 0。没有self.cself.n

注意:UNO 有跳过、反转和荒野