鱼C论坛

 找回密码
 立即注册
查看: 2719|回复: 16

[已解决]python 列表和类求助

[复制链接]
发表于 2020-3-2 18:45:49 | 显示全部楼层 |阅读模式
50鱼币
Python037讲课后作业,Fish类中我想让他们随机按(0,1)(1,0) (-1,0)(0,-1)四个方向移动 ,当鱼和乌龟坐标一致时 remove掉当前坐标的鱼,其中标记的两句for循环 用上面那个就能正常运行处结果,用下面的那个当鱼变成9条时就会报错。
原题目如下:
1. 游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏。(初学者不一定可以完整实现,但请务必先自己动手,你会从中学习到很多知识的^_^)
假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10
游戏生成1只乌龟和10条鱼
它们的移动方向均随机
乌龟的最大移动能力是2(Ta可以随机选择1还是2移动),鱼儿的最大移动能力是1
当移动到场景边缘,自动向反方向移动
乌龟初始化体力为100(上限)
乌龟每移动一次,体力消耗1
当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
鱼暂不计算体力
当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束
import random
class Fish:
    listp = []
    many=0
    def bron(self,x):
        Fish.many=x
        for i in range(Fish.many):
            x=random.randint(0,10)
            y=random.randint(0,10)
            Fish.listp.append ((x,y))
        return Fish.listp
    def run(self):
       for i in range(len(Fish.listp)):
        #for i in range(Fish.many):
            x=random.randint(1,4)
            if x==1:
                if Fish.listp[i][0]<10:
                    Fish.listp[i]=(Fish.listp[i][0]+1,Fish.listp[i][1])
                else:
                    Fish.listp[i] = (Fish.listp[i][0]-1, Fish.listp[i][1])
            if x==2:
                if Fish.listp[i][1]<10:
                    Fish.listp[i]=(Fish.listp[i][0],Fish.listp[i][1]+1)
                else:
                    Fish.listp[i] = (Fish.listp[i][0], Fish.listp[i][1] - 1)
            if x==3:
                if Fish.listp[i][0]>0:
                    Fish.listp[i]=(Fish.listp[i][0]-1,Fish.listp[i][1])
                else:
                    Fish.listp[i] = (Fish.listp[i][0]+1, Fish.listp[i][1])
            if x==4:
                if Fish.listp[i][1]>0:
                    Fish.listp[i]=(Fish.listp[i][0],Fish.listp[i][1]-1)
                else:
                    Fish.listp[i] = (Fish.listp[i][0], Fish.listp[1]+1)
        return  Fish.listp

class Tor:
    M=100
    listp = []
    def bron(self):
        x=random.randint(0,10)
        y=random.randint(0,10)
        Tor.listp.append((x,y))
        return Tor.listp
    def run(self):
        for i in range(2):
            x=random.randint(1,4)
            if x==1:
                if Tor.listp[0][0]<10:
                    Tor.listp[0]=(Tor.listp[0][0]+1,Tor.listp[0][1])
                else:
                    Tor.listp[0] = (Tor.listp[0][0]-1, Tor.listp[0][1])
            if x==2:
                if Tor.listp[0][1]<10:
                    Tor.listp[0]=(Tor.listp[0][0],Tor.listp[0][1]+1)
                else:
                    Tor.listp[0] = (Tor.listp[0][0], Tor.listp[0][1] - 1)
            if x==3:
                if Tor.listp[0][0]>0:
                    Tor.listp[0]=(Tor.listp[0][0]-1,Tor.listp[0][1])
                else:
                    Tor.listp[0] = (Tor.listp[0][0]+1, Tor.listp[0][1])
            if x==4:
                if Tor.listp[0][1]>0:
                    Tor.listp[0]=(Tor.listp[0][0],Tor.listp[0][1]-1)
                else:
                    Tor.listp[0] = (Tor.listp[0][0], Tor.listp[0][1]+1)
        Tor.M-=1
        return  Tor.listp

def mian():
    t=Tor()
    t.bron()
    f=Fish()
    f.bron(10)
    while t.M>0 and f.many>0 :
        f.run()
        t.run()
        if t.listp[0] in f.listp:
            f.many = f.many - 1
            f.listp.remove(t.listp[0])
            t.M=t.M+20
            print('==============')
        print(t.listp)
        print(f.listp)
        print('还剩%s条鱼' %f.many)
        print('还剩%s的体力'%t.M)


mian()
[/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i][/i]
最佳答案
2020-3-2 18:45:50
池里的实际鱼数量f.listp随着被乌龟吃掉而不断减少,Fish.many 只是一开始你传入的鱼数量,是不变的。当池的实际鱼数 f.listp少于10的时候,你还往 if Fish.listp[i][0]>0: 里面的 i  传入10 就会报错:


Traceback (most recent call last):
  File "D:/python/2020_03/03_2.py", line 95, in <module>
    mian()
  File "D:/python/2020_03/03_2.py", line 82, in mian
    f.run()
  File "D:/python/2020_03/03_2.py", line 31, in run
    if Fish.listp[i][0]>0:
IndexError: list index out of range

Process finished with exit code 1


    你在mian 函数里的修改:

if t.listp[0] in f.listp:
            f.many = f.many - 1

    只对类 class Fish: 里的 many 起作用,但对函数

    def bron(self,x):
        Fish.many=x
      
    里的   fish.many   没有影响,fish.many 只跟你传入的参数 x 有关,所以 fish.many 的值自始至终都是 f.bron(10),即是 10 ,才会出现   IndexError: list index out of range  报错。

不知道是不是这样???第一次回复帖子,请大佬们指点,谢谢。

最佳答案

查看完整内容

池里的实际鱼数量f.listp随着被乌龟吃掉而不断减少,Fish.many 只是一开始你传入的鱼数量,是不变的。当池的实际鱼数 f.listp少于10的时候,你还往 if Fish.listp[0]>0: 里面的 i 传入10 就会报错: Traceback (most recent call last): File "D:/python/2020_03/03_2.py", line 95, in mian() File "D:/python/2020_03/03_2.py", line 82, in mian f.run() File "D:/python/2020_03/03_2.py", line 31, ...
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 18:45:50 | 显示全部楼层    本楼为最佳答案   
池里的实际鱼数量f.listp随着被乌龟吃掉而不断减少,Fish.many 只是一开始你传入的鱼数量,是不变的。当池的实际鱼数 f.listp少于10的时候,你还往 if Fish.listp[i][0]>0: 里面的 i  传入10 就会报错:


Traceback (most recent call last):
  File "D:/python/2020_03/03_2.py", line 95, in <module>
    mian()
  File "D:/python/2020_03/03_2.py", line 82, in mian
    f.run()
  File "D:/python/2020_03/03_2.py", line 31, in run
    if Fish.listp[i][0]>0:
IndexError: list index out of range

Process finished with exit code 1


    你在mian 函数里的修改:

if t.listp[0] in f.listp:
            f.many = f.many - 1

    只对类 class Fish: 里的 many 起作用,但对函数

    def bron(self,x):
        Fish.many=x
      
    里的   fish.many   没有影响,fish.many 只跟你传入的参数 x 有关,所以 fish.many 的值自始至终都是 f.bron(10),即是 10 ,才会出现   IndexError: list index out of range  报错。

不知道是不是这样???第一次回复帖子,请大佬们指点,谢谢。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 18:55:58 | 显示全部楼层
  1. import random
  2. class Fish:
  3.     listp = []
  4.     many=0
  5.     def bron(self,x):
  6.         Fish.many=x
  7.         for i in range(Fish.many):
  8.             x=random.randint(0,10)
  9.             y=random.randint(0,10)
  10.             Fish.listp.append ((x,y))
  11.         return Fish.listp
  12.     def run(self):
  13.         for i in range(len(Fish.listp)):
  14.         #for i in range(Fish.many):
  15.             x=random.randint(1,4)
  16.             if x==1:
  17.                 if Fish.listp[i][0]<10:
  18.                     Fish.listp[i]=(Fish.listp[i][0]+1,Fish.listp[i][1])
  19.                 else:
  20.                     Fish.listp[i] = (Fish.listp[i][0]-1, Fish.listp[i][1])
  21.             if x==2:
  22.                 if Fish.listp[i][1]<10:
  23.                     Fish.listp[i]=(Fish.listp[i][0],Fish.listp[i][1]+1)
  24.                 else:
  25.                     Fish.listp[i] = (Fish.listp[i][0], Fish.listp[i][1] - 1)
  26.             if x==3:
  27.                 if Fish.listp[i][0]>0:
  28.                     Fish.listp[i]=(Fish.listp[i][0]-1,Fish.listp[i][1])
  29.                 else:
  30.                     Fish.listp[i] = (Fish.listp[i][0]+1, Fish.listp[i][1])
  31.             if x==4:
  32.                 if Fish.listp[i][1]>0:
  33.                     Fish.listp[i]=(Fish.listp[i][0],Fish.listp[i][1]-1)
  34.                 else:
  35.                     Fish.listp[i] = (Fish.listp[i][0], Fish.listp[i][1]+1)
  36.         return  Fish.listp

  37. class Tor:
  38.     M=100
  39.     listp = []
  40.     def bron(self):
  41.         x=random.randint(0,10)
  42.         y=random.randint(0,10)
  43.         Tor.listp.append((x,y))
  44.         return Tor.listp
  45.     def run(self):
  46.         for i in range(2):
  47.             x=random.randint(1,4)
  48.             if x==1:
  49.                 if Tor.listp[0][0]<10:
  50.                     Tor.listp[0]=(Tor.listp[0][0]+1,Tor.listp[0][1])
  51.                 else:
  52.                     Tor.listp[0] = (Tor.listp[0][0]-1, Tor.listp[0][1])
  53.             if x==2:
  54.                 if Tor.listp[0][1]<10:
  55.                     Tor.listp[0]=(Tor.listp[0][0],Tor.listp[0][1]+1)
  56.                 else:
  57.                     Tor.listp[0] = (Tor.listp[0][0], Tor.listp[0][1] - 1)
  58.             if x==3:
  59.                 if Tor.listp[0][0]>0:
  60.                     Tor.listp[0]=(Tor.listp[0][0]-1,Tor.listp[0][1])
  61.                 else:
  62.                     Tor.listp[0] = (Tor.listp[0][0]+1, Tor.listp[0][1])
  63.             if x==4:
  64.                 if Tor.listp[0][1]>0:
  65.                     Tor.listp[0]=(Tor.listp[0][0],Tor.listp[0][1]-1)
  66.                 else:
  67.                     Tor.listp[0] = (Tor.listp[0][0], Tor.listp[0][1]+1)
  68.         Tor.M-=1
  69.         return  Tor.listp

  70. def mian():
  71.     t=Tor()
  72.     t.bron()
  73.     f=Fish()
  74.     f.bron(10)
  75.     while t.M>0 and f.many>0 :
  76.         f.run()
  77.         t.run()
  78.         if t.listp[0] in f.listp:
  79.             f.many = f.many - 1
  80.             f.listp.remove(t.listp[0])
  81.             t.M=t.M+20
  82.             print('==============')
  83.         print(t.listp)
  84.         print(f.listp)
  85.         print('还剩%s条鱼' %f.many)
  86.         print('还剩%s的体力'%t.M)


  87. mian()
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 19:11:42 | 显示全部楼层
        x=random.randint(0,10)
        y=random.randint(0,10)
朋友  这个 是 [0-10]所有的数
一共11个数字
你这个是 11x11的
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 19:13:08 | 显示全部楼层
我其实也没自习看完 但是我觉得会有越界错误
你的池塘一共 10x10
生成的位置是 11x11 里面随机一个坐标
感觉会出错吧
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 19:17:40 | 显示全部楼层
而且 应该写个 input()不然你这 乌龟必然走两步。。
应该需要用户交互一下 来决定走1还是2 或者设置个随机数 来选择是1还是2
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:17:44 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:13
我其实也没自习看完 但是我觉得会有越界错误
你的池塘一共 10x10
生成的位置是 11x11 里面随机一个坐标

random.randint(0,10) 是生成0 1 2 3 4 5 6 7 8 9 10 包含10的随机数 有11个值
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:18:27 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:13
我其实也没自习看完 但是我觉得会有越界错误
你的池塘一共 10x10
生成的位置是 11x11 里面随机一个坐标

for 用绿色那句 就不会错 用下面那句 当鱼少了一个 程序就结束了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 19:18:34 | 显示全部楼层
谭龚子 发表于 2020-3-2 19:17
random.randint(0,10) 是生成0 1 2 3 4 5 6 7 8 9 10 包含10的随机数 有11个值

对呀 所以就会有问题 你觉得呢
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:20:52 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:18
对呀 所以就会有问题 你觉得呢

不会啊 当他移动的时候 是1-9里面正常动 当其等于0 或者10的时候就反向啊  也11个数字之间变换啊
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:22:01 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:17
而且 应该写个 input()不然你这 乌龟必然走两步。。
应该需要用户交互一下 来决定走1还是2 或者设置个随 ...

对的 这个我少也写了一个随机在乌龟移动的循环里面
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 19:23:02 | 显示全部楼层
谭龚子 发表于 2020-3-2 19:18
for 用绿色那句 就不会错 用下面那句 当鱼少了一个 程序就结束了

我其实没有明白你说的这个for 循环是什么意思
我的意思是 你的界面只有10x10 但是你创建鱼和乌龟的坐标的时候 是 11x11 里面的任意坐标
比如说 可能生成在 (2,10) 但是你的边界就是10 乌龟直接坐落在边界上了
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2020-3-2 19:25:11 | 显示全部楼层
哦哦抱歉 我没看到你求助的问题
你这个用上面的是因为 len(list)是一个变量
假如鱼被吃了一条 就9条鱼了 你还遍历10遍数组 到第10个的时候 就越界了 因为一共就9只鱼
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:25:40 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:23
我其实没有明白你说的这个for 循环是什么意思
我的意思是 你的界面只有10x10 但是你创建鱼和乌龟的坐标 ...

这循环是 让鱼随机动一个格子当大于0小于10的时候正常移动  等于0或10 就反向 移动的界限也是【0】到【10】
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:26:21 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:23
我其实没有明白你说的这个for 循环是什么意思
我的意思是 你的界面只有10x10 但是你创建鱼和乌龟的坐标 ...

乌龟在边界如果向着边界方向移动 我代码里面写的他会调头
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:29:01 | 显示全部楼层
ArmandXiao 发表于 2020-3-2 19:25
哦哦抱歉 我没看到你求助的问题
你这个用上面的是因为 len(list)是一个变量
假如鱼被吃了一条 就9条鱼了  ...

但是我也在mian 函数里面 写了 鱼被吃了的话就鱼的数量就减一
  1. if t.listp[0] in f.listp:
  2.             f.many = f.many - 1
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2020-3-2 19:35:30 | 显示全部楼层
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2026-3-1 13:31

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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