鱼C论坛

 找回密码
 立即注册
查看: 1268|回复: 8

[已解决]Python 37讲课后题

[复制链接]
发表于 2021-12-4 16:22:55 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
第三十七讲课后题,我只能生成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 位置吃掉了鱼' % [t.begin_x,t.begin_y])
        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 17:42:26
本帖最后由 jackz007 于 2021-12-4 17:48 编辑
  1. class Turtle:
  2.     def __init__(self):
  3.         # 初始体力
  4.         self.power = 100
  5.         # 初始位置随机
  6.         self.x = r.randint(legal_x[0], legal_x[1])
  7.         self.y = r.randint(legal_y[0], legal_y[1])
复制代码

        这个 __init__()  在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态。
  1. class Fish:
  2.     def __init__(self):
  3.         self.x = r.randint(legal_x[0], legal_x[1])
  4.         self.y = r.randint(legal_y[0], legal_y[1])
复制代码

        这个 __init__() 会在你定义每一条鱼的时候,会为其生成随机位置。
        这样生成 10 条鱼:
  1. for i in range(10):
  2.     new_fish = Fish()
  3.     fish.append(new_fish)
复制代码

        然后,你可以用循环移动乌龟和这 10 条鱼,并在每次移动后,检测每条鱼和乌龟的坐标重合情况,及时删除与乌龟坐标重合的小鱼,直到乌龟被 "累死" 或小鱼儿被 "吃" 尽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-12-4 16:29:28 | 显示全部楼层
如字面上的意思,初始化(initialization)类元素
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-12-4 17:42:26 | 显示全部楼层    本楼为最佳答案   
本帖最后由 jackz007 于 2021-12-4 17:48 编辑
  1. class Turtle:
  2.     def __init__(self):
  3.         # 初始体力
  4.         self.power = 100
  5.         # 初始位置随机
  6.         self.x = r.randint(legal_x[0], legal_x[1])
  7.         self.y = r.randint(legal_y[0], legal_y[1])
复制代码

        这个 __init__()  在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态。
  1. class Fish:
  2.     def __init__(self):
  3.         self.x = r.randint(legal_x[0], legal_x[1])
  4.         self.y = r.randint(legal_y[0], legal_y[1])
复制代码

        这个 __init__() 会在你定义每一条鱼的时候,会为其生成随机位置。
        这样生成 10 条鱼:
  1. for i in range(10):
  2.     new_fish = Fish()
  3.     fish.append(new_fish)
复制代码

        然后,你可以用循环移动乌龟和这 10 条鱼,并在每次移动后,检测每条鱼和乌龟的坐标重合情况,及时删除与乌龟坐标重合的小鱼,直到乌龟被 "累死" 或小鱼儿被 "吃" 尽。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-12-4 23:09:25 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-12-4 23:18:29 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

      没错,兄弟,你的理解完全正确。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

头像被屏蔽
发表于 2021-12-4 23:39:04 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-6 08:53:49 | 显示全部楼层
jackz007 发表于 2021-12-4 17:42
这个 __init__()  在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态 ...

soga,秒懂!!谢谢!!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-12-6 10:41:26 | 显示全部楼层
jackz007 发表于 2021-12-4 17:42
这个 __init__()  在你定义乌龟对象的时候,会初始化其随机位置,并初始化其体力为 "满血" 状态 ...

还有一个问题,小甲鱼那个代码没有考虑到刚生成的乌龟和鱼也可能回出现在同意地方啊,有可能有一条鱼和乌龟出生在一个地方,刚出来就被吃掉了!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-20 12:06

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表