鱼C论坛

 找回密码
 立即注册
查看: 1095|回复: 2

[已解决]作业 第037讲 乌龟吃鱼 新手求助,为什么我的鱼的坐标移动有点凌乱的呢?

[复制链接]
发表于 2021-10-24 11:27:45 | 显示全部楼层 |阅读模式

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

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

x
代码如下:
import random as r

class Turtle:
    def __init__(self):
        self.lift = 100
        Turtle.x = r.randint(0,10)
        Turtle.y = r.randint(0,10)

    def move(self):
        step = r.choice([-1,-2,1,2])
        direction = r.choice('x,y')
        if direction == 'x':
            
            new_x = Turtle.x + step
            new_y = Turtle.y
        else:
            
            new_x = Turtle.x
            new_y = Turtle.y + step

        #边界检测
        if new_x < 0:
            
            Turtle.x = 0 - step
        elif new_x > 10:
            Turtle.x = 10 - step
        else:
            Turtle.x = new_x

        if  new_y < 0:
            Turtle.y = 0 - step
        elif new_y > 10:
            Turtle.y = 10 - step
        else:
            Turtle.y = new_y
        self.lift -= 1
        return(Turtle.x,Turtle.y)

        


    #吃的方法
    def eat(self):
        self.lift += 20
        if self.lift > 100:
            self.lift = 100
class Fish:
    def __init__(self):
        Fish.x = r.randint(0,10)
        Fish.y = r.randint(0,10)

    def move(self):
        step = r.choice([-1,1])
        #方向选择
        direction = r.choice('x,y')
        if direction == 'x':
            
            new_x = Fish.x + step
            new_y = Fish.y
        else:
            
            new_x = Fish.x
            new_y = Fish.y + step

        if new_x < 0:
            Fish.x = 0 - step
        elif new_x > 10:
            Fish.x = 10 - step
        else:
            Fish.x = new_x

        if new_y < 0:
            Fish.y = 0 - step
        elif new_y > 10:
            Fish.y = 10 - step
        else:
            Fish.y = new_y
        return(Fish.x,Fish.y)

turtle = Turtle()
fish = []
for i in range(10):
    a = Fish()
    fish.append(a)

while True:
    if not turtle.lift:
        print("哦~~我龟龟要挂了~~")
        break
    if not len(fish):
        print("哦~我龟大爷终于把你们这帮小鱼仔吃完了的,额~好饱~~")
        break
   
    pos = turtle.move()
    print(turtle.lift)
    print('乌龟在:',pos)
    for each_fish in fish[:]:
        fishs = each_fish.move()
        
        
        if fishs == pos:
            turtle.eat()
            print('啊~太美味了,so good ~~')
            fish.remove(each_fish)
        print('鱼在:',fishs)
        
鱼的移动坐标摘抄了凌乱的一部分:
8
乌龟在: (7, 3)
鱼在: (6, 6)
鱼在: (6, 7)
7
乌龟在: (7, 4)
鱼在: (6, 8)
鱼在: (5, 8)
6
乌龟在: (5, 4)
鱼在: (5, 7)
鱼在: (4, 7)
5
乌龟在: (5, 6)
鱼在: (4, 6)
鱼在: (4, 7)
4
乌龟在: (5, 4)
鱼在: (4, 8)
鱼在: (4, 7)
3
乌龟在: (5, 5)
鱼在: (4, 6)
鱼在: (4, 5)
2
乌龟在: (7, 5)
鱼在: (4, 4)
鱼在: (4, 3)
1
乌龟在: (5, 5)
鱼在: (4, 2)
鱼在: (5, 2)

哦~~我龟龟要挂了~~

问题一:
为什么我的鱼的坐标移动,不是一步一步移动的呢?不解
其他问题:
一:写坐标的自定义变量我是写成Fish.x,小甲鱼是写成self.x的,包括体力也是写成self.power,为什么小甲鱼要用self的呢?这里有什么说法么?
二:以下是乌龟move方法里面的某两行代码,这是修改后的
self.lift -= 1
return(Turtle.x,Turtle.y)
修改前我写的顺序是相反的,如下,然后就不会执行self.lift -=1这一行代码,这是为什么呢?
return(Turtle.x,Turtle.y)
self.lift -= 1
最佳答案
2021-10-24 12:19:10
本帖最后由 suchocolate 于 2021-10-24 18:57 编辑

1.鱼的位置是一步一步移动的。
2.self是类实例本身,self.xxx就是构建实例对象自己的变量,你换成Fish.x,就变成了类变量,就变成了共有变量,所以即使你创建了10个Fish对象,但其实他们位置都是一样的。我的建议是,你先用小甲鱼的代码学会基本的概念,然后再尝试自己改东西。
3.return后函数就结束了,后面同等级的代码就是垃圾代码。建议去复习函数章节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2021-10-24 12:19:10 | 显示全部楼层    本楼为最佳答案   
本帖最后由 suchocolate 于 2021-10-24 18:57 编辑

1.鱼的位置是一步一步移动的。
2.self是类实例本身,self.xxx就是构建实例对象自己的变量,你换成Fish.x,就变成了类变量,就变成了共有变量,所以即使你创建了10个Fish对象,但其实他们位置都是一样的。我的建议是,你先用小甲鱼的代码学会基本的概念,然后再尝试自己改东西。
3.return后函数就结束了,后面同等级的代码就是垃圾代码。建议去复习函数章节。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-10-24 18:12:33 | 显示全部楼层
suchocolate 发表于 2021-10-24 12:19
1.鱼的位置是一步一步移动的。
2.self是类实例本身,self.xxx就是构建实例对象自己的变量,你换成Fish.x, ...

原来如此!!!一语惊醒梦中人的,查了好久,没查出哪里出问题的,谢谢啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-14 02:30

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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