Python Новое в объектно-ориентированном программировании - PullRequest
0 голосов
/ 09 июня 2011

Мне было интересно, как решить эту проблему с моим первым фрагментом ООП-кода.Проблема заключается в методе атаки класса Snake.У меня есть две змеи в игре, и я пытаюсь заставить змею атаковать другую.В настоящее время я использую две переменные, чтобы заметить, какой ход Снейка, а затем использую это, чтобы попытаться атаковать другую змею.Однако это не работает.У кого-нибудь есть идеи, как это решить?Большое вам спасибо.

class Snake:
    hp=100
    attack=25
    defense=1
    def set_name(self, name):
        self.name=name

    def shed(self):
        self.defense=self.defense+1

    def attack(self, opposite, current):
        opposite.hp=opposite.hp-(current.attack-opposite.defense)

    def eat(self):
        self.attack=self.attack+5
        print(str(self.name) + " eats a rat!")
        print(str(self.name) + "'s attack dmg is now " + str(self.attack))

    def sleep(self):
        print (str(self.name) + " goes to sleep")
        self.hp=self.hp+10
        if self.hp>100:
            self.hp=100
        print (str(self.name) + " wakes up with " + str(self.hp) + "hp")

##initialises the snakes
alpha=Snake()
beta=Snake()
## gives the snakes names of the user's choice
alpha_name=raw_input("What would you like to name your snake? ")
alpha.set_name(alpha_name)
beta_name=raw_input("What would you like to name the other snake? ")
beta.set_name(beta_name)
##starts the game
turn=True
while alpha.hp>0 and beta.hp>0:
    while turn==True:
        opposite="beta"
        current="alpha"
        action=raw_input("attack, sleep, eat or shed? ")
        try:
            if action=="attack":
                alpha.attack(opposite, current)
            if action=="sleep":
                alpha.sleep()
            if action=="eat":
                alpha.eat()
            if action=="shed":
                alpha.shed()

            turn=False
        except IOError:
            print("Please chose only one action, exaclty how it is typed")
    while turn==False:
        opposite="alpha"
        current="beta"
        if beta.hp<15:
            beta.sleep()
        elif alpha.hp>75:
            beta.attack()
        else:
            index=random.randint(1, 3)
            if index==1:
                beta.shed()
            elif index==2:
                beta.eat()
            else:
                beta.attack(opposite, current)    
        turn=True

Ответы [ 3 ]

2 голосов
/ 09 июня 2011

Я вижу две проблемы.Во-первых, вы передаете имя переменной вместо самой переменной.

измените это:

while alpha.hp>0 and beta.hp>0:
    while turn==True:
        opposite="beta"
        current="alpha"
        action=raw_input("attack, sleep, eat or shed? ")
        try:
            if action=="attack":
                alpha.attack(opposite, current)

на следующее:

while alpha.hp>0 and beta.hp>0:
    while turn==True:
        opposite=beta
        current=alpha
        action=raw_input("attack, sleep, eat or shed? ")
        try:
            if action=="attack":
                alpha.attack(opposite, current)

Дополнительно,у вас есть поле атаки, определенное дважды в классе Snake.

class Snake:
    attack=25

    def attack(self, opposite, current):

Вот что я придумал после игры с вашим кодом:

import random

class Snake:
    hp=100
    attack_skill=25
    defense=1

    def set_name(self, name):
        self.name=name

    def shed(self):
        self.defense=self.defense+1

    def attack(self, opposite):
        opposite.hp = opposite.hp - (self.attack_skill - opposite.defense)

    def eat(self):
        self.attack_skill += 5
        print(str(self.name) + " eats a rat!")
        print(str(self.name) + "'s attack dmg is now " + str(self.attack_skill))

    def sleep(self):
        print (str(self.name) + " goes to sleep")
        self.hp=self.hp+10
        if self.hp>100:
            self.hp=100
        print (str(self.name) + " wakes up with " + str(self.hp) + "hp")


##initialises the snakes
alpha=Snake()
beta=Snake()
## gives the snakes names of the user's choice
alpha_name=raw_input("What would you like to name your snake? ")
alpha.set_name(alpha_name)
beta_name=raw_input("What would you like to name the other snake? ")
beta.set_name(beta_name)
##starts the game
turn=True
while alpha.hp>0 and beta.hp>0:
    while turn==True:
        opposite="beta"
        current="alpha"
        action=raw_input("attack, sleep, eat or shed? ")
        try:
            if action=="attack":
                alpha.attack(beta)
            if action=="sleep":
                alpha.sleep()
            if action=="eat":
                alpha.eat()
            if action=="shed":
                alpha.shed()

            turn=False
        except IOError:
            print("Please chose only one action, exaclty how it is typed")
    while turn==False:
        opposite="alpha"
        current="beta"
        if beta.hp<15:
            beta.sleep()
        elif alpha.hp>75:
            beta.attack(alpha)
        else:
            index=random.randint(1, 3)
            if index==1:
                beta.shed()
            elif index==2:
                beta.eat()
            else:
                beta.attack(alpha)
        turn=True
2 голосов
/ 09 июня 2011

в "атаке" вы пытаетесь получить доступ к "противоположному. Hp", но этот метод вызывается со строкой вместо объекта:

opposite="alpha"
current="beta"

=> изменить это значение на

opposite=alpha
current=beta

также есть поле и метод с тем же именем в классе: атака .Я предлагаю переименовать поле в «точки атаки» или что-то в этом роде.

дополнительно, вы называете «beta.attack ()».вы забыли аргументы метода там.

1 голос
/ 09 июня 2011

Когда вы beta атакуете, вы вызываете метод attack() без каких-либо параметров. Я полагаю, вы хотите beta.attack(alpha,beta)

Но вы, вероятно, могли бы реорганизовать метод так, чтобы в качестве параметра указывался только оппонент (поскольку вы знаете, кто атакует (это объект, вызывающий метод атаки))

def attack(self, opposite):
    opposite.hp -= self.attack-opposite.defense
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...