油腻中年人 发表于 2021-8-25 17:27:26

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

本帖最后由 油腻中年人 于 2021-8-25 17:30 编辑

import random as r

zone_x =
zone_y =

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

      if new_y > zone_y:
            self.y = zone_y - (new_y - zone_y)
      elif new_y < zone_y:
            self.y = zone_y - (new_y - zone_y)
      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:
            self.x = zone_x - (new_x - zone_x)
      elif new_x < zone_x:
            self.x = zone_x - (new_x - zone_x)
      else:
            self.x = new_x

      if new_y > zone_y:
            self.y = zone_y - (new_y - zone_y)
      elif new_y < zone_y:
            self.y = zone_y - (new_y - zone_y)
      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条鱼没吃到乌龟就饿死了,游戏结束。   

tt000 发表于 2021-8-25 17:27:27

所以你应该和pos = turtle.move()一样也先给pos_fish = each_fish.move()这样子赋值,再进行比较和打印就解决了问题

tt000 发表于 2021-8-25 19:12:43

# 打印吃掉的位置
            print(each_fish.move(),pos)
            fish.remove(each_fish)
            print('有一条鱼儿被吃掉了...')
因为你代码这个地方使用print的时候又调用了一次each_fish.move()函数,鱼的位置先改变,然后才被打印出来,所以和乌龟的位置总差1
页: [1]
查看完整版本: python 37讲乌龟吃鱼,鱼被吃掉的时候坐标和乌龟不一样?