千夜分离 发表于 2021-12-4 16:22:55

Python 37讲课后题

第三十七讲课后题,我只能生成1条鱼。

代码如下:
import random as r
class Turtle:
   
    power = 100
    begin_x = r.choice(range(11))
    begin_y = r.choice(range(11))

    def move(self):
      new_x = self.begin_x + r.choice([-2,-1,0,1,2])
      new_y = self.begin_y + r.choice([-2,-1,0,1,2])
      newpower = self.power - 1

      if new_x > 10:
            new_x = new_x - 10
      elif new_x < 0:
            new_x = 10 - (-new_x)

      if new_y > 10:
            new_y = new_y - 10
      elif new_y < 0:
            new_y = 10 - (-new_y)

      self.begin_x = new_x
      self.begin_y = new_y
      self.power = newpower

      begin_x = self.begin_x
      begin_y = self.begin_y
      power = self.power

    def eat(self):
      newpower = self.power + 20
      if newpower >100:
            newpower = 100
      self.power = newpower
      power = self.power
      

class Fish:

    begin_x = r.choice(range(11))
    begin_y = r.choice(range(11))

    def move(self):
      new_x = self.begin_x + r.choice([-1,0,1,])
      new_y = self.begin_y + r.choice([-1,0,1,])

      if new_x > 10:
            new_x = new_x - 10
      elif new_x < 0:
            new_x = 10 - -(new_x)
            
      if new_y > 10:
            new_y = new_y - 10
      elif new_y < 0:
            new_y = 10 - (-new_y)

      self.begin_x = new_x
      self.begin_y = new_y

      begin_x = self.begin_x
      begin_y = self.begin_y

t = Turtle()
f = Fish()

while True:

    if t.power == 0:
      print('乌龟没吃到鱼,已经累死了.....')
      break
    elif (t.begin_x,t.begin_y) == (f.begin_x,f.begin_y):
      print('乌龟在 %s 位置吃掉了鱼' % )
      break
    else:
      print('乌龟在 %s 位置,鱼在 %s 位置' % ((t.begin_x,t.begin_y),(f.begin_x,f.begin_y)))
      t.move()
      f.move()


答案用了__init__,为什么要用这个。

傻眼貓咪 发表于 2021-12-4 16:29:28

如字面上的意思,初始化(initialization)类元素

jackz007 发表于 2021-12-4 17:42:26

本帖最后由 jackz007 于 2021-12-4 17:48 编辑

class Turtle:
    def __init__(self):
      # 初始体力
      self.power = 100
      # 初始位置随机
      self.x = r.randint(legal_x, legal_x)
      self.y = r.randint(legal_y, legal_y)
      这个 __init__()在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态。
class Fish:
    def __init__(self):
      self.x = r.randint(legal_x, legal_x)
      self.y = r.randint(legal_y, legal_y)
      这个 __init__() 会在你定义每一条鱼的时候,会为其生成随机位置。
      这样生成 10 条鱼:
for i in range(10):
    new_fish = Fish()
    fish.append(new_fish)
      然后,你可以用循环移动乌龟和这 10 条鱼,并在每次移动后,检测每条鱼和乌龟的坐标重合情况,及时删除与乌龟坐标重合的小鱼,直到乌龟被 "累死" 或小鱼儿被 "吃" 尽。

muxuehan9201 发表于 2021-12-4 23:09:25

muxuehan9201 发表于 2021-12-4 23:18:29

jackz007 发表于 2021-12-4 23:29:39

muxuehan9201 发表于 2021-12-4 23:18
我好像整明白了 是不是类里面对属性的定义是公有的,__init__()构造方法是实例对象独有的,所以楼主用属 ...

      没错,兄弟,你的理解完全正确。

muxuehan9201 发表于 2021-12-4 23:39:04

千夜分离 发表于 2021-12-6 08:53:49

jackz007 发表于 2021-12-4 17:42
这个 __init__()在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态 ...

soga,秒懂!!谢谢!!

千夜分离 发表于 2021-12-6 10:41:26

jackz007 发表于 2021-12-4 17:42
这个 __init__()在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态 ...

还有一个问题,小甲鱼那个代码没有考虑到刚生成的乌龟和鱼也可能回出现在同意地方啊,有可能有一条鱼和乌龟出生在一个地方,刚出来就被吃掉了!
页: [1]
查看完整版本: Python 37讲课后题