游戏编程:按以下要求完成一个乌龟吃鱼的游戏
假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10
游戏生成1只乌龟和10条鱼
它们的移动方向均随机(上下左右四个方向)
乌龟的最大移动能力是2(它可以随机选择1还是2移动),
鱼儿的最大移动能力是1
当移动到场景边缘,自动向反方向移动
乌龟初始化体力为100(上限)
乌龟每移动一次,体力消耗1
当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
鱼暂不计算体力
当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束。
在游戏过程中和结束时在控制台输出哪些提示信息,由每人各自设计,
比如乌龟在什么坐标吃掉哪一条鱼,当前体力值;
乌龟体力耗尽,吃到几条鱼,逃生的鱼当前坐标;
或者乌龟将鱼全部吃完,吃十条鱼的具体坐标。
import random
range_x = [0, 10] # 横坐标的范围
range_y = [0, 10] # 纵坐标的范围
def move_one_step(x, y):
steps = ['up', 'down', 'left', 'right'] # 移动方向
step = random.choice(steps)
if step == 'up':
if y == range_y[1]:
y = range_y[1]-1
else:
y = y+1
elif step == 'down':
if y == range_y[0]:
y = range_y[0]+1
else:
y = y-1
elif step == 'left':
if x == range_x[0]:
x = range_x[0]+1
else:
x = x-1
elif step == 'right':
if x == range_x[1]:
x = range_x[1]-1
else:
x = x+1
return x, y
class Turtle:
def __init__(self):
self.power = 100 # 初始化乌龟的体力
self.x = random.randint(range_x[0], range_x[1]) # 乌龟所在位置的横坐标
self.y = random.randint(range_y[0], range_y[1]) # 乌龟所在位置的纵坐标
def move(self): # 乌龟移动函数
number = random.randint(1, 2) # 乌龟移动1-2次
for i in range(number):
self.x, self.y = move_one_step(self.x, self.y) # 乌龟移动1次
self.power -= 1 # 乌龟移动后体力值-1
return (self.x, self.y) # 返回移动后的乌龟的位置
def eat(self): # 乌龟吃鱼函数
self.power += 20 # 乌龟吃到鱼以后体力值+20
if self.power > 100: # 体力值最大为100
self.power = 100
class Fish:
def __init__(self):
self.dead = False # 初始化鱼活着
self.x = random.randint(range_x[0], range_x[1])
self.y = random.randint(range_y[0], range_y[1])
def move(self): # 鱼移动函数
self.x, self.y = move_one_step(self.x, self.y) # 鱼移动1次
return (self.x, self.y)
def eated(self): # 鱼被吃函数
self.dead = True
def get_pos(self): # 鱼的位置函数
return (self.x, self.y)
turtle = Turtle() # 创建乌龟类的实体
fish = [] # 该列表存储鱼的信息
for i in range(10): # 在列表中添加10条鱼的信息
new_fish = Fish() # 创建一个鱼类的实体
fish.append(new_fish) # 增加鱼的信息
count = 10
while True: # 该循环只有在乌龟体力值耗尽才会停止
if not count: # 如果count为0,表示已经没有鱼可以吃了,结束循环
print("乌龟将鱼全部吃完,吃十条鱼的具体坐标如下:")
for f in fish:
print(f.get_pos())
break
if not turtle.power: # 乌龟体力耗尽,游戏结束
print("乌龟体力耗尽,吃到{}条鱼,逃生的鱼当前坐标如下:".format(10-count))
for f in fish:
if f.dead:
continue # 鱼死的,跳过
print(f.get_pos())
break
pos = turtle.move() # 返回乌龟移动后的具体位置
for i, f in enumerate(fish): # 遍历fish列表中的所有鱼
if f.dead:
continue # 鱼死的,跳过
if f.move() == pos: # 当乌龟的位置和鱼重合时,执行以下操作
turtle.eat() # 乌龟吃鱼
f.eated() # 鱼被吃
count = count-1
s = '乌龟在{}坐标吃掉第{}条鱼,当前体力值{}'.format(pos, i+1, turtle.power)
print(s)
在编写的过程中遇到的困难点主要有4个:
难点1,消除对随机方向的疑惑,随机方向很简单,本质上是位移,调整x的位移,y的位移,轻松实现方向上的随机
难点2,消除对边界返回的疑惑,用一个简单的if,elif,else条件判断就可以搞定突出下界,突出上界和不突出这三种情况
难点3,消除对10只鱼表示方法的疑惑,第一眼看到10只鱼这个要求,会想怎么去把10只鱼放进去呢,他们之间互不干扰,利用什么才能做到.其实很简单,用列表,用对列表的遍历, 实现对每一只鱼的判断,一个for循环语句搞定,被吃掉了就从列表中remove
难点4,消除对方法调用次数的疑惑,move方法调用一次就动一次,我们需要乌龟和鱼动很多次,发生很多情况,用一个whileTrue,轻松实现该功能