目录
前言
用python要求定义一个乌龟类和鱼类并尝试编写游戏。
一、游戏需求概述
假设游戏场景范围为(x, y),0≤x≤10, 0≤y≤10。
(1)游戏生成 1 只乌龟和 10 条鱼;
(2)它们的移动方向均随机;
(3)乌龟的最大移动能力是 2(可以随机移动 1 或 2),鱼的最大移动能力 是 1,移动是沿 x 轴或 y 轴进行;
(4)当移动到场景边界,移动向反方向移动;
(5)乌龟初始化体力为 100;
(6)乌龟每移动一次,体力消耗 1;
(7)当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加 20;
(8)鱼暂不计算体力;
(9)当乌龟体力值为 0 或者鱼儿的数量为 0,游戏结束
二、实现步骤
1.分析
根据上述要求,此游戏有两类对象,分别是乌龟和鱼,它们分别具有的能力 如下。
(1)乌龟:初始化位置(随机),移动(随机 1 或 2,遇到边界向反方向移 动),吃鱼(乌龟坐标和鱼坐标重叠,乌龟吃鱼);
(2)鱼:初始化位置(随机),移动(移动 1,遇到边界向反方向移动)。
以上分析表明,乌龟和鱼类都有“随机初始化位置”和“移动”的方法,为 此抽象出它们的父类 GameAnimal,在父类中定义初始化位置(initLocation)和移 动(move)的方法。此游戏包括三个类,GameAnimal,乌龟(Tortoise)和鱼(Fish)。
在主程序中,定义 1 个乌龟对象和 10 个鱼对象,然后循环执行如下步骤:
(1)获取乌龟的坐标;
(2)判断所有鱼当中是否有鱼的坐标与乌龟的坐标重叠,如果重叠则删除 此鱼对象,乌龟体力增加 20;
(3)若鱼被吃完,退出循环;
(4)若乌龟能量为 0,退出循环。
2.代码实现
代码如下(示例):
from random import *
class GameAnimal:
def initLocation(self,ph=None):
self.x=randint(0,10)
self.y=randint(0,10)
self.ph=ph
def move(self):
if isinstance(self,Fish):
m=list(range(-1,2))
else:
m=list(range(-2,3))
self.ph=self.ph-1
m.remove(0)
step=choice(m)
if randint(0,1):
self.x=abs(self.x+step)
if self.x>10:
self.x=10-self.x%10
else:
self.y=abs(self.y+step)
if self.y>10:
self.y=10-self.y%10
return step
class Tortoise(GameAnimal):
pass
class Fish(GameAnimal):
pass
t=Tortoise()
t.initLocation(100)
print(type(t))
print("创建乌龟 初始位置:({0},{1})".format(t.x,t.y))
fishes={}
for i in range(10):
fishes[i]=Fish()
fishes[i].initLocation()
print("创建弟{0}条鱼, 初始位置:({1},{2})".format(i+1,fishes[i].x,fishes[i].y))
while True:
for i in list(fishes.keys()):
fishes[i].move()
if fishes[i].x==t.x and fishes[i].y==t.y:
t.ph=t.ph+20
print("第{0}条鱼被吃掉,其位置为:({1},{2}),当前乌龟的体力{3}".format(i+1,fishes[i].x,fishes[i].y,t.ph))
del fishes[i]
else:
print("第{0}鱼移动后的位置为:({1},{2})".format(i+1,fishes[i].x,fishes[i].y))
print("当前乌龟的移动步长为{0},移动后的位置为:({1},{2}),当前体力为{3}".format(t.move(),t.x,t.y,t.ph))
print("")
if len(fishes)==0:
print("鱼被吃完了")
if t.ph==0:
print("乌龟没体力了")
break