鱼C论坛

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

[已解决]零基础python 37课后练习中的一些问题

[复制链接]
发表于 2020-5-23 20:05:37 | 显示全部楼层 |阅读模式

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

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

x
在面相对象编程 小甲鱼 零基础python37课 的练习中,  有些问题不是很明白, 我把它们标注在了代码中, 求大佬们拍打小萌新。 爱你们



import random as r

legal_x = [0, 10]
legal_y = [0, 10]

class Turtle:
    def __init__(self):
        self.power = 100
        # the initial location is random
        self.x = r.randint(legal_x[0], legal_x[1])
        # the num in [] is index, this line means generating random int between 0 and 10
        self.y = r.randint(legal_y[0], legal_y[1])


    def move(self):
        #     move to a new location (x,y) without a firm direction
        new_x = self.x + r.choice([1,2,-1,-2])
        new_y = self.y + r.choice([1,2,-1,-2])
        # check if the new location is outside of the required area (x)
        if new_x < legal_x[0]:
            self.x = legal_x[0] - (new_x - legal_x[0])
        elif new_x > legal_x[1]:
            self.x= legal_x[1] - (new_x - legal_x[1])
        else:
            self.x = new_x

        # check if the new location is outside of the required area (x)
        if new_y < legal_y[0]:
            self.y = legal_y[0] - (new_y - legal_y[0])
        elif new_y > legal_y[1]:
            self.y = legal_y[1] - (new_y - legal_y[1])
        else:
            self.y = new_y

        # power customise
        self.power -=1
        # return the new location
        return (self.x, self.y)

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

class Fish:
    def __init__(self):
        self.x = r.randint(legal_x[0], legal_x[1])
        self.y = r.randint(legal_y[0], legal_y[1])

    def move(self):
        #     move to a new location (x,y) without a firm direction
        new_x = self.x + r.choice([1, -1])
        new_y = self.y + r.choice([1, -1])

        # check if the new location is outside of the required area (x)
        if new_x < legal_x[0]:
            self.x = legal_x[0] - (new_x - legal_x[0])
        elif new_x > legal_x[1]:
            self.x = legal_x[1] - (new_x - legal_x[1])
        else:
            self.x = new_x

        # check if the new location is outside of the required area (x)
        if new_y < legal_y[0]:
            self.y = legal_y[0] - (new_y - legal_y[0])
        elif new_y > legal_y[1]:
            self.y = legal_y[1] - (new_y - legal_y[1])
        else:
            self.y = new_y
        # return the new location
        return (self.x, self.y)


turtle = Turtle()
fish = []

for i in range(10):
    new_fish=Fish()
    fish.append(new_fish)

while True:  # 问题一: while True, 这里判断的是什么条件为True啊?
    if not len(fish): # 问题二: 为什么这里判断fish列表为空呢?? if not len(fish) 在这里的用法??
        print('all fishes have been eaten, game over')
        break
    if not turtle.power: # 问题三: 为什么这里不是 if turtle.power==0 这个条件呢?
        print('the turtle has died because of the lack of the power')
        break

    pos = turtle.move()
    for each_fish in fish[:]: # 问题四: 为什么这里不直接 for each_fish in fish ?
        if each_fish.move() == pos:
            # same location, fish is eaten
            turtle.eat()
            fish.remove(each_fish)
            print('there is a fish was eaten, OMG')










最佳答案
2020-5-23 21:31:27
hwang.me 发表于 2020-5-23 21:19
问题2 和 问题3  还是很迷。。。。 特别是问题三,在定义小乌龟这个类的时候, 不是就已经初始化power为1 ...

问题二 fish 列表是存鱼的条数的,你每次被小乌龟吃掉一只就移除一只 直到列表全部被吃完,小乌龟胜利,
当列表全部被吃完时候  len(fish) == 0 的  0 等价于 False    你加上not 就变成了 True  if 条件就成立 开始执行if 里面的语句

问题三:条件可以为if turtle.power==0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-5-23 20:18:17 | 显示全部楼层
本帖最后由 Twilight6 于 2020-5-23 20:33 编辑

# 问题一: while True, 这里判断的是什么条件为True啊?
因为要让程序一直循环 ,乌龟吃鱼又是随机的,直到 if not len(fish) 或 if not turtle.power 条件成立了 执行里面退出循环的语句
# 问题二: 为什么这里判断fish列表为空呢?? if not len(fish) 在这里的用法??
因为每次被乌龟吃了,这条鱼就要从列表中移除出去,直到乌龟把鱼全部吃了,列表为空,判定乌龟胜利,退出循环,if not len(fish) 如果fish为空列表 则长度为 0 可以视为布尔类型值 False 加上 not 后 条件从False 变成了 True
# 问题三: 为什么这里不是 if turtle.power==0 这个条件呢?
条件可以为if turtle.power==0 ,前面看错题目了 订正这后面就不删了: power 这里是代表乌龟的生命值,在刚开始时候生命值一定大于 0  所以如果你改成 if turtle.power==0 这个条件 一开始就会成立,导致直接判定乌龟失败,而你加上 not 之后 (not 0)是等于 True的,只要乌龟生命不为 0  就不会判断乌龟失败了
# 问题四: 为什么这里不直接 for each_fish in fish ?
因为小甲鱼说过 直接 for each_fish in fish 会出现一些不可预料的事情 哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 20:29:26 | 显示全部楼层
Twilight6 发表于 2020-5-23 20:18
因为要让程序一直循环 ,乌龟吃鱼又是随机的,直到 if not len(fish) 或 if not turtle.power 条件成立了  ...

第三点有个疑惑  if not turtle.power 和 if turtle.power == 0 不是一个意思咩?if turtle.power==0 这个条件 一开始不会成立吧

评分

参与人数 1荣誉 +2 鱼币 +2 收起 理由
Twilight6 + 2 + 2 对 ! 我看错疑问了 谢谢纠错!!!

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2020-5-23 21:19:46 | 显示全部楼层
Twilight6 发表于 2020-5-23 12:18
因为要让程序一直循环 ,乌龟吃鱼又是随机的,直到 if not len(fish) 或 if not turtle.power 条件成立了  ...

问题2 和 问题3  还是很迷。。。。 特别是问题三,在定义小乌龟这个类的时候, 不是就已经初始化power为100了么, 所以应该不会出现小乌龟一出来就死掉的情况呀????
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 21:27:59 | 显示全部楼层
hwang.me 发表于 2020-5-23 21:19
问题2 和 问题3  还是很迷。。。。 特别是问题三,在定义小乌龟这个类的时候, 不是就已经初始化power为1 ...

问题三订正后面是我写错了 只是不删了 意思
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-23 21:31:27 | 显示全部楼层    本楼为最佳答案   
hwang.me 发表于 2020-5-23 21:19
问题2 和 问题3  还是很迷。。。。 特别是问题三,在定义小乌龟这个类的时候, 不是就已经初始化power为1 ...

问题二 fish 列表是存鱼的条数的,你每次被小乌龟吃掉一只就移除一只 直到列表全部被吃完,小乌龟胜利,
当列表全部被吃完时候  len(fish) == 0 的  0 等价于 False    你加上not 就变成了 True  if 条件就成立 开始执行if 里面的语句

问题三:条件可以为if turtle.power==0
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-5-24 02:59:27 | 显示全部楼层
本帖最后由 hwang.me 于 2020-5-23 19:01 编辑
Twilight6 发表于 2020-5-23 13:31
问题二 fish 列表是存鱼的条数的,你每次被小乌龟吃掉一只就移除一只 直到列表全部被吃完,小乌龟胜利,
...


谢谢你 我好像能理解了, 图片里的这两个代码块 是不是其实是可以互换位置的?

37.jpg
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-5-24 07:19:09 | 显示全部楼层
hwang.me 发表于 2020-5-24 02:59
谢谢你 我好像能理解了, 图片里的这两个代码块 是不是其实是可以互换位置的?

可以 但是  while True 位置不能动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

发表于 2020-5-28 10:27:32 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-21 00:57

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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