鱼C论坛

 找回密码
 立即注册
查看: 4010|回复: 21

[已解决]龟吃小鱼的小游戏 的问题

[复制链接]
发表于 2016-2-5 05:22:30 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 漆雕古代 于 2016-2-7 00:19 编辑

首先祝各位鱼友新年快乐~(我今年是回不了家乡过年了。。。
在新的一年里更加一步一个脚印的往前走~
我们都还在自己的路上挣扎哈哈哈


37课课后作业动动手1

题目就不再赘述了。

我自己写完了以后运行没问题,但是多重复运行几次以后我就觉得很不对劲了

不管怎么随机移动,鱼儿似乎总是在同一个回合内突然一下全部死光光的?
而且乌龟如果是耗尽体力那就绝对是一条鱼也吃不到的死掉的。。。

自己检查了好久,感觉逻辑上并没有出现什么差错啊?


代码附上
不好意思,之前半夜三更有点困没有加上注释(有时差。。。)

  1. import random as r


  2. class Main:
  3.     # 这里是我是希望通过1、2、3、4分别代表上下左右四个方向
  4.     def getdirection(self):
  5.         return r.randint(1,4)

  6.     # 这里只是通过一个简单的函数确认 coordonnes 坐标的横纵坐标有没有超出范围
  7.     #                           coordonnes 会在后面定义为一个元组代表坐标
  8.     def valider_limite(self, coordonnes):
  9.         for it in coordonnes:
  10.             if it < 0 or it > 11:
  11.                 return 1
  12.         return 0
  13.    
  14.     def direction_principe(self, direction, coordonnes, deplace):   # direction是传入由本类第一个方法返回的1-4中的一个数字
  15.                                                                     # coordoones是传入坐标的参数 list类(方便更改)
  16.                                                                     # deplace是由后来的两个子类中的方法获得的可以行动的步数1或2
  17.         # 分别对应如下
  18.         #           1:  y坐标+1
  19.         #           2:  y坐标-1
  20.         #           3:  x坐标+1
  21.         #           4:  x坐标-1
  22.         #   注:横纵坐标分别是变量 coordonnes 的 [0] 和 [1]
  23.         if direction == 1:
  24.             coordonnes[1] += deplace
  25.             # 一下这里是判断变化后的坐标有没有超出范围,如果超出将会以取两倍相反数的形式将坐标更换为正确的形式   
  26.             if self.valider_limite(coordonnes):
  27.                 coordonnes[1] -= 2*deplace
  28.         elif direction == 2:
  29.             coordonnes[1] -= deplace
  30.             if self.valider_limite(coordonnes):
  31.                 coordonnes[1] += 2*deplace
  32.         elif direction == 3:
  33.             coordonnes[0] -= deplace
  34.             if self.valider_limite(coordonnes):
  35.                 coordonnes[0] += 2*deplace
  36.         else:
  37.             coordonnes[0] += deplace
  38.             if self.valider_limite(coordonnes):
  39.                 coordonnes[0] -= 2*deplace
  40.         return coordonnes   # 这里返回新的移动后的坐标
  41.             
  42.    
  43.         
  44. class Turtle(Main):
  45.     PV = 100                                            # PV 是乌龟的体力属性
  46.     coordonnes = [r.randint(0, 10),r.randint(0, 10)]    # coordonnes是乌龟初始随机生成的坐标

  47.     # 第一个方法是返回随机的移动步数1或0,获取的数值将传入Main类中的过去新坐标的方法作为参数
  48.     def getdeplace(self):
  49.         return r.randint(1, 2)

  50.     # 调用父类的方法获得新的坐标
  51.     def deplace_action(self):
  52.         self.coordonnes = self.direction_principe(self.getdirection(),  # 父类的第一个方法用于获取随机方向
  53.                                                  self.coordonnes,       # 乌龟现在的坐标
  54.                                                  self.getdeplace())     # 乌龟本回合随机前进的步数
  55.         self.PV -= 1 # 获取新坐标后体力-1

  56.     # 就是吃的方法
  57.     def manger(self):
  58.         self.PV += 20       # 吃一条鱼加20点PV
  59.         if self.PV > 100:   # 判断体力是否大于上限
  60.             self.PV = 100

  61. class Fish(Main):
  62.     deplace = 1                                         # 鱼的移动步数永远是1
  63.     coordonnes = [r.randint(0, 10),r.randint(0, 10)]    # 生成鱼的初始坐标 coordonnes

  64.     def deplace_action(self):
  65.         self.coordonnes = self.direction_principe(self.getdirection(),  # 父类的第一个方法用于获取随机方向
  66.                                                   self.coordonnes,      # 鱼儿现在的坐标
  67.                                                   self.deplace)         # 鱼儿本回合前进的步数1


  68. # 此函数用于初始化十条实例化的鱼儿到一个列表
  69. def pret():
  70.     fish = list()
  71.     for it in range(10):
  72.         new_fish = Fish()
  73.         fish.append(new_fish)
  74.     return fish

  75. def jeu_principe(): # 相当于就是主函数咯
  76.     turtle = Turtle()
  77.     fish = pret()
  78.     count = 0 # 这个是我为了测试家的计算回合数的变量

  79.     while 1:
  80.         if turtle.PV == 0:
  81.             print('乌龟眼前一黑。。。\n共经过了%d个回合' % count)
  82.             break
  83.         if len(fish) == 0:
  84.             print('鱼儿全部被吃掉了。。。\n共经过了%d个回合' % count)
  85.             break
  86.         
  87.         count += 1 # 这个是我为了测试家的计算回合数的变量
  88.         
  89.         if count % 10 == 0 or count == 1: # 第一回合执行,以后每隔十回合执行一次
  90.             print('现在是第%d回合' % count)
  91.             print('乌龟体力还剩下%dPV' % turtle.PV)
  92.             print('鱼儿还剩下%d条' % len(fish))

  93.         pos = turtle.deplace_action()    # 乌龟先获得新坐标
  94.         for each_one in fish:       # 这一步让每一只鱼儿都获得新的坐标
  95.             each_one.deplace_action()

  96.         for each_fish in fish[:]: ### [:]是我看了小甲鱼参考代码后改对的,之前一直报错
  97.             # 这里就是判断乌龟的坐标和鱼儿的坐标是否重合
  98.             if turtle.coordonnes == each_fish.coordonnes:
  99.                 turtle.manger()
  100.                 # 以下两条是我测试用的,事实证明我如果不这样就发现不了这个问题。。。
  101.                 print('*'*50)
  102.                 print('乌龟吃了一条鱼啦!')
  103.                 fish.remove(each_fish) # 乌龟回春后将鱼儿从列表中删除
  104.         
  105.    

  106. if __name__ == '__main__':
  107.     jeu_principe()
复制代码


我检查了一下是不是deplace_action()函数出问题了,但是也没有啊,一切正常啊?

另外不要吐槽我的变量名,真的已经尽全力了。。。
最佳答案
2016-2-10 22:17:16
你说的对,是我搞晕了
我直接改了你的代码,加了print,手机发的,你对照一下吧,看来我也没弄清楚错误在哪
  1. import random as r


  2. class Main:
  3.     # 这里是我是希望通过1、2、3、4分别代表上下左右四个方向
  4.     def getdirection(self):
  5.         return r.randint(1,4)

  6.     # 这里只是通过一个简单的函数确认 coordonnes 坐标的横纵坐标有没有超出范围
  7.     #                           coordonnes 会在后面定义为一个元组代表坐标
  8.     def valider_limite(self, coordonnes):
  9.         for it in coordonnes:
  10.             if it < 0 or it > 11:
  11.                 return 1
  12.         return 0
  13.    
  14.     def direction_principe(self, direction, coordonnes, deplace):   # direction是传入由本类第一个方法返回的1-4中的一个数字
  15.                                                                     # coordoones是传入坐标的参数 list类(方便更改)
  16.                                                                     # deplace是由后来的两个子类中的方法获得的可以行动的步数1或2
  17.         # 分别对应如下
  18.         #           1:  y坐标+1
  19.         #           2:  y坐标-1
  20.         #           3:  x坐标+1
  21.         #           4:  x坐标-1
  22.         #   注:横纵坐标分别是变量 coordonnes 的 [0] 和 [1]
  23.         if direction == 1:
  24.             coordonnes[1] += deplace
  25.             # 一下这里是判断变化后的坐标有没有超出范围,如果超出将会以取两倍相反数的形式将坐标更换为正确的形式   
  26.             if self.valider_limite(coordonnes):
  27.                 coordonnes[1] -= 2*deplace
  28.         elif direction == 2:
  29.             coordonnes[1] -= deplace
  30.             if self.valider_limite(coordonnes):
  31.                 coordonnes[1] += 2*deplace
  32.         elif direction == 3:
  33.             coordonnes[0] -= deplace
  34.             if self.valider_limite(coordonnes):
  35.                 coordonnes[0] += 2*deplace
  36.         else:
  37.             coordonnes[0] += deplace
  38.             if self.valider_limite(coordonnes):
  39.                 coordonnes[0] -= 2*deplace
  40.         return coordonnes   # 这里返回新的移动后的坐标
  41.             
  42.    
  43.         
  44. class Turtle(Main):
  45.     PV = 100                                            # PV 是乌龟的体力属性
  46.     coordonnes = [r.randint(0, 10),r.randint(0, 10)]    # coordonnes是乌龟初始随机生成的坐标

  47.     # 第一个方法是返回随机的移动步数1或0,获取的数值将传入Main类中的过去新坐标的方法作为参数
  48.     def getdeplace(self):
  49.         return r.randint(1, 2)

  50.     # 调用父类的方法获得新的坐标
  51.     def deplace_action(self):
  52.         self.coordonnes = self.direction_principe(self.getdirection(),  # 父类的第一个方法用于获取随机方向
  53.                                                  self.coordonnes,       # 乌龟现在的坐标
  54.                                                  self.getdeplace())     # 乌龟本回合随机前进的步数
  55.         self.PV -= 1 # 获取新坐标后体力-1

  56.     # 就是吃的方法
  57.     def manger(self):
  58.         self.PV += 20       # 吃一条鱼加20点PV
  59.         if self.PV > 100:   # 判断体力是否大于上限
  60.             self.PV = 100

  61. class Fish(Main):
  62.     def __init__(self):
  63.         self.deplace = 1                                         # 鱼的移动步数永远是1
  64.         self.coordonnes = [r.randint(0, 10),r.randint(0, 10)]    # 生成鱼的初始坐标 coordonnes
  65.     def deplace_action(self):
  66.         self.coordonnes = self.direction_principe(self.getdirection(),  # 父类的第一个方法用于获取随机方向
  67.                                                   self.coordonnes,      # 鱼儿现在的坐标
  68.                                                   self.deplace)         # 鱼儿本回合前进的步数1


  69. # 此函数用于初始化十条实例化的鱼儿到一个列表
  70. def pret():
  71.     fish = list()
  72.     for it in range(10):
  73.         new_fish = Fish()
  74.         fish.append(new_fish)
  75.     return fish

  76. def jeu_principe(): # 相当于就是主函数咯
  77.     turtle = Turtle()
  78.     fish = pret()
  79.     count = 0 # 这个是我为了测试家的计算回合数的变量

  80.     while 1:

  81.         if turtle.PV == 0:
  82.             print('乌龟眼前一黑。。。\n共经过了%d个回合' % count)
  83.             break
  84.         if len(fish) == 0:
  85.             print('鱼儿全部被吃掉了。。。\n共经过了%d个回合' % count)
  86.             break
  87.         
  88.         count += 1 # 这个是我为了测试家的计算回合数的变量
  89.         
  90.         if count % 10 == 0 or count == 1: # 第一回合执行,以后每隔十回合执行一次
  91.             print('现在是第%d回合' % count)
  92.             print('乌龟体力还剩下%dPV' % turtle.PV)
  93.             print('鱼儿还剩下%d条' % len(fish))

  94.         pos = turtle.deplace_action()    # 乌龟先获得新坐标
  95.         for each_one in fish:       # 这一步让每一只鱼儿都获得新的坐标
  96.             print('###',each_one.coordonnes,'###')
  97.             each_one.deplace_action()
  98.         print(turtle.coordonnes)
  99.         for each_fish in fish[:]: ### [:]是我看了小甲鱼参考代码后改对的,之前一直报错
  100.             # 这里就是判断乌龟的坐标和鱼儿的坐标是否重合
  101.             if turtle.coordonnes == each_fish.coordonnes:
  102.                 turtle.manger()
  103.                 fish.remove(each_fish)
  104.                 # 以下两条是我测试用的,事实证明我如果不这样就发现不了这个问题。。。
  105.                 print('*'*50)

  106. if __name__ == '__main__':
  107.     jeu_principe()
  108.             
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2016-2-5 10:05:26 From FishC Mobile | 显示全部楼层
函数嵌套这么多都不带注释,实在看不下去啊。。print了一下,每回合生成的都是同一个位置的。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-5 11:21:19 | 显示全部楼层
把注释添加一下吧,每个函数都是干什么用的,
以及coordonnes  PV  deplace等一些奇怪的变量名也都注释一下吧,
我把你的程序调试了一下也没看明白意思是怎么回事。。。
(以后写程序一定要养成良好的注释习惯 以及 变量名命名最好用英文单词或词组来命名,这样别人看起来也轻松)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-6 05:18:20 | 显示全部楼层
Lnan95 发表于 2016-2-5 10:05
函数嵌套这么多都不带注释,实在看不下去啊。。print了一下,每回合生成的都是同一个位置的。

不好意思。。。新手,新手。。。而且还不懂英文。。。所以不知道英文怎么说的都用的是法语命名。。。我再改一改注释以下在通知你吧!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-6 05:19:05 | 显示全部楼层
shuofxz 发表于 2016-2-5 11:21
把注释添加一下吧,每个函数都是干什么用的,
以及coordonnes  PV  deplace等一些奇怪的变量名也都注释一 ...

不好意思。。。新手,新手。。。而且还不懂英文。。。所以不知道英文怎么说的都用的是法语命名。。。我再改一改注释以下在通知你吧!

coordonnes 是坐标。。。
PV是体力
deplace是移动
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-7 00:06:30 | 显示全部楼层
Lnan95 发表于 2016-2-5 10:05
函数嵌套这么多都不带注释,实在看不下去啊。。print了一下,每回合生成的都是同一个位置的。

你好,我已经添加好注释了,不打扰的话还烦请来帮忙找一下错误原因~谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-7 00:07:03 | 显示全部楼层
shuofxz 发表于 2016-2-5 11:21
把注释添加一下吧,每个函数都是干什么用的,
以及coordonnes  PV  deplace等一些奇怪的变量名也都注释一 ...

你好,我已经添加好注释了,不打扰的话还烦请来帮忙找一下错误原因~谢谢啦!
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-7 10:13:55 | 显示全部楼层
加了注释就好多了
仔细研究了一下目前发现一个问题
搜狗截图16年02月07日1011_1.png
在这里无论是否超出边界都会返回0
当超出边界的时候会有2个返回值,这可能就是你出错的地方

还有下面这段代码没看明白,为什么要这样写?
  1. if __name__ == '__main__':
  2.     jeu_principe()
复制代码

你要想调用主函数直接写
  1. jeu_principe()
复制代码

为什么要加if判断?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-7 16:03:41 | 显示全部楼层
shuofxz 发表于 2016-2-7 10:13
加了注释就好多了
仔细研究了一下目前发现一个问题

不会吧,定义函数的时候如果解释器解释到return语句就不会再继续往下看函数了,整个函数就算是结束了啊


另外最后一个if是为了避免import我写的这个模块时出现输出的情况,import函数是__name__不会等于'__main__',只有在直接执行这段脚本时才会执行。这个应该后面的课程会讲到,我是因为一些意外才知道这点的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-8 16:50:18 | 显示全部楼层
漆雕古代 发表于 2016-2-7 16:03
不会吧,定义函数的时候如果解释器解释到return语句就不会再继续往下看函数了,整个函数就算是结束了啊
...

好吧,第一次知道可以这么写

又调试了很长时间,发现了几个问题
第一:
边界条件判断有问题   if it<0 or  it >11
这样的话坐标就会出现0和11

第二:
鱼类和龟类移动的方法都没有返回值,判断的时候可能会出问题
我把判断位置是否重合那块改成这样,就不会有你说的那个问题了
  1. pos = turtle.deplace_action()
  2.         for each_fish in fish[:]:
  3.             if each_fish.deplace_action() == pos:
  4.             # 鱼儿被吃掉了
  5.                 turtle.manger()
  6.                 fish.remove(each_fish)
  7.                 print("有一条鱼儿被吃掉了...")
复制代码


还有一个问题我把每一回合龟和鱼的坐标都打印出来以后发现:有的鱼在一个回合内移动了不止一个单位,我也找不出是哪的问题,你自己在看看吧
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-8 18:15:08 From FishC Mobile | 显示全部楼层
本帖最后由 Lnan95 于 2016-2-8 19:35 编辑

class Fish:
def __init__(self):
        self.deplace = 1                                         # 1
        self.coordonnes = [r.randint(0, 10),r.randint(0, 10)]    #  coordonnes
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-8 18:45:57 | 显示全部楼层
shuofxz 发表于 2016-2-8 16:50
好吧,第一次知道可以这么写

又调试了很长时间,发现了几个问题

不会是返回值的问题吧?毕竟我通过修改实例化对象可以达到一模一样的效果阿?

不过第一个问题的确,这个是我自己的失误哈哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-8 18:48:04 | 显示全部楼层
Lnan95 发表于 2016-2-8 18:15
class Fishcoordonnesка1110
def __init__(self):
        self.deplace = 1                        ...

我有点每懂,直接设置属性然后通过self.属性名修改和这样在init里初始化有什么区别吗?

可以详细解释一下吗?谢谢拉~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-8 19:31:11 | 显示全部楼层
不是init的问题,是类内变量的域的问题,你可以看看这篇文章的3。http://bbs.fishc.com/thread-66308-1-1.html
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-10 03:36:53 | 显示全部楼层
Lnan95 发表于 2016-2-8 19:31
不是init的问题,是类内变量的域的问题,你可以看看这篇文章的3。http://bbs.fishc.com/thread-66308-1-1.h ...

里面就是重复一遍视频里的内容啊,没有提到这个问题啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-10 03:39:54 | 显示全部楼层
Lnan95 发表于 2016-2-8 19:31
不是init的问题,是类内变量的域的问题,你可以看看这篇文章的3。http://bbs.fishc.com/thread-66308-1-1.h ...

但是我的代码里并没有涉及关于类内的变量域的问题啊?

每一个属性都自己独立变化啊?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-10 11:33:04 From FishC Mobile | 显示全部楼层
漆雕古代 发表于 2016-2-10 03:36
里面就是重复一遍视频里的内容啊,没有提到这个问题啊?

就是 你的题中应该用的是实例的属性,但是你的题用的是类的属性
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2016-2-10 20:14:23 | 显示全部楼层
Lnan95 发表于 2016-2-10 11:33
就是 你的题中应该用的是实例的属性,但是你的题用的是类的属性

不会有区别的吧,我定义类的属性以后实例化对象也获得了他的属性,然后通过各个实例化对象的方法单独修改他们各自的属性,区别应该仅仅在于这里吧?

定义两个类如下:
  1. class AA():
  2.         a = 1
  3.         def am(self,x):
  4.                 self.a = x
  5. class BB():
  6.         def __init__(self):
  7.                 self.a = 1
  8.         def am(self,x):
  9.                 self.a = x
复制代码



然后进行如下操作
  1. print(AA.a)
  2. print(BB.a)
复制代码


会发现BB.a打不出来

应该区别仅仅在这里,一旦将类实例化以后就没有区别了吧,我的代码中并没有直接调用类对象啊,都是把各个类实例化了的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-10 22:17:16 | 显示全部楼层    本楼为最佳答案   
你说的对,是我搞晕了
我直接改了你的代码,加了print,手机发的,你对照一下吧,看来我也没弄清楚错误在哪
  1. import random as r


  2. class Main:
  3.     # 这里是我是希望通过1、2、3、4分别代表上下左右四个方向
  4.     def getdirection(self):
  5.         return r.randint(1,4)

  6.     # 这里只是通过一个简单的函数确认 coordonnes 坐标的横纵坐标有没有超出范围
  7.     #                           coordonnes 会在后面定义为一个元组代表坐标
  8.     def valider_limite(self, coordonnes):
  9.         for it in coordonnes:
  10.             if it < 0 or it > 11:
  11.                 return 1
  12.         return 0
  13.    
  14.     def direction_principe(self, direction, coordonnes, deplace):   # direction是传入由本类第一个方法返回的1-4中的一个数字
  15.                                                                     # coordoones是传入坐标的参数 list类(方便更改)
  16.                                                                     # deplace是由后来的两个子类中的方法获得的可以行动的步数1或2
  17.         # 分别对应如下
  18.         #           1:  y坐标+1
  19.         #           2:  y坐标-1
  20.         #           3:  x坐标+1
  21.         #           4:  x坐标-1
  22.         #   注:横纵坐标分别是变量 coordonnes 的 [0] 和 [1]
  23.         if direction == 1:
  24.             coordonnes[1] += deplace
  25.             # 一下这里是判断变化后的坐标有没有超出范围,如果超出将会以取两倍相反数的形式将坐标更换为正确的形式   
  26.             if self.valider_limite(coordonnes):
  27.                 coordonnes[1] -= 2*deplace
  28.         elif direction == 2:
  29.             coordonnes[1] -= deplace
  30.             if self.valider_limite(coordonnes):
  31.                 coordonnes[1] += 2*deplace
  32.         elif direction == 3:
  33.             coordonnes[0] -= deplace
  34.             if self.valider_limite(coordonnes):
  35.                 coordonnes[0] += 2*deplace
  36.         else:
  37.             coordonnes[0] += deplace
  38.             if self.valider_limite(coordonnes):
  39.                 coordonnes[0] -= 2*deplace
  40.         return coordonnes   # 这里返回新的移动后的坐标
  41.             
  42.    
  43.         
  44. class Turtle(Main):
  45.     PV = 100                                            # PV 是乌龟的体力属性
  46.     coordonnes = [r.randint(0, 10),r.randint(0, 10)]    # coordonnes是乌龟初始随机生成的坐标

  47.     # 第一个方法是返回随机的移动步数1或0,获取的数值将传入Main类中的过去新坐标的方法作为参数
  48.     def getdeplace(self):
  49.         return r.randint(1, 2)

  50.     # 调用父类的方法获得新的坐标
  51.     def deplace_action(self):
  52.         self.coordonnes = self.direction_principe(self.getdirection(),  # 父类的第一个方法用于获取随机方向
  53.                                                  self.coordonnes,       # 乌龟现在的坐标
  54.                                                  self.getdeplace())     # 乌龟本回合随机前进的步数
  55.         self.PV -= 1 # 获取新坐标后体力-1

  56.     # 就是吃的方法
  57.     def manger(self):
  58.         self.PV += 20       # 吃一条鱼加20点PV
  59.         if self.PV > 100:   # 判断体力是否大于上限
  60.             self.PV = 100

  61. class Fish(Main):
  62.     def __init__(self):
  63.         self.deplace = 1                                         # 鱼的移动步数永远是1
  64.         self.coordonnes = [r.randint(0, 10),r.randint(0, 10)]    # 生成鱼的初始坐标 coordonnes
  65.     def deplace_action(self):
  66.         self.coordonnes = self.direction_principe(self.getdirection(),  # 父类的第一个方法用于获取随机方向
  67.                                                   self.coordonnes,      # 鱼儿现在的坐标
  68.                                                   self.deplace)         # 鱼儿本回合前进的步数1


  69. # 此函数用于初始化十条实例化的鱼儿到一个列表
  70. def pret():
  71.     fish = list()
  72.     for it in range(10):
  73.         new_fish = Fish()
  74.         fish.append(new_fish)
  75.     return fish

  76. def jeu_principe(): # 相当于就是主函数咯
  77.     turtle = Turtle()
  78.     fish = pret()
  79.     count = 0 # 这个是我为了测试家的计算回合数的变量

  80.     while 1:

  81.         if turtle.PV == 0:
  82.             print('乌龟眼前一黑。。。\n共经过了%d个回合' % count)
  83.             break
  84.         if len(fish) == 0:
  85.             print('鱼儿全部被吃掉了。。。\n共经过了%d个回合' % count)
  86.             break
  87.         
  88.         count += 1 # 这个是我为了测试家的计算回合数的变量
  89.         
  90.         if count % 10 == 0 or count == 1: # 第一回合执行,以后每隔十回合执行一次
  91.             print('现在是第%d回合' % count)
  92.             print('乌龟体力还剩下%dPV' % turtle.PV)
  93.             print('鱼儿还剩下%d条' % len(fish))

  94.         pos = turtle.deplace_action()    # 乌龟先获得新坐标
  95.         for each_one in fish:       # 这一步让每一只鱼儿都获得新的坐标
  96.             print('###',each_one.coordonnes,'###')
  97.             each_one.deplace_action()
  98.         print(turtle.coordonnes)
  99.         for each_fish in fish[:]: ### [:]是我看了小甲鱼参考代码后改对的,之前一直报错
  100.             # 这里就是判断乌龟的坐标和鱼儿的坐标是否重合
  101.             if turtle.coordonnes == each_fish.coordonnes:
  102.                 turtle.manger()
  103.                 fish.remove(each_fish)
  104.                 # 以下两条是我测试用的,事实证明我如果不这样就发现不了这个问题。。。
  105.                 print('*'*50)

  106. if __name__ == '__main__':
  107.     jeu_principe()
  108.             
复制代码
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2016-2-12 15:57:06 From FishC Mobile | 显示全部楼层
好强大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-4-27 06:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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