2011-06-09 70 views
0

我想知道如何解决这个问题,我用我的第一块OOP代码。问题在于Snake类的攻击方法。我在比赛中有两条蛇,并试图让蛇去攻击另一条蛇。目前我使用两个变量来记录Snake的轮到它,然后使用它来尝试攻击另一个蛇。但是这不起作用。任何人有任何想法如何解决这个问题?非常感谢。Python面向对象编程新手

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

“不工作”是完全无用的报告。会发生什么,如果发生错误,您准备发生什么,确切的消息和追溯等等。 – delnan 2011-06-09 14:27:29

+7

请告诉我们究竟发生了什么。问一个问题的好方法是:1.问题背景2.你期望发生什么3.发生什么4.有问题的代码 – JackMc 2011-06-09 14:28:07

+0

@JackMc:允许窃取该评论并使用它? – Trufa 2011-06-09 14:38:46

回答

2
在 “攻击”

您尝试访问 “opposite.hp”,但这种方法是带一个字符串,而不是一个对象:

opposite="alpha" 
current="beta" 

=>更改为

opposite=alpha 
current=beta 

另外,还有一个字段和方法同名:攻击。我建议将该字段重命名为“攻击点”或其他内容。

此外,您称为“beta.attack()”。你忘记了那里的方法论点。

+0

非常感谢您的意见。我得到它的工作感谢你们:) – Sean 2011-06-10 05:35:24

1

当您发生beta攻击时,您正在调用方法attack(),但没有任何参数。我想,你希望beta.attack(alpha,beta)

但你可能会重构,只需要对方作为参数的方法(因为你知道是谁在攻击(这是调用的攻击方法)的对象)

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

我见两个问题。首先是你传递变量的名称而不是变量本身。

改变这一点:

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) 

此外,您必须在蛇类定义了两次攻击领域。

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 
+0

奖金OOP点你会写一个'TurnBasedFight'类。 – 2011-06-09 15:51:39

+0

@Jochen Real OOP会要求你编写一个基类'Animal',从中派生'Reptiles'类,从你派生出最后的'Snakes'类。当蛇赢得'TurnBasedFight'(应该是一个派生自“Fight”的类,其中'RealTimeFight'也被派生出来)时,你可能还想打印一些东西。 – 2011-06-09 16:16:17

+0

@Jonno_FTW:不,“真正的”OOP并不意味着你写尽可能多的班级,你可以。另一个管理轮流和输入战斗的班级只会让事情变得更简单。 – 2011-06-09 16:43:32