鱼C论坛

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

自制乌龟抓鱼调试时assert意料之外报错

[复制链接]
发表于 2019-3-12 14:56:02 | 显示全部楼层 |阅读模式

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

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

x
本帖最后由 ietar 于 2019-3-12 15:14 编辑

出错代码段如下 源码较长(不到200行 加了一些扩展功能)在1楼可见(附件不让传.py格式文件是出于什么考虑呢)

在判断移动是否出界并补正之后 位置x,y都应该在限制范围内 所以加了assert测试
第一次在判断x时报错AssertionError 于是手写了另一种形式的报错
再次测试时 x处没有跳出报错信息 y处重现了之前x处的AssertionError

头有点晕 怀疑是assert后的表达式有问题 还请大佬们帮看一眼

  1.     class Fish:
  2.         def __init__(self):
  3.             self.x = randint(limitx1,limitx2)
  4.             self.y = randint(limity1,limity2)
  5.         def move(self):
  6.             direction = Dire()
  7.             self.x += direction[0]
  8.             self.y += direction[1]
  9.             #尝试移动
  10.             if self.x > limitx2:
  11.                 self.x = 2*limitx2 - self.x
  12.             if self.x < limitx1:
  13.                 self.x = -self.x - 2*limitx1
  14.             #assert self.x in range(limitx1,limitx2 + 1)#test
  15.             if self.x not in range(limitx1,limitx2 + 1):#test
  16.                 print('x,limitx1,limitx2=({},{},{})'.format(self.x,limitx1,limitx2))#test
  17.                 raise AssertionError#test
  18.             if self.y > limity2:
  19.                 self.y = 2*limity2 - self.y
  20.             if self.y < limity1:
  21.                 self.y = -self.y - 2*limity1
  22.             assert self.y in range(limity1,limity2 + 1)#
  23.             #越界补正
复制代码



assert调试出错信息.png

代码段

代码段



小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2019-3-12 14:56:39 | 显示全部楼层
  1. #2 不过可以重写下昨天那个 乌龟抓鱼
  2. def t_catch_f():
  3.     from random import randint
  4.     #errorinfo =[]
  5.     limitx1,limitx2,limity1,limity2,fishnum,apmax,apreg = 0,10,0,10,10,100,20
  6.     mode = input('快速模式【无需输入】,自定义模式【1】:')
  7.    
  8.    
  9.    
  10.     def Setsize():
  11.         nonlocal limitx1,limitx2,limity1,limity2,fishnum,apmax,apreg
  12.         while 1:
  13.             try:
  14.                 limitx1,limitx2 = int(input('输入池塘横轴尺寸(下界):')),int(input('输入池塘横轴尺寸(上界):'))
  15.                 limity1,limity2 = int(input('输入池塘纵轴尺寸(下界):')),int(input('输入池塘纵轴尺寸(上界):'))
  16.                 pass
  17.             except:
  18.                 print('输入的不是整数,重新输入...')
  19.                 continue
  20.             try:
  21.                 fishnum = int(input('请输入鱼的数量:'))
  22.                 pass
  23.             except:
  24.                 print('鱼群数量输入错误')
  25.                 continue
  26.             try:
  27.                 apmax = int(input('请输入乌龟最大体力:'))
  28.                 pass
  29.             except:
  30.                 print('乌龟最大体力输入错误')
  31.                 continue
  32.             try:
  33.                 apreg = int(input('请输入成功抓鱼恢复体力值:'))
  34.                 pass
  35.             except:
  36.                 print('成功抓鱼恢复体力值输入错误')
  37.                 continue
  38.             break
  39.             
  40.         if limitx1 > limitx2 :
  41.             (limitx1,limitx2) = (limitx2,limitx1)
  42.             print('上下界顺序错误,已将其互换')
  43.         if limity1 > limity2 :
  44.             (limity1,limity2) = (limity2,limity1)
  45.             print('上下界顺序错误,已将其互换')
  46.             
  47.         print('自定义模式参数输入完成')
  48.         #防呆设计zzzzz
  49.         return
  50.    
  51.     if mode =='1':
  52.         Setsize()
  53.         
  54.     assert limitx1 < limitx2#
  55.     assert limity1 < limity2#
  56.     class Turtle:
  57.         def __init__(self):
  58.             self.x = randint(limitx1,limitx2)
  59.             self.y = randint(limity1,limity2)
  60.             self.ap = apmax
  61.         def move(self):
  62.             self.step = randint(1,2)
  63.             direction = Dire()
  64.             self.x += self.step * direction[0]
  65.             self.y += self.step * direction[1]
  66.             #尝试移动
  67.             if self.x > limitx2:
  68.                 self.x = 2*limitx2 - self.x
  69.             if self.x < limitx1:
  70.                 self.x = -self.x - 2*limitx1
  71.             assert self.x in range(limitx1,limitx2 + 1)#
  72.             if self.y > limity2:
  73.                 self.y = 2*limity2 - self.y
  74.             if self.y < limity1:
  75.                 self.y = -self.y - 2*limity1
  76.             assert self.y in range(limity1,limity2 + 1)#
  77.             #越界补正
  78.             self.ap -= 1
  79.         def catch(self):
  80.             self.ap = self.ap + apreg if self.ap <= (apmax-apreg) else apmax

  81.     class Fish:
  82.         def __init__(self):
  83.             self.x = randint(limitx1,limitx2)
  84.             self.y = randint(limity1,limity2)
  85.         def move(self):
  86.             direction = Dire()
  87.             self.x += direction[0]
  88.             self.y += direction[1]
  89.             #尝试移动
  90.             if self.x > limitx2:
  91.                 self.x = 2*limitx2 - self.x
  92.             if self.x < limitx1:
  93.                 self.x = -self.x - 2*limitx1
  94.             #assert self.x in range(limitx1,limitx2 + 1)#test
  95.             if self.x not in range(limitx1,limitx2 + 1):#test
  96.                 print('x,limitx1,limitx2=({},{},{})'.format(self.x,limitx1,limitx2))#test
  97.                 raise AssertionError#test
  98.             if self.y > limity2:
  99.                 self.y = 2*limity2 - self.y
  100.             if self.y < limity1:
  101.                 self.y = -self.y - 2*limity1
  102.             assert self.y in range(limity1,limity2 + 1)#
  103.             #越界补正
  104.             
  105.     def Dire():
  106.         d1=[[-1,0],[1,0],[0,1],[0,-1]]
  107.         return d1[randint(0,3)]
  108.    
  109.     turtle = Turtle()
  110.     fish = []     
  111.     for i in range(0,fishnum):
  112.         afish = Fish()
  113.         fish.append(afish)
  114.     #创建1龟n鱼完成

  115.         
  116.     while 1:
  117.         combo = 0
  118.         try:
  119.             fish[0]
  120.             pass
  121.         except IndexError:
  122.             print('鱼全都抓完了,嗯?!')
  123.             break
  124.         if turtle.ap == 0:
  125.             print('一共抓到【{}/{}】条鱼'.format(fishnum-len(fish),fishnum))
  126.             print('乌龟体力用尽,睡觉去了zzzZZ')
  127.             break
  128.         turtle.move()
  129.         for i in fish[:]:#迭代器中删除列表元素危险 原因尚未了解 用fish[:]或fish.copy()写法
  130.             #乌龟先动 先判定是否被抓 之后鱼再动 被抓事件单写成函数 练习下闭包
  131.             def Caught():
  132.                 nonlocal turtle,fish,combo
  133.                 if (i.x , i.y) == (turtle.x,turtle.y):
  134.                     fish.remove(i)
  135.                     turtle.catch()
  136.                     print('1条倒霉小鱼被抓了T_T')
  137.                     combo += 1
  138.                 return
  139.             Caught()
  140.             i.move()
  141.         #每条鱼都移动完成了
  142.         if combo > 1:
  143.             print('nb啊 一次抓了【{}】条鱼!!'.format(combo))
  144.     #主程序完成        
  145.     a = input('输入【a】再来一局:')
  146.     if a == 'a':
  147.         t_catch_f()
  148.     return
  149. t_catch_f()

复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2019-3-12 15:10:10 | 显示全部楼层
...好了我自己找到问题所在了 下次写公式都得自己测试下
当时写就觉得有点不工整 果然是在这出问题了

这个最佳答案怎么办zzzz
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-10-13 03:07

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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