本题是学习《小甲鱼零基础入门学习Python》37课课后题,原题如下:
原题:
编写思路:
1、涉及随机方向、随机前后、随机步数,应写成函数方便乌龟和鱼调用
2、对本作来说,各条鱼之间没有什么区别和特征,每条鱼每回合都要通乌龟位置做判断,可以把它们看成一个鱼群,里面全是一模一样的鱼,差别只有坐标和是不是被吃了。做成鱼群列表,也方便用循环判断Turtle.eat方法。
3、鱼群里被吃掉的鱼应立即退出画面,防止乌龟吃到已经被吃掉的鱼
4、用循环体循环运行每一回合,添加获胜条件以打破循环。
代码如下:
import random as r
def randomzf():
"随机产生±1函数"
randomzf=r.random()*2-1
if randomzf>0:
return 1
else:
return -1
def randomstep():
"随机走1、2步函数"
randomstep=int(r.random()*2+1)
return randomstep
class Turtle:
"乌龟类,传入:乌龟姓名,乌龟初始生命"
def __init__(self,name,rhp):
"初始化函数,现在还不太会用"
self.name=name
self.hp=rhp
#随机生成乌龟出生点
nowxposition=int(r.random()*10)
nowyposition=int(r.random()*10)
def move(self):
"乌龟随机移动方法,移动后传出数组[乌龟x,乌龟y,乌龟HP]"
self.hp-=1
movefx=randomzf()#随机方向
if movefx>0:#X轴移动
self.nowxposition=self.nowxposition+randomzf()*randomstep()
#以下是移动到边缘转向的逻辑
if self.nowxposition>10:
self.nowxposition=20-self.nowxposition
elif self.nowxposition<0:
self.nowxposition=-1*self.nowxposition
else:#Y轴移动
self.nowyposition=self.nowyposition+randomzf()*randomstep()
if self.nowyposition>10:
self.nowyposition=20-self.nowyposition
elif self.nowyposition<0:
self.nowyposition=-1*self.nowyposition
return [self.nowxposition,self.nowyposition,self.hp]
def eat(self,fishmove):
'乌龟吃鱼方法,传入鱼的位置坐标数组,传出吃完之后鱼的位置坐标数组'
for i in range(10):#循环判断乌龟和每条鱼的坐标是否重合,重合的鱼就悲剧了...
if self.nowxposition==fishmove[i][0] and self.nowyposition==fishmove[i][1]:
print("第%s条鱼遭中了!可怜~~"%i)
self.hp+=20
print('hp变为',self.hp)
fishmove[i][2]=0
return fishmove
class Fish:
"鱼类,需要传入鱼群名字"
nowxposition=[]
def __init__(self,name):
self.name=name
for i in range(10):#10条小鱼随机出生在各个位置
self.nowxposition.append([int(r.random()*10),int(r.random()*10),1])#[小鱼x,小鱼y,小鱼是否存活(1:存活,0:被吃了)]
def move(self):
"小鱼随机移动方法,传出移动后小鱼位置的数组"
for i in range(10):
movefx=randomzf()
if self.nowxposition[i][2]==1:#被吃掉的小鱼不会再移动
if movefx>0:
self.nowxposition[i][0]=self.nowxposition[i][0]+randomzf()
if self.nowxposition[i][0]>10:
self.nowxposition[i][0]=9
elif self.nowxposition[i][0]<0:
self.nowxposition[i][0]=1
else:
self.nowxposition[i][1]=self.nowxposition[i][1]+randomzf()
if self.nowxposition[i][1]>10:
self.nowxposition[i][1]=9
elif self.nowxposition[i][1]<0:
self.nowxposition[i][1]=1
else:
self.nowxposition[i]=[-1,-1,0]#被吃掉的小鱼都放在 -1,-1的位置
return self.nowxposition
#所谓的‘主函数’
turtlehp=100
wg1=Turtle("DDD",turtlehp)
f1=Fish("anny")
sum=0
while 1:
f1move=f1.move()[:]#鱼群移动
wg1move=wg1.move()[:]#乌龟移动
print("乌龟当前坐标:%2d,%2d了,HP还剩:%3d"%(wg1move[0],wg1move[1],wg1move[2]))
print('鱼群当前坐标:',f1move)
f1.nowxposition=wg1.eat(f1move)
for i in range(10):#判断小鱼被吃光了没有
sum+=f1move[i][2]
if sum==0:
print("鱼全都被吃光了!乌龟获胜了!")
break
else:
print("还剩%s条鱼"%sum)
sum=0
if wg1.hp==0:#判断乌龟累死了没有
print("乌龟%s体力耗尽!"%wg1.name,"鱼群%s获胜了!"%f1.name)
break运行结果如下:(我发现乌龟吃最后两条鱼太困难了,此游戏乌龟胜率设置的偏低(/:笑哭))
小鱼被吃时
游戏结束时
小甲鱼的答案我还没看,一会学习一下。
编写过程中犯的错误:
1、& 和 and 用混了
2、鉴于Python独特的变量贴标签方法,数组复制应该用list2=list1[:]
3、还没有好好学习random模块,应该有更简单的随机生成方法