Python对面对象题 乌龟吃鱼的游戏

游戏编程:按以下要求完成一个乌龟吃鱼的游戏 

假设游戏场景为范围(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,轻松实现该功能

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值