Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python属性错误_Python_Attributes - Fatal编程技术网

Python属性错误

Python属性错误,python,attributes,Python,Attributes,我有以下代码,似乎无法理解为什么会出现此错误: 回溯(最近一次呼叫最后一次): 文件“C:\Users\Andy\Desktop\finalprojectfile WIP.py”,第292行,在 甲板 文件“C:\Users\Andy\Desktop\finalprojectfile WIP.py”,第149行,在_init中__ 自我甲板 AttributeError:deck实例没有属性“deck” 代码如下: import simpleguitk as simplegui import

我有以下代码,似乎无法理解为什么会出现此错误: 回溯(最近一次呼叫最后一次):

文件“C:\Users\Andy\Desktop\finalprojectfile WIP.py”,第292行,在
甲板
文件“C:\Users\Andy\Desktop\finalprojectfile WIP.py”,第149行,在_init中__
自我甲板
AttributeError:deck实例没有属性“deck”
代码如下:

import simpleguitk as simplegui
import random

# load cards - 949x392 - 
CARD_SIZE = (73, 98)
CARD_CENTER = (36.5, 49)
card_images = simplegui.load_image("http://www.jfitz.com/cards/classic-playing-cards.png")


# initialize some useful global variables
flag1 = False
flag2 = False
win = 0
loss = 0
wind = 0
lossd = 0
count = 0

# define globals for cards
SUITS = ('C', 'S', 'H', 'D')
RANKS = ('A', '2', '3', '4', '5', '6', '7', '8', '9', 'T', 'J', 'Q', 'K')
VALUES = {'A':1, '2':2, '3':3, '4':4, '5':5, '6':6, '7':7, '8':8, '9':9, 'T':10, 'J':10, 'Q':10, 'K':10}

# define card class
class Card:
    def __init__(self, suit, rank):
        if (suit in SUITS) and (rank in RANKS):
            self.suit = suit
            self.rank = rank
        else:
            self.suit = None
            self.rank = None
            print "Invalid card: ", suit, rank

    def __str__(self):
        return self.suit + self.rank

    def get_suit(self):
        return self.suit

    def get_rank(self):
        return self.rank

    def draw(self, canvas, pos):
        card_loc = (CARD_CENTER[0] + CARD_SIZE[0] * RANKS.index(self.rank), 
                    CARD_CENTER[1] + CARD_SIZE[1] * SUITS.index(self.suit))
        canvas.draw_image(card_images, card_loc, CARD_SIZE, [pos[0] + CARD_CENTER[0], pos[1] + CARD_CENTER[1]], CARD_SIZE)

# define hand class
class Hand:
    def __init__(self):
        self.hand = []
        self.rank1 = []
        self.suit1 = []
        self.position = []
        self.hundred = 0
        self.count = -1

    def __str__(self):
        s = ""
        i = 0
        while i in range(0, len(self.hand)):
            s += (str(self.hand[i]) + " ")
            i += 1
        return s

    def add_card(self, card):
        self.hundred += 100
        self.position.append(self.hundred)
        self.rank1.append(card.get_rank())
        self.suit1.append(card.get_suit())
        self.hand.append(card.get_suit() + card.get_rank())

    # count aces as 1, if the hand has an ace, then add 10 to hand value if it doesn't bust
    def get_value(self):
        self.value = 0
        for i in range(0, len(self.rank1)):
            if (self.rank1[i] == 'A' and self.value <= 10):
                self.value += 11
            else:
                self.value += VALUES.get(self.rank1[i])
        return self.value

    def draw(self, canvas, p, r, s):
        card_location = (CARD_CENTER[0] + CARD_SIZE[0] * RANKS.index(r), 
                    CARD_CENTER[1] + CARD_SIZE[1] * SUITS.index(s))
        canvas.draw_image(card_images, card_location, CARD_SIZE, [p[0] + CARD_CENTER[0], p[1] + CARD_CENTER[1]], CARD_SIZE)  

    def drawback(self, canvas, p):
        card_location1 = (CARD_BACK_CENTER[0], CARD_BACK_CENTER[1])
        canvas.draw_image(card_back, card_location1, CARD_BACK_SIZE, [p[0] + CARD_BACK_CENTER[0], p[1] + CARD_BACK_CENTER[1]], CARD_BACK_SIZE)

# define deck class
class deck:
    def __init__(self):
        self.choice = -1
        del self.deck
        self.deck = []
        for i in range(1, 14):
            j = str(i)
            if (j == '1'):
                self.deck.append(Card('C', 'A').get_suit() + " " + Card('C', 'A').get_rank())
                self.deck.append(Card('S', 'A').get_suit() + " " + Card('C', 'A').get_rank())
                self.deck.append(Card('H', 'A').get_suit() + " " + Card('C', 'A').get_rank())
                self.deck.append(Card('D', 'A').get_suit() + " " + Card('C', 'A').get_rank())
            elif (j == '10'):
                self.deck.append(Card('C', 'T').get_suit() + " " + Card('C', 'T').get_rank())
                self.deck.append(Card('S', 'T').get_suit() + " " + Card('C', 'T').get_rank())
                self.deck.append(Card('H', 'T').get_suit() + " " + Card('C', 'T').get_rank())
                self.deck.append(Card('D', 'T').get_suit() + " " + Card('C', 'T').get_rank())
            elif (j == '11'):
                self.deck.append(Card('C', 'J').get_suit() + " " + Card('C', 'J').get_rank())
                self.deck.append(Card('S', 'J').get_suit() + " " + Card('C', 'J').get_rank())
                self.deck.append(Card('H', 'J').get_suit() + " " + Card('C', 'J').get_rank())
                self.deck.append(Card('D', 'J').get_suit() + " " + Card('C', 'J').get_rank())
            elif (j == '12'):
                self.deck.append(Card('C', 'Q').get_suit() + " " + Card('C', 'Q').get_rank())
                self.deck.append(Card('S', 'Q').get_suit() + " " + Card('C', 'Q').get_rank())
                self.deck.append(Card('H', 'Q').get_suit() + " " + Card('C', 'Q').get_rank())
                self.deck.append(Card('D', 'Q').get_suit() + " " + Card('C', 'Q').get_rank())
            elif (j == '13'):
                self.deck.append(Card('C', 'K').get_suit() + " " + Card('C', 'K').get_rank())
                self.deck.append(Card('S', 'K').get_suit() + " " + Card('C', 'K').get_rank())
                self.deck.append(Card('H', 'K').get_suit() + " " + Card('C', 'K').get_rank())
                self.deck.append(Card('D', 'K').get_suit() + " " + Card('C', 'K').get_rank())
            else:
                self.deck.append(Card('C', j).get_suit() + " " + Card('C', j).get_rank())
                self.deck.append(Card('S', j).get_suit() + " " + Card('C', j).get_rank())
                self.deck.append(Card('H', j).get_suit() + " " + Card('C', j).get_rank())
                self.deck.append(Card('D', j).get_suit() + " " + Card('C', j).get_rank())
    # add cards back to deck and shuffle
    def shuffle(self):
        random.shuffle(self.deck)

    def deal_card(self):
        self.choice += 1
        return self.deck[self.choice]

    def __str__(self):
        return str(self.deck)

#define event handlers for buttons
def deal():
    global flag1, flag2, deck, player, dealer, count, loss, wind
    if (flag1 == True and player.get_value() <= 21):
        loss += 1
        wind += 1
    count = 0
    flag1 = False
    flag2 = False
    player = Hand()
    dealer = Hand()
    deck = deck()
    deck.shuffle()
    for i in range(0, 2):
        deal1 = deck.deal_card()
        split1 = deal1.split()
        card1 = Card(split1[0], split1[1])
        player.add_card(card1)
        deal2 = deck.deal_card()
        split2 = deal2.split()
        card2 = Card(split2[0], split2[1])
        dealer.add_card(card2)

def hit():
    global flag1, flag2, loss, deck, player, dealer, wind, count
    if (count < 5):
        if (player.get_value() < 21) and flag2 == False:
            count += 1
            hit = deck.deal_card()
            split = hit.split()
            card = Card(split[0], split[1])
            player.add_card(card)
            flag1 = True
        if (player.get_value() > 21):
            count = 6
            loss += 1
            wind += 1

def stand():
    global flag1, flag2, win, loss, wind, lossd
    if (flag2 == False and player.get_value() <= 21):
        while (dealer.get_value() < 17):
            hit = deck.deal_card()
            split = hit.split()
            card = Card(split[0], split[1])
            dealer.add_card(card)
        flag2 = True
        if (player.get_value() > dealer.get_value()):
            win += 1
            lossd += 1
        elif (player.get_value() < dealer.get_value()):
            loss += 1
            wind += 1
        elif (player.get_value() == dealer.get_value()):
            loss += 1
            wind += 1

# draw handler    
def draw(canvas):
    global flag1, flag2, deck, player, dealer
    # test to make sure that card.draw works, replace with your code below
    canvas.draw_text("Player's Hand:" + str(player.get_value()), (10, 350), 12, "Yellow")
    canvas.draw_text("Player", (40, 150), 12, "White")
    canvas.draw_text("Dealer", (40, 250), 12, "White")
    canvas.draw_text("Player Wins:" + str(win), (455, 350), 12, "White")
    canvas.draw_text("Player Losses:" + str(loss), (455, 380), 12, "White")
    canvas.draw_text("Dealer Wins:" + str(wind), (300, 350), 12, "White")
    canvas.draw_text("Dealer Losses:" + str(lossd), (300, 380), 12, "White")
    canvas.draw_text("BlackJack", (180, 40), 30, "Red")
    if (flag2 == False and player.get_value() <= 21):
        canvas.draw_text("Hit or Stand?", (180, 550), 20, "Black")
    for i in range(0, len(player.position)):
        player.draw(canvas, [player.position[i], player.position[0]], player.rank1[i], player.suit1[i])
    if (flag2 == True):
        dealer.draw(canvas, [dealer.position[0], dealer.position[1]], dealer.rank1[0], dealer.suit1[0])
    else:
        dealer.drawback(canvas, [dealer.position[0], dealer.position[1]])
    for j in range(1, len(dealer.position)):
        dealer.draw(canvas, [dealer.position[j], dealer.position[1]], dealer.rank1[j], dealer.suit1[j])
    if ((player.get_value() > 21) and (flag1 == True)):
        canvas.draw_text("Player is Busted", (180, 480), 20, "Black")
        canvas.draw_text("New Deal?", (180, 550), 20, "Black")
    elif ((player.get_value() == dealer.get_value()) and (dealer.get_value() >= 17) and (flag2 == True)):
        canvas.draw_text("Tie!! Dealer Wins", (180, 480), 20, "Black")
        canvas.draw_text("Dealer's Hand:" + str(dealer.get_value()), (10, 380), 12, "Yellow")
        canvas.draw_text("New Deal?", (180, 550), 20, "Black")
    elif ((dealer.get_value() > player.get_value()) and (dealer.get_value() >= 17) and (flag2 == True)):
        canvas.draw_text("Dealer Wins", (180, 480), 20, "Black")
        canvas.draw_text("Dealer's Hand:" + str(dealer.get_value()), (10, 380), 12, "Yellow")
        canvas.draw_text("New Deal?", (180, 550), 20, "Black")
    elif ((player.get_value() > dealer.get_value()) and (dealer.get_value() >= 17) and (flag2 == True)):
        canvas.draw_text("Player Wins", (180, 480), 20, "Black")
        canvas.draw_text("Dealer's Hand:" + str(dealer.get_value()), (10, 380), 12, "Yellow")
        canvas.draw_text("New Deal?", (180, 550), 20, "Black")

# deal an initial hand
player = Hand()
dealer = Hand()
deck = Deck()
deck.shuffle()
for i in range(0, 2):
    deal1 = deck.deal_card()
    split1 = deal1.split()
    card1 = Card(split1[0], split1[1])
    player.add_card(card1)
    deal2 = deck.deal_card()
    split2 = deal2.split()
    card2 = Card(split2[0], split2[1])
    dealer.add_card(card2)

# initialization frame
frame = simplegui.create_frame("Blackjack", 600, 600)
frame.set_canvas_background("Green")

#create buttons
frame.add_button("Deal", deal, 200)
frame.add_button("Hit",  hit, 200)
frame.add_button("Stand", stand, 200)
frame.set_draw_handler(draw)

# Start Program
frame.start()
将simpleguitk作为simplegui导入
随机输入
#加载卡-949x392-
卡片大小=(73,98)
卡_中心=(36.5,49)
card_images=simplegui.load_image(“http://www.jfitz.com/cards/classic-playing-cards.png")
#初始化一些有用的全局变量
flag1=错误
flag2=错误
赢=0
损失=0
风=0
lossd=0
计数=0
#为卡片定义全局变量
套装=('C'、'S'、'H'、'D')
排名=(‘A’、‘2’、‘3’、‘4’、‘5’、‘6’、‘7’、‘8’、‘9’、‘T’、‘J’、‘Q’、‘K’)
值={'A':1,'2':2,'3':3,'4':4,'5':5,'6':6,'7':7,'8':8,'9':9,'T':10,'J':10,'Q':10,'K':10}
#定义卡类
班级卡:
定义初始(自我、西装、军衔):
如果(穿西装)和(军衔):
西服
self.rank=等级
其他:
self.suit=无
self.rank=无
打印“无效卡片:”、套装、等级
定义(自我):
返回self.suit+self.rank
def get_套装(自我):
自诉
def get_等级(自我):
返回自我等级
def绘图(自身、画布、位置):
卡片位置=(卡片中心[0]+卡片大小[0]*等级索引(自我等级),
卡片中心[1]+卡片大小[1]*套装索引(自助套装))
画布。绘制图像(卡片图像、卡片位置、卡片大小、[pos[0]+卡片中心[0],pos[1]+卡片中心[1]],卡片大小)
#定义手类
班主任:
定义初始化(自):
self.hand=[]
self.rank1=[]
self.suit1=[]
self.position=[]
self.100=0
self.count=-1
定义(自我):
s=“”
i=0
当我在范围(0,len(self.hand))内时:
s++=(str(self.hand[i])+“”)
i+=1
返回s
def添加卡(自身,卡):
self.100+=100
self.position.append(self.100)
self.rank1.append(card.get_rank())
self.suit1.append(card.get_suit())
self.hand.append(card.get\u suit()+card.get\u rank())
#将A数为1,如果手部有A,如果手部没有破裂,则在手部值上加10
def get_值(自身):
self.value=0
对于范围(0,len(self.rank1))中的i:
如果(self.rank1[i]='A'和self.value=17)和(flag2==True)):
画布。绘制文本(“平局!!经销商获胜”(180480),20,“黑色”)
画布。绘制文本(“经销商的手:+str(经销商。获取价值()),(10380),12,“黄色”)
画布。绘制文本(“新政?”,(180550),20,“黑色”)
elif((发牌人.获取价值()>玩家.获取价值())和(发牌人.获取价值()>=17)和(flag2==True)):
画布。绘制文本(“经销商获胜”(180480),20,“黑色”)
画布。绘制文本(“经销商的手:+str(经销商。获取价值()),(10380),12,“黄色”)
画布。绘制文本(“新政?”,(180550),20,“黑色”)
elif((player.get_value()>dealer.get_value())和(dealer.get_value()>=17)和(flag2==True)):
画布。绘制文本(“玩家获胜”(180480),20,“黑色”)
画布。绘制文本(“经销商的手:+str(经销商。获取价值()),(10380),12,“黄色”)
画布。绘制文本(“新政?”,(180550),20,“黑色”)
#第一手交易
玩家=手()
经销商=手()
甲板
洗牌
对于范围(0,2)内的i:
deal1=deck.deal\u card()
split1=deal1.split()
card1=卡(拆分1[0],拆分1[1])
玩家。添加卡(卡1)
deal2=deck.deal\u card()
split2=deal2.split()
card2=卡(拆分2[0],拆分2[1])
经销商。添加卡(卡2)
#初始化帧
frame=simplegui.create_frame(“21点”,600600)
框架。设置画布背景(“绿色”)
#创建按钮
帧。添加按钮(“交易”,交易,200)
帧。添加按钮(“点击”,点击,200)
框架。添加按钮(“支架”,支架,200)
frame.set\u draw\u处理程序(draw)
#启动程序
frame.start()

如果有人能帮我解决这个问题,那就太棒了。提前谢谢

您正在实例化一个
deal
对象。它的属性在实例化之前不存在。
del self.deck
是无意义的、不必要的和根本原因;移除它

# define deck class
class deck:
    def __init__(self):
        self.choice = -1
        self.deck = []

你打算做什么?您尚未为
self.deck
分配任何值,因此无法删除,这是错误消息告诉您的。如果您试图从命名空间中删除
self.deck
,以便它不会与主程序中的“deck”重叠,python非常聪明,如果在deck类中进行赋值,就不会在main中使用“deck”。您应该能够省略
del self.deck
,它就可以正常工作了。这也是一个例子,在不同的作用域中有重叠的变量名可能会令人困惑
# define deck class
class deck:
    def __init__(self):
        self.choice = -1
        self.deck = []