python趣味编程之:乌龟和鱼的游戏

330 阅读3分钟
本题是学习《小甲鱼零基础入门学习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模块,应该有更简单的随机生成方法