鱼C论坛

 找回密码
 立即注册
查看: 1365|回复: 2

[已解决]37讲的最后一题~有个地方求解答~

[复制链接]
发表于 2020-10-6 15:59:04 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 uranometria 于 2020-10-6 16:03 编辑

# 1. 游戏编程:按以下要求定义一个乌龟类和鱼类并尝试编写游戏。(初学者不一定可以完整实现,但请务必先自己动手,你会从中学习到很多知识的^_^)
# 假设游戏场景为范围(x, y)为0<=x<=10,0<=y<=10
# 游戏生成1只乌龟和10条鱼
# 它们的移动方向均随机
# 乌龟的最大移动能力是2(Ta可以随机选择1还是2移动),鱼儿的最大移动能力是1
# 当移动到场景边缘,自动向反方向移动
# 乌龟初始化体力为100(上限)
# 乌龟每移动一次,体力消耗1
# 当乌龟和鱼坐标重叠,乌龟吃掉鱼,乌龟体力增加20
# 鱼暂不计算体力
# 当乌龟体力值为0(挂掉)或者鱼儿的数量为0游戏结束
#
import random

class Fish:
    # x_i = random.randint(0, 10)
    # y_i = random.randint(0, 10)
    # x = random.randint(-1, 1)
    # y = random.randint(-1, 1)
    #  与下面 def __init__(self): 内容一样

    def __init__(self):
        self.x_i = random.randint(0, 10)
        self.y_i = random.randint(0, 10)

    def fish_move(self):
        self.x = random.randint(-1, 1)
        self.y = random.randint(-1, 1)
        if 1 < self.x_i - self.x < 9:
            self.x_i -= self.x
        else:
            if self.x_i - self.x <= 1:
                self.x_i += abs(self.x)
            elif self.x_i + self.x >= 9:
                self.x_i -= abs(self.x)

        if 1 < self.y_i - self.y < 9:
            self.y_i -= self.y
        else:
            if self.y_i - self.y <= 1:
                self.y_i += abs(self.y)
            elif self.y_i + self.y >= 9:
                self.y_i -= abs(self.y)

        return self.x_i, self.y_i

class Turtle(Fish):
    def __init__(self):
        super().__init__()
        self.mp = 100

    def turtle_move(self):
        self.x = random.randint(-2, 2)
        self.y = random.randint(-2, 2)

        if 2 < self.x_i - self.x < 8:
            self.x_i -= self.x
        elif self.x_i - self.x <= 2:
            self.x_i += abs(self.x)
        elif self.x_i + self.x >= 8:
            self.x_i -= abs(self.x)

        if 2 < self.y_i - self.y < 8:
            self.y_i -= self.y
        elif self.y_i - self.y <= 2:
            self.y_i += abs(self.y)
        elif self.y_i + self.y >= 8:
            self.y_i -= abs(self.y)

        self.mp -= 1

        return self.x_i, self.y_i

    def eat(self):
        self.mp += 20
        if self.mp > 100:
            self.mp = 100

list_fish = []
for i in range(10):
    f = Fish()
    list_fish.append(f)
# print(list_fish)
t = Turtle()

while True:
    if t.mp == 0:
        print('体力耗尽,乌龟挂掉')
        # print(t.mp)
        break
    elif len(list_fish) == 0:
        print('游戏结束')
        break
    print(t.mp)
    pos = t.turtle_move()
    for a in list_fish:
        # if a.fish_move() == t.turtle_move():  # 乌龟一直在动
        if a.fish_move() == pos:  # 乌龟位置固定
            # print('!!!乌龟坐标:%s;鱼的坐标:%s' % (str(t.turtle_move()), str(a.fish_move())))  # 只要加上这句,体力的消耗就会增加1,但是用小甲鱼的答案加上坐标提示的情况下,不会影响体力消耗,这是为什么呢?因为调用了类的方法吗?
            list_fish.remove(a)
            print('好吃好吃!现在还剩下%d条鱼~' % len(list_fish))
            t.eat()
            # print(t.mp)
            # if t.mp <= 0:
            #     print('die')
            #     print(t.mp)
            #     break
最佳答案
2020-10-6 22:05:09
因为你又调用了一次move函数,乌龟移动了一次,自然体力就降了。要打印的话就像你上面写的 pos = t.turtle_move(),在比较鱼的坐标和乌龟的坐标前 加个pos1 =a.fish_move(),比较pos和pos1,然后打印pos和pos1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-10-6 22:05:09 | 显示全部楼层    本楼为最佳答案   
因为你又调用了一次move函数,乌龟移动了一次,自然体力就降了。要打印的话就像你上面写的 pos = t.turtle_move(),在比较鱼的坐标和乌龟的坐标前 加个pos1 =a.fish_move(),比较pos和pos1,然后打印pos和pos1
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-10-9 12:10:06 From FishC Mobile | 显示全部楼层
kylin121380 发表于 2020-10-6 22:05
因为你又调用了一次move函数,乌龟移动了一次,自然体力就降了。要打印的话就像你上面写的 pos = t.turtle_ ...

好的哇!我先试试看
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-5-4 04:19

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表