鱼C论坛

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

[已解决]类和对象问题

[复制链接]
发表于 2022-2-20 16:23:47 | 显示全部楼层 |阅读模式
5鱼币
不知哪有问题,帮忙看一下

import random as r
length_y= [0,10]
width_x = [0,10]
class Turtle:
    def __init__(self):
        turtle_power = 100
        x = r.randint(width_x[0],width_x[1])
        y = r.randint(length_y[0],length_y[1])

    def move(self):
        new_x = x + r.choices([-2,-1,0,1,2])
        new_y = y + r.choices([-2,-1,0,1,2])
        if new_x < width_x[0]:
            new_x = width_x[0] + (width_x[0]-new_x)
        elif new_x > width_x[1]:
            new_x = width_x[1] - (new_x - width[1])

        if new_y < length_y[0]:
            new_y = length_y[0] + (length_y[0] - new_y)
        elif new_y > length_y[1]:
            new_y = length_y[1] - (new_y - length_y[1])

        return (new_x,new_y)

    def eat(self):
        turtle_power += 10
        if turtle_power > 100:
            turtle = 100


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

    def move(self):
        new_x = x + r.choices([-1,0,1])
        new_y = y + r.choices([-1,0,1])
        if new_x < width_x[0]:
            new_x = width_x[0] + (width_x[0] - new_x)
        elif new_x >width_x[1]:
            new_x = width_x[1] - (new_x - width[1])

        if new_y < length_y[0]:
            new_y = length_y[0] + (length_y[0] - new_y)
        elif new_y > length_y[1]:
            new_y = length_y[1] - (new_y - length_y[1])

        return (new_x,new_y)

turtle = Turtle()
fish = []
for i in range(10):
    each_fish = Fish()
    fish.append(each_fish)
while 1:
    if not turtle.turtle_power:
        print("乌龟的体力都耗尽了,挂掉了!")
        break
    if not len(fish):
        print("小鱼儿都被吃完了!")
        break
    pos = turtle.move()
    for each in fish[:]:
        if each.move() == pos:
            print("小鱼被吃了!!!")
            turtle.eat()
            fish.remove(each)
最佳答案
2022-2-20 16:23:48
本帖最后由 isdkz 于 2022-2-20 17:20 编辑

有四个问题,

第一个问题:
对象的属性需要加 self. ,因为对象在调用方法的时候会自动给第一个位置参数传入对象本身,
而第一个位置参数是self,你不加 self. 就只是定义了一个函数(方法)里面的局部变量而已

第二个问题:
第16行和第42行的最后一个 width 少了一个 _x,因为你前面定义的变量是 width_x

第三个问题:
你第11、12、37、38行使用了random.choices() 而choices() 返回的是一个列表,你的 x 和 y 属性是整数,整数是不能跟列表相加的,
应该把 choices() 改成 choice(),不要最后的那个 s 返回的才是整数。

第四个问题:
你那个乌龟的体力只加不减,也就是说乌龟永远不会挂掉,
只要鱼没吃完就一直处于死循环没有跳出来,你应该在乌龟移动那里加个消耗体力
import random as r
length_y= [0,10]
width_x = [0,10]
class Turtle:
    def __init__(self):
        self.turtle_power = 100                           # 给所有的对象属性加上 self.
        self.x = r.randint(width_x[0],width_x[1]) 
        self.y = r.randint(length_y[0],length_y[1])

    def move(self):
        self.new_x = self.x + r.choice([-2,-1,0,1,2])                  # choices 改成 choice 
        self.new_y = self.y + r.choice([-2,-1,0,1,2])                  # choices 改成 choice
        if self.new_x < width_x[0]:
            self.new_x = width_x[0] + (width_x[0]-self.new_x)
        elif self.new_x > width_x[1]:
            self.new_x = width_x[1] - (self.new_x - width_x[1])                  # 你这里的最后一个 width 少了_x

        if self.new_y < length_y[0]:
            self.new_y = length_y[0] + (length_y[0] - self.new_y)
        elif self.new_y > length_y[1]:
            self.new_y = length_y[1] - (self.new_y - length_y[1])

        self.turtle_power -= 1          # 消耗体力

        return (self.new_x,self.new_y)

    def eat(self):
        self.turtle_power += 10
        if self.turtle_power > 100:
            self.turtle_power = 100


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

    def move(self):
        self.new_x = self.x + r.choice([-1,0,1])                  # choices 改成 choice
        self.new_y = self.y + r.choice([-1,0,1])                  # choices 改成 choice
        if self.new_x < width_x[0]:
            self.new_x = width_x[0] + (width_x[0] - self.new_x)
        elif self.new_x >width_x[1]:
            self.new_x = width_x[1] - (self.new_x - width_x[1])                  # 你这里的最后一个 width 少了_x

        if self.new_y < length_y[0]:
            self.new_y = length_y[0] + (length_y[0] - self.new_y)
        elif self.new_y > length_y[1]:
            self.new_y = length_y[1] - (self.new_y - length_y[1])

        return (self.new_x,self.new_y)

turtle = Turtle()
fish = []
for i in range(10):
    each_fish = Fish()
    fish.append(each_fish)
while 1:
    if not turtle.turtle_power:
        print("乌龟的体力都耗尽了,挂掉了!")
        break
    if not len(fish):
        print("小鱼儿都被吃完了!")
        break
    pos = turtle.move()
    for each in fish[:]:
        if each.move() == pos:
            print("小鱼被吃了!!!")
            turtle.eat()
            fish.remove(each)

最佳答案

查看完整内容

有四个问题, 第一个问题: 对象的属性需要加 self. ,因为对象在调用方法的时候会自动给第一个位置参数传入对象本身, 而第一个位置参数是self,你不加 self. 就只是定义了一个函数(方法)里面的局部变量而已 第二个问题: 你第16行和第42行的最后一个 width 少了一个 _x,因为你前面定义的变量是 width_x 第三个问题: 你第11、12、37、38行使用了random.choices() 而choices() 返回的是一个列表,你的 x 和 y 属 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-20 16:23:48 | 显示全部楼层    本楼为最佳答案   
本帖最后由 isdkz 于 2022-2-20 17:20 编辑

有四个问题,

第一个问题:
对象的属性需要加 self. ,因为对象在调用方法的时候会自动给第一个位置参数传入对象本身,
而第一个位置参数是self,你不加 self. 就只是定义了一个函数(方法)里面的局部变量而已

第二个问题:
第16行和第42行的最后一个 width 少了一个 _x,因为你前面定义的变量是 width_x

第三个问题:
你第11、12、37、38行使用了random.choices() 而choices() 返回的是一个列表,你的 x 和 y 属性是整数,整数是不能跟列表相加的,
应该把 choices() 改成 choice(),不要最后的那个 s 返回的才是整数。

第四个问题:
你那个乌龟的体力只加不减,也就是说乌龟永远不会挂掉,
只要鱼没吃完就一直处于死循环没有跳出来,你应该在乌龟移动那里加个消耗体力
import random as r
length_y= [0,10]
width_x = [0,10]
class Turtle:
    def __init__(self):
        self.turtle_power = 100                           # 给所有的对象属性加上 self.
        self.x = r.randint(width_x[0],width_x[1]) 
        self.y = r.randint(length_y[0],length_y[1])

    def move(self):
        self.new_x = self.x + r.choice([-2,-1,0,1,2])                  # choices 改成 choice 
        self.new_y = self.y + r.choice([-2,-1,0,1,2])                  # choices 改成 choice
        if self.new_x < width_x[0]:
            self.new_x = width_x[0] + (width_x[0]-self.new_x)
        elif self.new_x > width_x[1]:
            self.new_x = width_x[1] - (self.new_x - width_x[1])                  # 你这里的最后一个 width 少了_x

        if self.new_y < length_y[0]:
            self.new_y = length_y[0] + (length_y[0] - self.new_y)
        elif self.new_y > length_y[1]:
            self.new_y = length_y[1] - (self.new_y - length_y[1])

        self.turtle_power -= 1          # 消耗体力

        return (self.new_x,self.new_y)

    def eat(self):
        self.turtle_power += 10
        if self.turtle_power > 100:
            self.turtle_power = 100


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

    def move(self):
        self.new_x = self.x + r.choice([-1,0,1])                  # choices 改成 choice
        self.new_y = self.y + r.choice([-1,0,1])                  # choices 改成 choice
        if self.new_x < width_x[0]:
            self.new_x = width_x[0] + (width_x[0] - self.new_x)
        elif self.new_x >width_x[1]:
            self.new_x = width_x[1] - (self.new_x - width_x[1])                  # 你这里的最后一个 width 少了_x

        if self.new_y < length_y[0]:
            self.new_y = length_y[0] + (length_y[0] - self.new_y)
        elif self.new_y > length_y[1]:
            self.new_y = length_y[1] - (self.new_y - length_y[1])

        return (self.new_x,self.new_y)

turtle = Turtle()
fish = []
for i in range(10):
    each_fish = Fish()
    fish.append(each_fish)
while 1:
    if not turtle.turtle_power:
        print("乌龟的体力都耗尽了,挂掉了!")
        break
    if not len(fish):
        print("小鱼儿都被吃完了!")
        break
    pos = turtle.move()
    for each in fish[:]:
        if each.move() == pos:
            print("小鱼被吃了!!!")
            turtle.eat()
            fish.remove(each)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-20 16:46:46 | 显示全部楼层
这样试试:
import random as r


width = [0, 10]
height = [0, 10]


class Turtle:
    def __init__(self):
        self.turtle_power = 100
        self.x = r.randint(width[0], width[1])
        self.y = r.randint(height[0], height[1])

    def move(self):
        new_x = self.x + r.choice([-2, -1, 0, 1, 2])
        new_y = self.y + r.choice([-2, -1, 0, 1, 2])
        if new_x < width[0]:
            new_x = width[0] + (width[0] - new_x)
        elif new_x > width[1]:
            new_x = width[1] - (new_x - width[1])

        if new_y < height[0]:
            new_y = height[0] + (height[0] - new_y)
        elif new_y > height[1]:
            new_y = height[1] - (new_y - height[1])

        self.turtle_power -= 1

        return (new_x, new_y)

    def eat(self):
        self.turtle_power += 10
        if self.turtle_power > 100:
            self.turtle_power = 100


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

    def move(self):
        new_x = self.x + r.choice([-1, 0, 1])
        new_y = self.y + r.choice([-1, 0, 1])
        if new_x < width[0]:
            new_x = width[0] + (width[0] - new_x)
        elif new_x > width[1]:
            new_x = width[1] - (new_x - width[1])

        if new_y < height[0]:
            new_y = height[0] + (height[0] - new_y)
        elif new_y > height[1]:
            new_y = height[1] - (new_y - height[1])

        return (new_x, new_y)


turtle = Turtle()
fish = []

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

while 1:
    if not turtle.turtle_power:
        print("乌龟的体力都耗尽了,挂掉了!")
        break
    if not len(fish):
        print("小鱼儿都被吃完了!")
        break
    pos = turtle.move()
    for each in fish[:]:
        if each.move() == pos:
            print("小鱼被吃了!!!")
            turtle.eat()
            fish.remove(each)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-20 19:08:06 | 显示全部楼层
问题有点多,怪难为情的
看来还要更努力才行
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-20 19:09:44 | 显示全部楼层
isdkz 发表于 2022-2-20 17:12
有四个问题,

第一个问题:

变量前加self.还不太懂能详细点吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-20 19:23:16 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-20 19:32 编辑
不弃_ 发表于 2022-2-20 19:09
变量前加self.还不太懂能详细点吗?


在面向对象编程中,命名空间从全局与局部上升到类与对象

想要访问某个主体(类或对象)的命名空间用 . 来访问,. 表示的,比如 Human.eye 表示人类的眼睛,xiaoming.eye 表示小明的眼睛,

在面向对象中不止两个不同的主体中需要一个称呼来辨别是谁的,同一个主体也需要一个称呼,这个称呼就是self,

self就是自己的意思

在对象与对象或由对象本身产生的操作中得确定是哪个对象产生的动作(方法),需要用到哪个对象的属性

这时候就需要一个称呼来确定是哪个对象

不同的对象之间称呼用名字即可,就比如你要找某个人称呼他的名字即可,

但是自己称呼自己总不能也叫名字吧,就像你称呼自己也不会用名字来称呼一样,通常我们用“我”,

就像python约定俗成地用self一样,这个self是由python解释器自动传给第一个形参的

不过这不是硬性规定地,就比如你自己可以称呼自己为“本人”、“某”,

python里面形参的名字也是可以随意变动的,self作为对象方法的形参,名字也是可以随意改动的,

可以把self换成别的名字

但是最好使用约定俗成的方式,有利于别人阅读你的代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2022-2-20 19:45:57 | 显示全部楼层
本帖最后由 isdkz 于 2022-2-20 19:47 编辑
不弃_ 发表于 2022-2-20 19:09
变量前加self.还不太懂能详细点吗?


你也可以这么理解,全局变量,类变量,局部变量都是可以直接定义的,

像这种可以直接定义的变量的归属都很明显,

哪个变量是在哪个类里面定义的,它就属于哪个类,  ( 类变量)

在哪个函数里面定义的,它就属于哪个函数,             ( 局部变量)

在哪个python源文件定义的,它就属于哪个python源文件        ( 全局变量)

而实例只有在类实例化之后才会存在,所以实例变量是不可以直接定义的,

不可以直接定义的话,你随便拿一个变量出来,这个名字的变量又不一定是它特有的,

那怎么就知道这个变量就属于它呢,python解释器会自动传入self(也就是实例本身),

通过 self.xxx 的方式来访问,让它知道它要获取的是自己的变量,而不是全局变量或局部变量

实例方法也是一样的道理
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-21 16:17:51 | 显示全部楼层
isdkz 发表于 2022-2-20 19:45
你也可以这么理解,全局变量,类变量,局部变量都是可以直接定义的,

像这种可以直接定义的变量的归 ...

谢谢你
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2022-2-21 16:44:43 | 显示全部楼层
isdkz 发表于 2022-2-20 16:23
有四个问题,

第一个问题:

不知道你有没有发现小鱼儿被吃的概率很低,大多数情况下都是乌龟累死。但按道理来说这范围不大啊,不应该啊
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-1-12 06:03

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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