鱼C论坛

 找回密码
 立即注册
查看: 2000|回复: 8

[已解决]乌龟和鱼的问题

[复制链接]
发表于 2021-9-12 17:11:53 | 显示全部楼层 |阅读模式

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

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

x
import random as r

class Turtle:
    def __init__(self):
        # 初始体力
        self.power = 100
        # 初始位置随机
        self.x = r.randint(0, 10)
        self.y = r.randint(0, 10)

    def move(self):
        # 随机计算方向并移动到新的位置(x, y)
        new_x = self.x + r.choice([1, 2, -1, -2])
        new_y = self.y + r.choice([1, 2, -1, -2])
        # 检查移动后是否超出场景x轴边界
        if new_x < 0:
            self.x = 0 - new_x
        elif new_x > 10:
            self.x = 10 - (new_x - 10)
        else:
            self.x = new_x
        # 检查移动后是否超出场景y轴边界
        if new_y < 0:
            self.y = 0 - new_y
        elif new_y > 10:
            self.y = 10 - (new_y - 10)
        else:
            self.y = new_y
        # 体力消耗
        self.power -= 1
        # 返回移动后的新位置
        return (self.x, self.y)

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

class Fish:
    def __init__(self):
        self.num=10
        self.x = r.randint(0, 10)
        self.y = r.randint(0, 10)

    def move(self):
        # 随机计算方向并移动到新的位置(x, y)
        new_x = self.x + r.choice([1, -1])
        new_y = self.y + r.choice([1, -1])
        # 检查移动后是否超出场景x轴边界
        if new_x < 0:
            self.x = 0 - new_x
        elif new_x > 10:
            self.x = 10 - (new_x - 10)
        else:
            self.x = new_x
        # 检查移动后是否超出场景y轴边界
        if new_y < 0:
            self.y = 0 - new_y
        elif new_y > 10:
            self.y = 10 - (new_y - 10)
        else:
            self.y = new_y
        # 返回移动后的新位置
        return (self.x, self.y)
turtle = Turtle()
fish=Fish()
while True:
    if not fish.num:
        print('鱼都被吃完了!')
        break
    if not turtle.power:
        print('乌龟体力耗尽,挂了!')
        break
    print("乌龟移动前坐标:", (turtle.x ,turtle.y)) #乌龟移动前   
    turtle.move()
   print("乌龟移动后坐标:", (turtle.x ,turtle.y)) #乌龟移动后
    print("鱼移动前坐标:", (fish.x ,fish.y))
    fish.move()  # 感觉鱼的移动前后的坐标差有问题
    print("鱼移动后坐标:", (fish.x ,fish.y))
    if fish.x==turtle.x and fish.y==turtle.y:
        turtle.eat()
        fish.num-=1

        print("死了一只鱼")
        print("乌龟最新体力值为 %d"%turtle.power)   
红字部分这样改好像和原代码也差不多,大佬们给点指点这样改行吗?我运行一边修改后的代码也没问题
最佳答案
2021-9-16 14:44:31
本帖最后由 傻眼貓咪 于 2021-9-16 14:56 编辑

我的代码(稍作改写代码):
  1. import random
  2. import numpy as np

  3. class Turtle:
  4.     def __init__(self, stamina = 100):
  5.         self.stamina = stamina
  6.         self.x = random.randint(0, 10)
  7.         self.y = random.randint(0, 10)
  8.         self.point = (self.x, self.y)
  9.    
  10.     def move(self):
  11.         while True:
  12.             a = (self.x + random.choice([-2, -1, 1, 2]))%10
  13.             b = (self.y + random.choice([-2, -1, 1, 2]))%10
  14.             if a >= 0 and b >= 0:
  15.                 self.x = a
  16.                 self.y = b
  17.                 break
  18.         self.point = (self.x, self.y)
  19.         self.stamina -= 1


  20. class Fish:
  21.     def __init__(self):
  22.         self.x = random.randint(0, 10)
  23.         self.y = random.randint(0, 10)
  24.         self.point = (self.x, self.y)
  25.    
  26.     def move(self):
  27.         while True:
  28.             a = (self.x + random.choice([-2, -1, 1, 2]))%10
  29.             b = (self.y + random.choice([-2, -1, 1, 2]))%10
  30.             if a >= 0 and b >= 0:
  31.                 self.x = a
  32.                 self.y = b
  33.                 break
  34.         self.point = (self.x, self.y)

  35. class AllFish:
  36.     def __init__(self):
  37.         self.allfish = [Fish() for _ in range(10)]
  38.    
  39.     def position(self):
  40.         return [i.point for i in self.allfish]
  41.    
  42.     def kill(self, point):
  43.         for n, i in enumerate(self.allfish):
  44.             if i.point == point:
  45.                 self.allfish.pop(n)
  46.                 break

  47. def coordinate(A, B):
  48.     res = [[" " for _ in range(10)] for _ in range(10)]
  49.     res[A[0]][A[1]] = "T"
  50.     for i in B:
  51.         x, y = i
  52.         res[y][x] = "F"
  53.     res = np.array(res)
  54.     print(res)

  55. t = Turtle()
  56. f = AllFish()

  57. while True:
  58.     if not f.allfish:
  59.         print("鱼被吃完了,最后乌龟位置:")
  60.         coordinate(t.point, f.position())
  61.         break
  62.     if not t.stamina:
  63.         print(f"乌龟体力耗尽了,鱼剩下 {len(f.allfish)} 只,最后鱼和乌龟位置:")
  64.         coordinate(t.point, f.position())
  65.         break
  66.     t.move()
  67.     for i in f.allfish:
  68.         i.move()
  69.     if t.point in f.position():
  70.         print(f"地标:{t.point} 鱼被乌龟吃了")
  71.         f.kill(t.point)
  72.         t.stamina += 20
  73.         if t.stamina > 100:
  74.             t.stamina = 100
复制代码
  1. 地标:(6, 2) 鱼被乌龟吃了
  2. 地标:(5, 9) 鱼被乌龟吃了
  3. 地标:(4, 1) 鱼被乌龟吃了
  4. 地标:(6, 2) 鱼被乌龟吃了
  5. 地标:(5, 3) 鱼被乌龟吃了
  6. 地标:(2, 2) 鱼被乌龟吃了
  7. 地标:(2, 6) 鱼被乌龟吃了
  8. 地标:(0, 1) 鱼被乌龟吃了
  9. 乌龟体力耗尽了,鱼剩下 2 只,最后鱼和乌龟位置:
  10. [[' ' ' ' 'F' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  11. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  12. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  13. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  14. [' ' ' ' ' ' 'T' ' ' ' ' ' ' ' ' ' ' ' ']
  15. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  16. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  17. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  18. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  19. [' ' ' ' ' ' ' ' ' ' 'F' ' ' ' ' ' ' ' ']]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2021-9-12 20:04:22 | 显示全部楼层
代碼都是你寫的?你好厲害啊
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-13 20:40:47 | 显示全部楼层
傻眼貓咪 发表于 2021-9-12 20:04
代碼都是你寫的?你好厲害啊

红字相比较于原代码有改变,请指点
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 12:46:18 | 显示全部楼层


原代码是加入了十个  Fish 对象,即 加入了十只鱼,每只鱼坐标可以不同

但是你的代码是直接一次性加入了十只捆绑在一起的鱼,只能有一个坐标

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 14:44:31 | 显示全部楼层    本楼为最佳答案   
本帖最后由 傻眼貓咪 于 2021-9-16 14:56 编辑

我的代码(稍作改写代码):
  1. import random
  2. import numpy as np

  3. class Turtle:
  4.     def __init__(self, stamina = 100):
  5.         self.stamina = stamina
  6.         self.x = random.randint(0, 10)
  7.         self.y = random.randint(0, 10)
  8.         self.point = (self.x, self.y)
  9.    
  10.     def move(self):
  11.         while True:
  12.             a = (self.x + random.choice([-2, -1, 1, 2]))%10
  13.             b = (self.y + random.choice([-2, -1, 1, 2]))%10
  14.             if a >= 0 and b >= 0:
  15.                 self.x = a
  16.                 self.y = b
  17.                 break
  18.         self.point = (self.x, self.y)
  19.         self.stamina -= 1


  20. class Fish:
  21.     def __init__(self):
  22.         self.x = random.randint(0, 10)
  23.         self.y = random.randint(0, 10)
  24.         self.point = (self.x, self.y)
  25.    
  26.     def move(self):
  27.         while True:
  28.             a = (self.x + random.choice([-2, -1, 1, 2]))%10
  29.             b = (self.y + random.choice([-2, -1, 1, 2]))%10
  30.             if a >= 0 and b >= 0:
  31.                 self.x = a
  32.                 self.y = b
  33.                 break
  34.         self.point = (self.x, self.y)

  35. class AllFish:
  36.     def __init__(self):
  37.         self.allfish = [Fish() for _ in range(10)]
  38.    
  39.     def position(self):
  40.         return [i.point for i in self.allfish]
  41.    
  42.     def kill(self, point):
  43.         for n, i in enumerate(self.allfish):
  44.             if i.point == point:
  45.                 self.allfish.pop(n)
  46.                 break

  47. def coordinate(A, B):
  48.     res = [[" " for _ in range(10)] for _ in range(10)]
  49.     res[A[0]][A[1]] = "T"
  50.     for i in B:
  51.         x, y = i
  52.         res[y][x] = "F"
  53.     res = np.array(res)
  54.     print(res)

  55. t = Turtle()
  56. f = AllFish()

  57. while True:
  58.     if not f.allfish:
  59.         print("鱼被吃完了,最后乌龟位置:")
  60.         coordinate(t.point, f.position())
  61.         break
  62.     if not t.stamina:
  63.         print(f"乌龟体力耗尽了,鱼剩下 {len(f.allfish)} 只,最后鱼和乌龟位置:")
  64.         coordinate(t.point, f.position())
  65.         break
  66.     t.move()
  67.     for i in f.allfish:
  68.         i.move()
  69.     if t.point in f.position():
  70.         print(f"地标:{t.point} 鱼被乌龟吃了")
  71.         f.kill(t.point)
  72.         t.stamina += 20
  73.         if t.stamina > 100:
  74.             t.stamina = 100
复制代码
  1. 地标:(6, 2) 鱼被乌龟吃了
  2. 地标:(5, 9) 鱼被乌龟吃了
  3. 地标:(4, 1) 鱼被乌龟吃了
  4. 地标:(6, 2) 鱼被乌龟吃了
  5. 地标:(5, 3) 鱼被乌龟吃了
  6. 地标:(2, 2) 鱼被乌龟吃了
  7. 地标:(2, 6) 鱼被乌龟吃了
  8. 地标:(0, 1) 鱼被乌龟吃了
  9. 乌龟体力耗尽了,鱼剩下 2 只,最后鱼和乌龟位置:
  10. [[' ' ' ' 'F' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  11. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  12. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  13. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  14. [' ' ' ' ' ' 'T' ' ' ' ' ' ' ' ' ' ' ' ']
  15. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  16. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  17. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  18. [' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ' ']
  19. [' ' ' ' ' ' ' ' ' ' 'F' ' ' ' ' ' ' ' ']]
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 14:54:06 | 显示全部楼层
Twilight6 发表于 2021-9-16 12:46
原代码是加入了十个  Fish 对象,即 加入了十只鱼,每只鱼坐标可以不同

但是你的代码是直接一次性加 ...

原来如此,懂了
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 14:54:53 | 显示全部楼层
你不也很厉害
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2021-9-16 14:59:37 | 显示全部楼层

谢谢你的夸奖,我还在学习
大家共同学习,哈哈哈哈
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2021-9-16 15:01:15 | 显示全部楼层
傻眼貓咪 发表于 2021-9-16 14:59
谢谢你的夸奖,我还在学习
大家共同学习,哈哈哈哈

想加你好友,但是有权限
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 1 反对 0

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-4-25 14:00

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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