鱼C论坛

 找回密码
 立即注册
查看: 1277|回复: 14

[已解决]萌新求助!!为什么我按照课后题答案写的会死循环了

[复制链接]
发表于 2018-3-19 17:47:11 | 显示全部楼层 |阅读模式

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

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

x
各位大佬,我在学习面向对象编程第二节课时,做了小甲鱼的课后题乌龟与鱼的游戏题,我只是在类的定义里加入了继承的东西,主函数没想好于是按照答案写的,可是就死循环了,希望大佬帮我看看问题出在哪里,谢谢
import random as r
class Site:
    def __init__(self):
        self.x=r.randint(0,10)
        self.y=r.randint(0,10)#构造函数

    def is_in(self):
        if (0<=self.x<=10) and (0<=self.y<=10):
            return 1
        else:
            return 0
    def move(self):


        a=r.randint(-2,2)
        b=r.randinr(-2,2)
        if (self.x+a<=10) and (self.y+b<=10):
            self.x=abs(self.x+a)
            self.y=abs(self.y+b)
        elif (self.x+a<=10) and (self.y+b>10):
            self.x=abs(self.x+a)
            self.y=10-(self.y+b-10)
        elif (self.x>10) and (self.y<=10):
            self.y=abs(self.y+b)
            self.x=10-(self.x+a-10)
        else:
            self.x=10-(self.x+a-10)
            self.y=10-(self.y+b-10)

        return (self.x,self.y)
class Fish(Site):
    def __init__(self):
        super().__init__()
        self.count=10
    def move(self):
        super().move()
        a=r.randint(-1,1)
        b=r.randinr(-1,1)
    def getSite(self):
        print("当前鱼儿位置是(%d,%d)"%(self.x,self.y))
        return (self.x,self.y)
class Turtle(Site):
    def __init__(self):
        super().__init__()
        self.amount=1
        self.power=100
        self.hunger=False



    def the_power(self,hunger=False):
        if self.hunger:
            self.power+=20
        else:
            self.power-=1

    def alive(self):
        if self.power<0:
            return 0
        else:
            return 1
    def getSite(self):
        print("当前乌龟位置是(%d,%d)"%(self.x,self.y))
        return (self.x,self.y)
turtle=Turtle()
fish=[]
for i in range(0,10):
    f=Fish()
    fish.append(f)
while 1:
    if not len(fish):
        print("鱼死光了,gg")
        break
    if not turtle.alive():
        print("得意什么?乌龟死了也gg")
        break
    pos=turtle.getSite()
    for each in fish:
        if each.getSite()==pos:
            turtule.the_power(hunger=True)
            fish.remove(each)
            print("一条鱼被吃掉了!")
最佳答案
2018-3-19 20:19:56
本帖最后由 Charles未晞 于 2018-3-19 20:21 编辑

代码好乱、、、看在头像比较萌的份上怒答一波。。。
我没看过小甲鱼的课后题,不知道题目是什么。但是首先:
  1. b = r.randinr(-1,1)
复制代码

这个肯定不对,目测楼主打错了,这个错误有两处。
其次倒数第三行应该是这个,你打错了。
  1. turtle.the_power(hunger=True)
复制代码

最后,鱼好歹要move吧。
也就是最后一行应该有:
  1. each.move()
复制代码

缩进同if。
死循环估计是鱼一直保持不动的原因。。。。。。。
代码惨不忍睹,我不想仔细分析,也没啥萌点的配图,我觉得这差不多了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-3-19 19:22:05 | 显示全部楼层
  1. import random as r
  2. class Site:
  3.     def __init__(self):
  4.         self.x=r.randint(0,10)
  5.         self.y=r.randint(0,10)#构造函数

  6.     def is_in(self):
  7.         if (0<=self.x<=10) and (0<=self.y<=10):
  8.             return 1
  9.         else:
  10.             return 0
  11.     def move(self):


  12.         a=r.randint(-2,2)
  13.         b=r.randint(-2,2)
  14.         if (self.x+a<=10) and (self.y+b<=10):
  15.             self.x=abs(self.x+a)
  16.             self.y=abs(self.y+b)
  17.         elif (self.x+a<=10) and (self.y+b>10):
  18.             self.x=abs(self.x+a)
  19.             self.y=10-(self.y+b-10)
  20.         elif (self.x>10) and (self.y<=10):
  21.             self.y=abs(self.y+b)
  22.             self.x=10-(self.x+a-10)
  23.         else:
  24.             self.x=10-(self.x+a-10)
  25.             self.y=10-(self.y+b-10)

  26.         return (self.x,self.y)
  27.    
  28. class Fish(Site):
  29.     def __init__(self):
  30.         super().__init__()
  31.         self.count=10
  32.     def move(self):
  33.         super().move()
  34.         a=r.randint(-1,1)
  35.         b=r.randint(-1,1)
  36.     def getSite(self):
  37.         print("当前鱼儿位置是(%d,%d)"%(self.x,self.y))
  38.         return (self.x,self.y)
  39.    
  40. class Turtle(Site):
  41.     def __init__(self):
  42.         super().__init__()
  43.         self.amount=1
  44.         self.power=100
  45.         self.hunger=False



  46.     def the_power(self,hunger=False):
  47.         if self.hunger:
  48.             self.power+=20
  49.         else:
  50.             self.power-=1

  51.     def alive(self):
  52.         if self.power<0:
  53.             return 0
  54.         else:
  55.             return 1
  56.     def getSite(self):
  57.         print("当前乌龟位置是(%d,%d)"%(self.x,self.y))
  58.         return (self.x,self.y)
  59.    
  60. turtle=Turtle()
  61. fish=[]
  62. for i in range(0,10):
  63.     f=Fish()
  64.     fish.append(f)
  65. while 1:
  66.     if not len(fish):
  67.         print("鱼死光了,gg")
  68.         break
  69.     if not turtle.alive():
  70.         print("得意什么?乌龟死了也gg")
  71.         break
  72.     pos=turtle.getSite()
  73.     for each in fish:
  74.         if each.getSite()==pos:
  75.             turtle.the_power(True)
  76.             fish.remove(each)
  77.             print("一条鱼被吃掉了!")
  78.         each.move()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-19 19:50:48 | 显示全部楼层

你都改了什么,能说明一下原因吗?谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-19 19:51:21 | 显示全部楼层
土间埋 发表于 2018-3-19 19:50
你都改了什么,能说明一下原因吗?谢谢

刚学到这里,很懵逼的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 20:19:56 | 显示全部楼层    本楼为最佳答案   
本帖最后由 Charles未晞 于 2018-3-19 20:21 编辑

代码好乱、、、看在头像比较萌的份上怒答一波。。。
我没看过小甲鱼的课后题,不知道题目是什么。但是首先:
  1. b = r.randinr(-1,1)
复制代码

这个肯定不对,目测楼主打错了,这个错误有两处。
其次倒数第三行应该是这个,你打错了。
  1. turtle.the_power(hunger=True)
复制代码

最后,鱼好歹要move吧。
也就是最后一行应该有:
  1. each.move()
复制代码

缩进同if。
死循环估计是鱼一直保持不动的原因。。。。。。。
代码惨不忍睹,我不想仔细分析,也没啥萌点的配图,我觉得这差不多了。。。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-3-19 21:17:44 | 显示全部楼层
Charles未晞 发表于 2018-3-19 20:19
代码好乱、、、看在头像比较萌的份上怒答一波。。。
我没看过小甲鱼的课后题,不知道题目是什么。但是首先 ...

谢谢大佬的指正,上面的一些问题是我打错了,但即使如此,依旧还是死循环,不知道问题出在哪里。另外,代码比较乱这个原谅我第一次编写这么长的代码,中间修改好多次,所以就。。。。如果有什么规范的建议还请麻烦多提一下,谢谢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 21:20:45 | 显示全部楼层
土间埋 发表于 2018-3-19 21:17
谢谢大佬的指正,上面的一些问题是我打错了,但即使如此,依旧还是死循环,不知道问题出在哪里。另外,代 ...

你最后加上each.move()还是死循环嘛,哥你别骗我。。。。。。。。看上去不会死循环了。。。
each.move()和if each.get....那行代码缩进一致、
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-19 21:25:41 | 显示全部楼层
Charles未晞 发表于 2018-3-19 21:20
你最后加上each.move()还是死循环嘛,哥你别骗我。。。。。。。。看上去不会死循环了。。。
each.move() ...

现在这样了。。。。
"C:\Users\samsung\Desktop\python learning\python.exe" C:/Users/samsung/PycharmProjects/untitled6/.idea/鱼和乌龟.py
  File "C:/Users/samsung/PycharmProjects/untitled6/.idea/鱼和乌龟.py", line 83
    each.move()
              ^
IndentationError: unindent does not match any outer indentation level
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 21:28:25 | 显示全部楼层
土间埋 发表于 2018-3-19 21:25
现在这样了。。。。
"C:%users\samsung\Desktop\python learning\python.exe" C:/Users/samsung/Pycharm ...

G$[XWLOVE)0MLRDH]MC56C5.png
没问题呀~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 21:29:00 | 显示全部楼层
  1. import random as r


  2. class Site:
  3.     def __init__(self):
  4.         self.x = r.randint(0, 10)
  5.         self.y = r.randint(0, 10)#构造函数
  6.     def is_in(self):
  7.         if (0<=self.x<=10) and (0<=self.y<=10):
  8.             return 1
  9.         else:
  10.             return 0
  11.     def move(self):
  12.         a = r.randint(-2, 2)
  13.         b = r.randint(-2, 2)
  14.         if (self.x+a <= 10) and (self.y+b <= 10):
  15.             self.x = abs(self.x+a)
  16.             self.y = abs(self.y+b)
  17.         elif (self.x+a <= 10) and (self.y+b > 10):
  18.             self.x = abs(self.x+a)
  19.             self.y = 10-(self.y+b-10)
  20.         elif (self.x > 10) and (self.y <= 10):
  21.             self.y = abs(self.y+b)
  22.             self.x = 10-(self.x+a-10)
  23.         else:
  24.             self.x = 10-(self.x+a-10)
  25.             self.y = 10-(self.y+b-10)
  26.         return (self.x, self.y)


  27. class Fish(Site):
  28.     def __init__(self):
  29.         super().__init__()
  30.         self.count = 10
  31.     def move(self):
  32.         super().move()
  33.         a=r.randint(-1, 1)
  34.         b=r.randint(-1, 1)
  35.     def getSite(self):
  36.         print("当前鱼儿位置是(%d, %d)"%(self.x, self.y))
  37.         return (self.x, self.y)


  38. class Turtle(Site):
  39.     def __init__(self):
  40.         super().__init__()
  41.         self.amount = 1
  42.         self.power = 100
  43.         self.hunger = False
  44.     def the_power(self, hunger=False):
  45.         if self.hunger:
  46.             self.power += 20
  47.         else:
  48.             self.power -= 1
  49.     def alive(self):
  50.         if self.power < 0:
  51.             return 0
  52.         else:
  53.             return 1
  54.     def getSite(self):
  55.         print("当前乌龟位置是(%d, %d)" % (self.x, self.y))
  56.         return (self.x, self.y)



  57. if __name__ == '__main__':
  58.     turtle=Turtle()
  59.     fish=[]
  60.     for i in range(0, 10):
  61.         f = Fish()
  62.         fish.append(f)
  63.     while 1:
  64.         if not len(fish):
  65.             print("鱼死光了,gg")
  66.             break
  67.         if not turtle.alive():
  68.             print("得意什么?乌龟死了也gg")
  69.             break
  70.         pos = turtle.getSite()
  71.         for each in fish:
  72.             if each.getSite() == pos:
  73.                 turtle.the_power(hunger=True)
  74.                 fish.remove(each)
  75.                 print("一条鱼被吃掉了!")
  76.             each.move()
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 21:29:54 | 显示全部楼层
土间埋 发表于 2018-3-19 21:25
现在这样了。。。。
"C:%users\samsung\Desktop\python learning\python.exe" C:/Users/samsung/Pycharm ...

你这个提示是缩进不对吧~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 21:30:38 | 显示全部楼层
好了记得采纳下~~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-3-19 21:36:57 | 显示全部楼层
解决了,谢谢大佬,麻烦你再具体说下我代码哪里写的乱了,应该这么改进好
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-3-19 21:49:44 | 显示全部楼层
土间埋 发表于 2018-3-19 21:36
解决了,谢谢大佬,麻烦你再具体说下我代码哪里写的乱了,应该这么改进好

我个人认为吧。。。
代码中加入适当的空格可以让代码看起来清楚一点。
比如
  1. a=b 和a = b
复制代码

后者看起来会好点。
然后代码字母最好有一定的意义,这样可读性比较好。
还有就是最好不同的代码块、不同功能的代码之间留空行,不要随便空行,不然看起来很奇怪。
你可以对比一下我给你的代码和你自己的代码。。。看看是不是好一点。。。我稍微改了下格式过的。
最后就是代码写起来要易于维护和扩展之类的。。。这些你可以暂时不要考虑~~~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

 楼主| 发表于 2018-3-19 22:11:28 | 显示全部楼层
Charles未晞 发表于 2018-3-19 21:49
我个人认为吧。。。
代码中加入适当的空格可以让代码看起来清楚一点。
比如

明白了,谢谢大佬指教
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-3-29 21:45

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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