鱼C论坛

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

[已解决]python 37讲乌龟吃鱼,鱼被吃掉的时候坐标和乌龟不一样?

[复制链接]
发表于 2021-8-25 17:27:26 | 显示全部楼层 |阅读模式
20鱼币
本帖最后由 油腻中年人 于 2021-8-25 17:30 编辑

import random as r

zone_x = [0,10]
zone_y = [0,10]

class Turtle:

    def __init__(self):
        self.pow = 100
        # 初始化乌龟的起点坐标
        self.x = r.randint(1,10)
        self.y = r.randint(1,10)

    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 > zone_x[1]:
            self.x = zone_x[1] - (new_x - zone_x[1])
        elif new_x < zone_x[0]:
            self.x = zone_x[0] - (new_x - zone_x[0])
        else:
            self.x = new_x

        if new_y > zone_y[1]:
            self.y = zone_y[1] - (new_y - zone_y[1])
        elif new_y < zone_y[0]:
            self.y = zone_y[0] - (new_y - zone_y[0])
        else:
            self.y = new_y

        # 消耗体力
        self.pow -= 1
        
        # 返回移动后的位置
        return (self.x,self.y)

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

class Fish:

    def __init__(self):
        
        # 初始化起点坐标
        self.x = r.randint(1,10)
        self.y = r.randint(1,10)

    def move(self):
        # 随机移动方向
        new_x = self.x + r.choice([-1,1])
        new_y = self.y + r.choice([-1,1])

        # 判断是否超过边界
        if new_x > zone_x[1]:
            self.x = zone_x[1] - (new_x - zone_x[1])
        elif new_x < zone_x[0]:
            self.x = zone_x[0] - (new_x - zone_x[0])
        else:
            self.x = new_x

        if new_y > zone_y[1]:
            self.y = zone_y[1] - (new_y - zone_y[1])
        elif new_y < zone_y[0]:
            self.y = zone_y[0] - (new_y - zone_y[0])
        else:
            self.y = new_y

        return (self.x,self.y)

turtle = Turtle()
fish = []

for i in range(0,10):
    new_fish = Fish()
    fish.append(new_fish)

while True:
    pos = turtle.move()
    for each_fish in fish:
        if each_fish.move() == pos:
            
            # 鱼儿被吃掉了
            turtle.eat()
            # 打印吃掉的位置
            print(each_fish.move(),pos)
            fish.remove(each_fish)
            print('有一条鱼儿被吃掉了...')

        
    if len(fish) == 0:
        print('鱼被吃光啦,乌龟还有%d体力,游戏结束。'%turtle.pow)
        break
    if turtle.pow == 0:
        print('还有%d条鱼没吃到乌龟就饿死了,游戏结束。'%len(fish))
        break
   

打印吃掉的位置发现鱼和乌龟的坐标位置不一样,这是为什么?
(4, 9) (3, 10)
有一条鱼儿被吃掉了...
(2, 8) (1, 9)
有一条鱼儿被吃掉了...
(0, 1) (1, 0)
有一条鱼儿被吃掉了...
(5, 6) (4, 7)
有一条鱼儿被吃掉了...
(9, 3) (8, 4)
有一条鱼儿被吃掉了...
(8, 2) (7, 1)
有一条鱼儿被吃掉了...
(7, 4) (8, 3)
有一条鱼儿被吃掉了...
还有3条鱼没吃到乌龟就饿死了,游戏结束。   
最佳答案
2021-8-25 17:27:27
所以你应该和pos = turtle.move()一样也先给pos_fish = each_fish.move()这样子赋值,再进行比较和打印就解决了问题

最佳答案

查看完整内容

所以你应该和pos = turtle.move()一样也先给pos_fish = each_fish.move()这样子赋值,再进行比较和打印就解决了问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-25 17:27:27 | 显示全部楼层    本楼为最佳答案   
所以你应该和pos = turtle.move()一样也先给pos_fish = each_fish.move()这样子赋值,再进行比较和打印就解决了问题
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-8-25 19:12:43 | 显示全部楼层
# 打印吃掉的位置
            print(each_fish.move(),pos)
            fish.remove(each_fish)
            print('有一条鱼儿被吃掉了...')
因为你代码这个地方使用print的时候又调用了一次each_fish.move()函数,鱼的位置先改变,然后才被打印出来,所以和乌龟的位置总差1
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-19 16:02

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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