2014-11-12 2 views
0

Я продолжаю получать эту ошибку, и у меня нет абсолютно никакой идеи, почему у меня есть 3 файла, импортирующих информацию друг от друга, однако эта основная информация извлекает информацию только из monster_01. py и его player.py.ТипError: player_attack() отсутствует 1 обязательный позиционный аргумент: 'self'

TypeError: player_attack() missing 1 required positional argument: 'self' 

--- основной код ---

'''Player class 
Fall 2014 
@author Myles Taft (mbt6) 
''' 

import random 
import monster_01 



class Player(): 

    def __init__(self, strength = 0, player_hp = 0): 
     self.strength = 1 
     self.player_hp = 100 
     print(self.strength, self.player_hp) 

    def battle(): 



     def player_attack(self): 
      print('success') 
      while self.enemy_hp > 0: 
       monster_01() 
       self.dice1 = random.randint(1,6) 
       self.dice2 = random.randint(1,6) 
       self.dice_sum = dice1 + dice2 
       self.attack = dice1 + dice2 
       self.decide_roll = input('Type "roll" to roll the dice:') 
       self.roll = print('First die:' + dice1, 'Second die:' + dice2, 'Sum of dice:' + dice_sum) 

       if self.roll == 2 or 4 or 6 : 
        print('Hit!') 
        self.enemy_hp == strength 
        print(enemy_hp) 
       elif self.roll == 1 or 3 or 5: 
        print('Miss!') 

     def player_block(self): 
      self.dice1 = random.randint(1,6) 
      self.dice2 = random.randint(1,6) 
      self.decide_roll = input('Type "roll" to roll the dice:') 
      self.roll = print('First die:' + dice1, 'Second die:' + dice2, 'Sum of dice:' + dice_sum) 

      if self.roll == 2 or 4: 
       print('Blocked!') 
       self.player_hp -= int((enemy_strength)/2) 
      if self.roll == 1 or 3: 
       self.player_hp -= int(enemy_strength) 

     def choice(self): 
      get_player_attack(get_player_attack) 
      self.player_choice = input('Do you attack or block?') #self.player_hp, self.strength) 
      if self.player_choice == 'attack': 
       self.player_attack() 
      elif self.player_choice == 'block': 
       self.player_block() 


     def get_player_attack(self): 
      player_attack() 



     choice(choice) 




Player.battle() 

Я был вверх и вниз этот код в сто раз, любая помощь будет оценена.

+0

'выбор (выбор)' вызывает метод класса с помощью метода класса в качестве параметра. Просто сделайте 'choice()'. Я - аргумент, который зацикливается – karthikr

ответ

4

Проблема с вашим методом get_player_attack:

def get_player_attack(self): 
    player_attack() 

Он называет player_attack, как если бы это были автономные функции, а не другой метод. Но player_attack- метод класса Player и поэтому может быть вызван только для экземпляра Player.

Функция должна называться как:

self.player_attack() 

Кроме того, такие вещи, как это:

if self.roll == 2 or 4 or 6 : 

просто проблема ждет, чтобы случиться. Оно должно быть написано как:

if self.roll in (2, 4, 6): 

В противном случае условие if-заявление будет интерпретироваться как:

if (self.roll == 2) or (4) or (6): 

, который всегда будет оценивать в True. Для получения дополнительной информации см How do I test one variable against multiple values?


Наконец, вы не должны положить все ваши методы внутри другой функции с именем battle. Я не знаю, что вы пытаетесь сделать здесь, но определения метода должны быть только под заголовком класса:

class MyClass:   # Class header 
    def method1(self): # Definition of the first method 
     ... 

    def method2(self): # Definition of the next method 
     ... 
    ... 

Я действительно думаю, что это будет хорошо для вас, чтобы прочитать некоторые учебники по классам Python и ООП. Вот некоторые, чтобы вы начали:

+0

Я думаю, что здесь есть большая проблема. Ни одна из этих вещей на самом деле не является методом; они - все локальные функции, определенные внутри 'битвы'. Таким образом, просто добавление 'self.' просто собирается получить другое исключение. – abarnert

+0

Я не заметил этого до тех пор, пока не отправил. Я действительно не знаю, что OP пытается сделать с «битвой», поэтому я просто укажу на проблему. – iCodez

+0

Ну, теперь ваш ответ охватывает первую проблему, с которой сталкивается OP, и как выглядят следующие две проблемы, с которыми он, скорее всего, столкнется, поэтому ... трудно победить. – abarnert

0

Это не ясно, что вы пытаетесь сделать в бою(). Вы не определили параметр self, но вы также не использовали декоратор @static, чтобы указать, что вы хотите, чтобы он был статической функцией. Вы определили player_attack в битве, поэтому он не может быть методом экземпляра. Синтаксис неверен.

Если вы предположили, что battle() является методом экземпляра, добавьте параметр self и предоставите тело метода или передать его, а затем сделайте player_attack de-indented.

Смежные вопросы