|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 漆雕古代 于 2016-2-7 00:19 编辑
首先祝各位鱼友新年快乐~(我今年是回不了家乡过年了。。。 )
在新的一年里更加一步一个脚印的往前走~
我们都还在自己的路上挣扎哈哈哈
37课课后作业动动手1
题目就不再赘述了。
我自己写完了以后运行没问题,但是多重复运行几次以后我就觉得很不对劲了
不管怎么随机移动,鱼儿似乎总是在同一个回合内突然一下全部死光光的?
而且乌龟如果是耗尽体力那就绝对是一条鱼也吃不到的死掉的。。。
自己检查了好久,感觉逻辑上并没有出现什么差错啊?
代码附上
不好意思,之前半夜三更有点困没有加上注释(有时差。。。)
- import random as r
- class Main:
- # 这里是我是希望通过1、2、3、4分别代表上下左右四个方向
- def getdirection(self):
- return r.randint(1,4)
- # 这里只是通过一个简单的函数确认 coordonnes 坐标的横纵坐标有没有超出范围
- # coordonnes 会在后面定义为一个元组代表坐标
- def valider_limite(self, coordonnes):
- for it in coordonnes:
- if it < 0 or it > 11:
- return 1
- return 0
-
- def direction_principe(self, direction, coordonnes, deplace): # direction是传入由本类第一个方法返回的1-4中的一个数字
- # coordoones是传入坐标的参数 list类(方便更改)
- # deplace是由后来的两个子类中的方法获得的可以行动的步数1或2
- # 分别对应如下
- # 1: y坐标+1
- # 2: y坐标-1
- # 3: x坐标+1
- # 4: x坐标-1
- # 注:横纵坐标分别是变量 coordonnes 的 [0] 和 [1]
- if direction == 1:
- coordonnes[1] += deplace
- # 一下这里是判断变化后的坐标有没有超出范围,如果超出将会以取两倍相反数的形式将坐标更换为正确的形式
- if self.valider_limite(coordonnes):
- coordonnes[1] -= 2*deplace
- elif direction == 2:
- coordonnes[1] -= deplace
- if self.valider_limite(coordonnes):
- coordonnes[1] += 2*deplace
- elif direction == 3:
- coordonnes[0] -= deplace
- if self.valider_limite(coordonnes):
- coordonnes[0] += 2*deplace
- else:
- coordonnes[0] += deplace
- if self.valider_limite(coordonnes):
- coordonnes[0] -= 2*deplace
- return coordonnes # 这里返回新的移动后的坐标
-
-
-
- class Turtle(Main):
- PV = 100 # PV 是乌龟的体力属性
- coordonnes = [r.randint(0, 10),r.randint(0, 10)] # coordonnes是乌龟初始随机生成的坐标
- # 第一个方法是返回随机的移动步数1或0,获取的数值将传入Main类中的过去新坐标的方法作为参数
- def getdeplace(self):
- return r.randint(1, 2)
- # 调用父类的方法获得新的坐标
- def deplace_action(self):
- self.coordonnes = self.direction_principe(self.getdirection(), # 父类的第一个方法用于获取随机方向
- self.coordonnes, # 乌龟现在的坐标
- self.getdeplace()) # 乌龟本回合随机前进的步数
- self.PV -= 1 # 获取新坐标后体力-1
- # 就是吃的方法
- def manger(self):
- self.PV += 20 # 吃一条鱼加20点PV
- if self.PV > 100: # 判断体力是否大于上限
- self.PV = 100
- class Fish(Main):
- deplace = 1 # 鱼的移动步数永远是1
- coordonnes = [r.randint(0, 10),r.randint(0, 10)] # 生成鱼的初始坐标 coordonnes
- def deplace_action(self):
- self.coordonnes = self.direction_principe(self.getdirection(), # 父类的第一个方法用于获取随机方向
- self.coordonnes, # 鱼儿现在的坐标
- self.deplace) # 鱼儿本回合前进的步数1
- # 此函数用于初始化十条实例化的鱼儿到一个列表
- def pret():
- fish = list()
- for it in range(10):
- new_fish = Fish()
- fish.append(new_fish)
- return fish
- def jeu_principe(): # 相当于就是主函数咯
- turtle = Turtle()
- fish = pret()
- count = 0 # 这个是我为了测试家的计算回合数的变量
- while 1:
- if turtle.PV == 0:
- print('乌龟眼前一黑。。。\n共经过了%d个回合' % count)
- break
- if len(fish) == 0:
- print('鱼儿全部被吃掉了。。。\n共经过了%d个回合' % count)
- break
-
- count += 1 # 这个是我为了测试家的计算回合数的变量
-
- if count % 10 == 0 or count == 1: # 第一回合执行,以后每隔十回合执行一次
- print('现在是第%d回合' % count)
- print('乌龟体力还剩下%dPV' % turtle.PV)
- print('鱼儿还剩下%d条' % len(fish))
- pos = turtle.deplace_action() # 乌龟先获得新坐标
- for each_one in fish: # 这一步让每一只鱼儿都获得新的坐标
- each_one.deplace_action()
- for each_fish in fish[:]: ### [:]是我看了小甲鱼参考代码后改对的,之前一直报错
- # 这里就是判断乌龟的坐标和鱼儿的坐标是否重合
- if turtle.coordonnes == each_fish.coordonnes:
- turtle.manger()
- # 以下两条是我测试用的,事实证明我如果不这样就发现不了这个问题。。。
- print('*'*50)
- print('乌龟吃了一条鱼啦!')
- fish.remove(each_fish) # 乌龟回春后将鱼儿从列表中删除
-
-
- if __name__ == '__main__':
- jeu_principe()
复制代码
我检查了一下是不是deplace_action()函数出问题了,但是也没有啊,一切正常啊?
另外不要吐槽我的变量名,真的已经尽全力了。。。
你说的对,是我搞晕了
我直接改了你的代码,加了print,手机发的,你对照一下吧,看来我也没弄清楚错误在哪
- import random as r
- class Main:
- # 这里是我是希望通过1、2、3、4分别代表上下左右四个方向
- def getdirection(self):
- return r.randint(1,4)
- # 这里只是通过一个简单的函数确认 coordonnes 坐标的横纵坐标有没有超出范围
- # coordonnes 会在后面定义为一个元组代表坐标
- def valider_limite(self, coordonnes):
- for it in coordonnes:
- if it < 0 or it > 11:
- return 1
- return 0
-
- def direction_principe(self, direction, coordonnes, deplace): # direction是传入由本类第一个方法返回的1-4中的一个数字
- # coordoones是传入坐标的参数 list类(方便更改)
- # deplace是由后来的两个子类中的方法获得的可以行动的步数1或2
- # 分别对应如下
- # 1: y坐标+1
- # 2: y坐标-1
- # 3: x坐标+1
- # 4: x坐标-1
- # 注:横纵坐标分别是变量 coordonnes 的 [0] 和 [1]
- if direction == 1:
- coordonnes[1] += deplace
- # 一下这里是判断变化后的坐标有没有超出范围,如果超出将会以取两倍相反数的形式将坐标更换为正确的形式
- if self.valider_limite(coordonnes):
- coordonnes[1] -= 2*deplace
- elif direction == 2:
- coordonnes[1] -= deplace
- if self.valider_limite(coordonnes):
- coordonnes[1] += 2*deplace
- elif direction == 3:
- coordonnes[0] -= deplace
- if self.valider_limite(coordonnes):
- coordonnes[0] += 2*deplace
- else:
- coordonnes[0] += deplace
- if self.valider_limite(coordonnes):
- coordonnes[0] -= 2*deplace
- return coordonnes # 这里返回新的移动后的坐标
-
-
-
- class Turtle(Main):
- PV = 100 # PV 是乌龟的体力属性
- coordonnes = [r.randint(0, 10),r.randint(0, 10)] # coordonnes是乌龟初始随机生成的坐标
- # 第一个方法是返回随机的移动步数1或0,获取的数值将传入Main类中的过去新坐标的方法作为参数
- def getdeplace(self):
- return r.randint(1, 2)
- # 调用父类的方法获得新的坐标
- def deplace_action(self):
- self.coordonnes = self.direction_principe(self.getdirection(), # 父类的第一个方法用于获取随机方向
- self.coordonnes, # 乌龟现在的坐标
- self.getdeplace()) # 乌龟本回合随机前进的步数
- self.PV -= 1 # 获取新坐标后体力-1
- # 就是吃的方法
- def manger(self):
- self.PV += 20 # 吃一条鱼加20点PV
- if self.PV > 100: # 判断体力是否大于上限
- self.PV = 100
- class Fish(Main):
- def __init__(self):
- self.deplace = 1 # 鱼的移动步数永远是1
- self.coordonnes = [r.randint(0, 10),r.randint(0, 10)] # 生成鱼的初始坐标 coordonnes
- def deplace_action(self):
- self.coordonnes = self.direction_principe(self.getdirection(), # 父类的第一个方法用于获取随机方向
- self.coordonnes, # 鱼儿现在的坐标
- self.deplace) # 鱼儿本回合前进的步数1
- # 此函数用于初始化十条实例化的鱼儿到一个列表
- def pret():
- fish = list()
- for it in range(10):
- new_fish = Fish()
- fish.append(new_fish)
- return fish
- def jeu_principe(): # 相当于就是主函数咯
- turtle = Turtle()
- fish = pret()
- count = 0 # 这个是我为了测试家的计算回合数的变量
- while 1:
- if turtle.PV == 0:
- print('乌龟眼前一黑。。。\n共经过了%d个回合' % count)
- break
- if len(fish) == 0:
- print('鱼儿全部被吃掉了。。。\n共经过了%d个回合' % count)
- break
-
- count += 1 # 这个是我为了测试家的计算回合数的变量
-
- if count % 10 == 0 or count == 1: # 第一回合执行,以后每隔十回合执行一次
- print('现在是第%d回合' % count)
- print('乌龟体力还剩下%dPV' % turtle.PV)
- print('鱼儿还剩下%d条' % len(fish))
- pos = turtle.deplace_action() # 乌龟先获得新坐标
- for each_one in fish: # 这一步让每一只鱼儿都获得新的坐标
- print('###',each_one.coordonnes,'###')
- each_one.deplace_action()
- print(turtle.coordonnes)
- for each_fish in fish[:]: ### [:]是我看了小甲鱼参考代码后改对的,之前一直报错
- # 这里就是判断乌龟的坐标和鱼儿的坐标是否重合
- if turtle.coordonnes == each_fish.coordonnes:
- turtle.manger()
- fish.remove(each_fish)
- # 以下两条是我测试用的,事实证明我如果不这样就发现不了这个问题。。。
- print('*'*50)
- if __name__ == '__main__':
- jeu_principe()
-
复制代码
|
|