整个程序按照答案来敲的,我觉得按照自己的水平完全没思路写得出来框架,就当熟悉代码风格来处理吧。
import random as r
legal_x = [0,10] #先定义范围,这里很巧妙,用一个列表2个数字来表示,而不是一个range
legal_y = [0,10]
class Turtle:
def __init__(self):
self.power = 100
self.x=r.randint(legal_x[0],legal_x[1]) #正是因为上面的设置,下面生成初始位置就可以用randint函数来处理,这里是生成self的初始位置x
self.y=r.randint(legal_y[0],legal_y[1]) #生成初始位置y
def move(self):
new_x=self.x+r.choice([1,2,-1,-2]) #移动一步后,新位置是原始位置加上移动距离,距离只有4种可能
new_y=self.y+r.choice([1,2,-1,-2])
if new_x <legal_x[0]: #如果X越出了负界限,则自动反向
self.x=legal_x[0]-(new_x - legal_x[0])
elif new_x>legal_x[1]: #如果X越出了正界限,则自动反向
self.x=legal_x[1]-(new_x - legal_x[1])
else:
self.x=new_x #不越界的情况下,刷新位置,就等于移动后位置
if new_y<legal_y[0]:
self.y=legal_y[0]-(new_y - legal_y[0])
elif new_y>legal_y[1]:
self.y=legal_y[1]-(new_y - legal_y[1])
else:
self.y=new_y
self.power -= 1
return (self.x,self.y)
def eat(self): #定义动作吃,吃了以后体力加20
self.power+=20
if self.power>100: #超过体力上限100了就不变
self.power = 100
class Fish:
def __init__(self):
self.x = r.randint(legal_x[0],legal_y[1]) #这里定义鱼类,初始化位置
self.y = r.randint(legal_y[0],legal_y[1])
def move(self): #和乌龟的属性一样,移动功能
new_x = self.x + r.choice([1,2,-1,-2])
new_y = self.y + r.choice([1,2,-1,-2])
if new_x < legal_x[0]:
self.x = legal_x[0] - (new_x-legal_x[0])
elif new_x > legal_x[1]:
self.x = legal_x[1]-(new_x-legal_x[1])
else:
self.x = new_x
if new_y < legal_y[0]:
self.y = legal_y[0]-(new_y - legal_y[0])
elif new_y > legal_y[1]:
self.y = legal_y[1]-(new_y - legal_y[1])
else:
self.y = new_y
return (self.x,self.y)
turtle = Turtle() #实例化乌龟
fish=[] #将所有的鱼放进一个list
for i in range(10):
new_fish = Fish() #在新建实例的同时,在下一行代码,将实例鱼放进列表
fish.append(new_fish)
while True:
if not len(fish): #len(fish)在有鱼的情况下是true,所以当没鱼的时候,执行下面的while循环,当有鱼或者乌龟有体力的时候,游戏始终循环
print ('no more fishes, game over')
break
if not turtle.power: #如果乌龟体力没了,游戏结束
print ('turtle is dead')
break
pos = turtle.move() #将乌龟实例move函数返回的位置,赋值给pos
for each_fish in fish[:]: #历遍每条鱼,鱼移动后的位置和乌龟的位置有重叠,就执行吃的动作,并移除一条鱼
if each_fish.move() == pos:
turtle.eat()
fish.remove(each_fish)
print ('one fish was ated')