builtins.TypeError:__init __()接受1个位置参数,但给出了2个

时间:2020-11-06 10:54:11

标签: python python-3.x typeerror

这是我的第一个问题,我收到TypeError。我想我已经尽力了,但结果没有改变。由于我是新手,因此我认为错误可能非常明显。我将特别感谢任何向我指出其他错误的人 看来BJ_game类的 init 函数获得2个参数,但是跟踪显示为1,请解释原因

Traceback (most recent call last):
  File "G:/СОБСТВЕННОСТЬ А. С/Black - Djack/Black - Djack.py", line 255, in <module>
    main()
  File "G:/СОБСТВЕННОСТЬ А. С/Black - Djack/Black - Djack.py", line 246, in <module>
    game = BJ_Game(names)
  File "G:/СОБСТВЕННОСТЬ А. С/Black - Djack/Black - Djack.py", line 174, in <module>
    player = BJ_Player(name)
builtins.TypeError: __init__() takes 1 positional argument but 2 were given
#!/usr/bin/env python
# -*- coding: utf8 -*-
class CARD(object):
    #объявляем масти и ранги
    Ranks = ['2','3','4','5','6','7','8','9','10','J','Q','K','A',]
    Suits = ['tre','pik','che','bub']
    
    def __init__(self, rank, suit, face_up = True):
        self.rank = rank
        self.suit = suit
        self.is_face_up = face_up
        
    def __str__(self):
        #"собирает" карту из масти и ранга
        if self.is_face_up:
            rep = self.rank + self.suit
        else:
            rep = 'XX'
        return rep
    
    def flip(self):
        self.is_face_up = not self.is_face_up                
       
class Hand(object):    #стандартная рука игрока
    def __init__(self):
        self.cards = []
    def __str__(self):
        #спец. метод, собирает карты в строку
        if self.cards:
            rep = ""
            for card in self.cards:
                rep += str(card) + "\t"
        else: 
            rep = '<none>'
        return rep
    def clear_hand(self):
        self.cards = []
        
    def add_card(self, card):
        self.cards.append(card)
    
    def give(self, other_hand, card):
        self.cards.remove(card)
        other_hand.add_card(card)

class Deck (Hand):    #класс колоды
    def populate(self):
        #перебирает комбинации мастей и рангов, создавая колоду
        for suit in CARD.Suits:
            for rank in CARD.Ranks:
                self.add_card(CARD(rank, suit))
                
    def shuffle(self):
        import random
        random.shuffle(self.cards)
        
    def deal(self, hands, per_hand = 1):
        #раздача карт
        for rounds in range(per_hand):
            for hand in hands:
                if self.cards:
                    #берет верхнюю карту и добавляет ее на руку
                    top_card = self.cards[0]
                    self.give(hand, top_card)
                else:
                    print('больше нет карт!')

class Player():

    def _init_(self, name, score = 0):
        self.name = name
        self.score = score
    def __str__ (self):
        rep =self.name + ":\t" + str(self.score)
        return rep
    def ask_yes_no(question):

        response = None
        while response not in ("у", "n"):
            response = input(question).lower()
        return response
    def  ask_number(question, high, low):

        response = None
        while response not in range(low, high):
            response = int(input(question))
        return response
    
    
    
class BJ_Card(CARD):
    #карта для игры в Блек - джек
    Ace_value = 1
    @property
    def value(self):
        if self.is_face_up:
            v = BJ_Card.Ranks.index(self, rank) + 1
            if v > 10:
                v = 10
            else:
                v = None
            return v


class BJ_Deck(Deck):
    def populate(self):
        for suit in BJ_Card.Suits:
            for rank in BJ_Card.Ranks:
                self.cards.append(BJ_Card(rank. suit))
                
class BJ_Hand(Hand):
 
    def _init_(self, name):
        super(BJ_Hand. self).__init__()
        self.name = name
        
    def __str__(self):
        rep = self.name + ":\t" + super(BJ_Hand, self).__str__()
        if self.total: 
            rep += "(" + str(self.total) + ")"
        return rep    
    def total(self):
    #если у одной из карт value равно None. то и все свойство равно None
        for card in self.cards:
            if not card.value:
                return None
    #суммируем очки. считая каждый туз за 1 очко
        t = о
        for card in self.cards:
            t += card.value
    #определяем. есть ли туз на руках у игрока
        contains_ace = False
        for card in self.cards:
            if card.value == BJ_Card.ACE_VALUE:
                contains_асе = True
    # если на руках есть туз и сумма очков не превышает 11. будем считать туз за 11
        if contains_асе and t <= 11:
    # прибавить нужно лишь 10. потому что единица уже вошла в общую сумму
            t += 10
        return t    
    def is_busted(self):
        return self.total > 21


class BJ_Player(BJ_Hand):

    def is_hitting(self):
        response = games_module.ask_yes_no("\n" + self.name +" будете брать еще карты?(Y/N): ")
        return response == "у"
    def bust(self):
        print(self.name, "перебрал.")
        self.lose()
    def lose(self):
        print (self. name, "проиграл.")
    def win(self):
        print(self.name, "выиграл.")
    def push(self):
        print(self.name, "сыграл вничью.")
        
        
class BJ_Dealer(BJ_Hand):
    def is_hitting(self):
        return self.total < 17
    def bust(self):
        print (self. name, 'перебрал. ')
    def flip_first_card(self):
        first_card = self.cards[O]
        first_card.flip()
        
class BJ_Game():

    def __init__(self,names = 'Player1'):

        self.players = []
        for name in names:
            player = BJ_Player(name)
            self.players.append(player)
        self.dealer = BJ_Dealer('dealer')
        self.deck = BJ_Deck()
        self.deck = populate()
        self.deck = Shuffle()
    @property
    def still_playing(self):
        sp =[]
        for player in self.players:
            if not player.is_busted():
                sp.attend(player)
        return sp
    
    def __addittional_cards(self, player):
        while not player.is_busted() and player.is_hitting():
            self.deck.deal([player])
            print(player)
            if player.is_busted():
                player.bust()
            
    def game_process(self):
        #раздача всем по 2 карты
        self.deck.deal(self.players+[self.dealer], per_hand = 2)
        #первая карта дилера скрывается
        self.dealer.flip_first_card()
        for player in self.players:
            print(player)
        print(self.dealer)
        #раздача доп. карт игрокам
        for player in self.players:
            self.__additional_cards(player)
        #раскрытие первой карты дилера
        self.dealer.flip_first_card()
        #если все перебрали показываем руку дилера
        if not self.still_playing:
            print(self.dealer)
        else:
            #даем доп карты дилеру
            print(self.dealer)
            self.__additional_cards(self.dealer)
            #если дилер перебрал, побеждают оставшиеся игроки
            if self.dealer.is_busted():
                for players in self.still_playing:
                    player.win()
            #сравниваем очки у игроков и дилера        
            else:
                for player in self.still_playing:
                    if player.total > self.dealer.total:
                        player.win()
                    elif player.total < self.dealer.total:
                        player.lose()
                    else:
                        рlayer.push()
        #удаляем карты из игры
        for player in self.players:
            player.clear()
        self.dealer.clear()


#основная часть



def main():
    print("\t\tДoбpo пожаловать за игровой стол Блек-джека!\n")
    names = []
    number = Player.ask_number("Cкoлькo всего игроков? (1 - 7): ", low = 1, high= 8)
    for i in range(number):
        name = input ('введите имя игрока: ')
        names.append(name)
        print()
    game = BJ_Game(names)
    again = None
    while again != "n":
        game.game_process()
        again = Player.ask_yes_no("\nXoтитe сыграть еще раз? ")
        main()
    iпрut("\n\пНажмите Enter. чтобы выйти.")


main()

2 个答案:

答案 0 :(得分:0)

错误来自 玩家= BJ_Player(名称)第174行

在BJ_Player类中,您尚未定义__init__函数,因此默认情况下它需要

def __init__(self)

只有一个自变量作为变量,但是在创建对象时,您传递的是另一个变量name,这就是为什么您在传递2个变量而需要1个变量时却报错的原因。

在BJ_Player类和要在其中创建对象传递数据的其他类中,

定义__init__函数。 __init__用作类的构造函数。 例如BJ_Player应该像这样:

class BJ_Player(BJ_Hand):
    def __init__(self,name):
        self.name = name

编辑:juanpa建议您在Player函数中定义了init,但是它有一个错字,就是为什么使用1个位置参数调用默认 init 的原因。无需在此处明确定义

答案 1 :(得分:0)

下面的固定类层次结构。
BJ_Hand __init__方法存在问题。 (方法名称错误)

class Hand:  # стандартная рука игрока
    def __init__(self):
        self.cards = []


class BJ_Hand(Hand):

    def __init__(self, name):
        super(BJ_Hand, self).__init__()
        self.name = name


class BJ_Player(BJ_Hand):

    def __init__(self, name):
        super(BJ_Player, self).__init__(name)

    def is_hitting(self):
        return True

    def bust(self):
        print(self.name, "перебрал.")
        self.lose()

    def lose(self):
        print(self.name, "проиграл.")

    def win(self):
        print(self.name, "выиграл.")

    def push(self):
        pass


p = BJ_Player('jack')
print(p.name)
相关问题