鱼C论坛

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

[作品展示] 学了两个月,来上交我的第一份超级超级长的作业

[复制链接]
发表于 2023-6-8 19:32:46 | 显示全部楼层 |阅读模式

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

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

x
给上次作业中的小甲鱼吃小鱼的游戏加了点内容:
给小甲鱼加了一个视野范围,在视野范围里面的小鱼,小甲鱼会加速去抓他;
给小鱼加了一个逃跑的方法,在视野范围里,看到小甲鱼的时候,会向反方向跑;
又加了一点文字互动
但是还没学游戏模块,就先用文字表示了。
  1. import random as r
  2. import math

  3. legal_x = [0, 30]
  4. legal_y = [0, 30]

  5. class Turtle:
  6.     #初始数据
  7.     def __init__(self):
  8.         #定义乌龟的初始位置
  9.         self.turtle_x = r.randint(legal_x[0], legal_x[1])
  10.         self.turtle_y = r.randint(legal_y[0], legal_y[1])
  11.         #定义初始血量
  12.         self.turtle_blood = 100
  13.         #初始能量
  14.         self.power = 10

  15.     #普通移动的方向和移动的距离
  16.     def move(self):
  17.         #随机选择是在 x轴方向移动还是在 y轴方向移动
  18.         if r.choice([0, 1]):
  19.             move_x = r.choice([1, 2, -1, -2])
  20.             self.turtle_x = self.turtle_x + move_x
  21.             #print(f'小甲鱼沿着 x 轴走了{move_x}格')
  22.         else:
  23.             move_y = r.choice([1, 2, -1, -2])
  24.             self.turtle_y = self.turtle_y + move_y
  25.             #print(f'小甲鱼沿着 y 轴走了{move_y}格')

  26.         #边界检测
  27.         if self.turtle_x < 0:
  28.             self.turtle_x = -self.turtle_x
  29.         if self.turtle_x > legal_x[1]:
  30.             self.turtle_x = 2*legal_x[1] - self.turtle_x
  31.         if self.turtle_y < 0:
  32.             self.turtle_y = -self.turtle_y
  33.         if self.turtle_y > legal_y[1]:
  34.             self.turtle_y = 2*legal_y[1] - self.turtle_y

  35.         #每移动一次,体力减 1
  36.         self.turtle_blood -= 1
  37.         self.power += 1
  38.         return self.turtle_x, self.turtle_y

  39.     def hungry_move(self):
  40.         #随机选择是在 x轴方向移动还是在 y轴方向移动
  41.         if r.choice([0, 1]):
  42.             move_x = r.choice([-3, 3])
  43.             self.turtle_x = self.turtle_x + move_x
  44.             #print(f'小甲鱼沿着 x 轴走了{move_x}格')
  45.         else:
  46.             move_y = r.choice([-3, 3])
  47.             self.turtle_y = self.turtle_y + move_y
  48.             #print(f'小甲鱼沿着 y 轴走了{move_y}格')

  49.         #边界检测
  50.         if self.turtle_x < 0:
  51.             self.turtle_x = -self.turtle_x
  52.         if self.turtle_x > legal_x[1]:
  53.             self.turtle_x = 2*legal_x[1] - self.turtle_x
  54.         if self.turtle_y < 0:
  55.             self.turtle_y = -self.turtle_y
  56.         if self.turtle_y > legal_y[1]:
  57.             self.turtle_y = 2*legal_y[1] - self.turtle_y

  58.         #每移动一次,体力减 1
  59.         self.turtle_blood -= 1
  60.         return self.turtle_x, self.turtle_y

  61.     #吃小鱼
  62.     def eat(self):
  63.         self.turtle_blood += 20
  64.         self.power = 10
  65.         #体力上限为 100
  66.         if self.turtle_blood > 100:
  67.             self.turtle_blood = 100

  68.     #小甲鱼的快速移动,智慧的小甲鱼已经学会拐弯了。
  69.     def quick_move(self, fish_x, fish_y):
  70.         #print('发现一条小鱼!冲冲冲!')
  71.         # 当 y坐标差距更大时,先调整 x坐标
  72.         if abs(self.turtle_x - fish_x) >= abs(self.turtle_y - fish_y):
  73.             if (self.turtle_x - fish_x) >= 3:
  74.                 self.turtle_x -= 3
  75.             # 当小甲鱼和小鱼的 x轴的距离不足 3时,先对 x轴进行调整,则 y轴最小移动距离为 3-move >= 1
  76.             elif 0 < (self.turtle_x - fish_x) < 3:  # x轴的移动距离可能为 1,2   甲鱼(7, 10) 鱼(13, 17)
  77.                 move = self.turtle_x - fish_x
  78.                 self.turtle_x -= move
  79.                 if (self.turtle_y - fish_y) >= 2:
  80.                     self.turtle_y -= 3 - move
  81.                 elif (self.turtle_y - fish_y) == 1:
  82.                     self.turtle_y -= 1
  83.                 elif (self.turtle_y - fish_y) == 0:
  84.                     pass
  85.                 elif (self.turtle_y - fish_y) == -1:
  86.                     self.turtle_y += 1
  87.                 else:
  88.                     self.turtle_y += 3 - move
  89.             elif -3 < (self.turtle_x - fish_x) < 0:
  90.                 move = self.turtle_x - fish_x
  91.                 self.turtle_x -= move
  92.                 if (self.turtle_y - fish_y) >= 2:
  93.                     self.turtle_y -= 3 - move
  94.                 elif (self.turtle_y - fish_y) == 1:
  95.                     self.turtle_y -= 1
  96.                 elif (self.turtle_y - fish_y) == 0:
  97.                     pass
  98.                 elif (self.turtle_y - fish_y) == -1:
  99.                     self.turtle_y += 1
  100.                 else:
  101.                     self.turtle_y += 3 - move
  102.             else:
  103.                 self.turtle_x += 3
  104.         else:
  105.             if (self.turtle_y - fish_y) >= 3:
  106.                 self.turtle_y -= 3
  107.             elif 0 < (self.turtle_y - fish_y) < 3:  # x轴的移动距离可能为 1,2
  108.                 move = self.turtle_y - fish_y
  109.                 self.turtle_y -= move
  110.                 if (self.turtle_x - fish_x) >= 2:
  111.                     self.turtle_x -= 3 - move
  112.                 elif (self.turtle_x - fish_x) == 1:
  113.                     self.turtle_x -= 1
  114.                 elif (self.turtle_x - fish_x) == 0:
  115.                     pass
  116.                 elif (self.turtle_x - fish_x) == -1:
  117.                     self.turtle_x += 1
  118.                 else:
  119.                     self.turtle_x += 3 - move
  120.             elif -3 < (self.turtle_y - fish_y) < 0:
  121.                 move = -(self.turtle_y - fish_y)   #注意这个 move > 0
  122.                 self.turtle_y += move
  123.                 if (self.turtle_x - fish_x) >= 2:
  124.                     self.turtle_x -= 3 - move
  125.                 elif (self.turtle_x - fish_x) == 1:
  126.                     self.turtle_x -= 1
  127.                 elif (self.turtle_x - fish_x) == 0:
  128.                     pass
  129.                 elif (self.turtle_x - fish_x) == -1:
  130.                     self.turtle_x += 1
  131.                 else:
  132.                     self.turtle_x += 3 - move
  133.             else:
  134.                 self.turtle_y += 3


  135.         #每加速一个能量减 2
  136.         self.power -= 2
  137.         self.turtle_blood -= 1
  138.         return self.turtle_x, self.turtle_y

  139. class Fish:
  140.     def __init__(self):
  141.         #定义初始位置
  142.         self.fish_x = r.randint(legal_x[0], legal_x[1])
  143.         self.fish_y = r.randint(legal_y[0], legal_y[1])

  144.     def move(self):
  145.         # 随机选择是在 x轴方向移动还是在 y轴方向移动
  146.         if r.choice([0, 1]):
  147.             move_x = r.choice([1, -1])
  148.             self.fish_x += move_x
  149.             #print(f'小鱼沿 x 轴走了{move_x}格')
  150.         else:
  151.             move_y = r.choice([1, -1])
  152.             self.fish_y = self.fish_y + move_y
  153.             #print(f'小鱼沿 y 轴走了{move_y}格')
  154.         # 边界检测
  155.         if self.fish_x < 0:
  156.             self.fish_x = -self.fish_x
  157.         if self.fish_x > legal_x[1]:
  158.             self.fish_x = 2*legal_x[1] - self.fish_x
  159.         if self.fish_y < 0:
  160.             self.fish_y = -self.fish_y
  161.         if self.fish_y > legal_x[1]:
  162.             self.fish_y = 2*legal_x[1] - self.fish_y

  163.         return self.fish_x, self.fish_y

  164.     # 发现小甲鱼,快跑快跑!
  165.     def escape(self, turtle_x, turtle_y):
  166.         #边界上的小鱼单独考虑
  167.         if self.fish_x == 0 or self.fish_x == legal_x[1]:
  168.             if self.fish_y > turtle_y:
  169.                 self.fish_y += 1
  170.             elif self.fish_y < turtle_y:
  171.                 self.fish_y -= 1
  172.             else:
  173.                 move_y = r.choice([1, -1])
  174.                 self.fish_y = self.fish_y + move_y
  175.         elif self.fish_y == 0 or self.fish_y == legal_y[1]:
  176.             if self.fish_x > turtle_x:
  177.                 self.fish_x += 1
  178.             elif self.fish_x < turtle_x:
  179.                 self.fish_x -= 1
  180.             else:
  181.                 move_x = r.choice([1, -1])
  182.                 self.fish_x = self.fish_x + move_x
  183.         #不在边界上的小鱼
  184.         else:
  185.             if abs(self.fish_x - turtle_x) < abs(self.fish_y - turtle_y):
  186.                 if self.fish_y > turtle_y:
  187.                     self.fish_y += 1
  188.                 else:
  189.                     self.fish_y -= 1
  190.             elif abs(self.fish_x - turtle_x) > abs(self.fish_y - turtle_y):
  191.                 if self.fish_x > turtle_x:
  192.                     self.fish_x += 1
  193.                 else:
  194.                     self.fish_x -= 1
  195.             else:
  196.                 move = r.choice([1, -1])
  197.                 if r.choice([0, 1]):
  198.                     self.fish_x = self.fish_x + move
  199.                 else:
  200.                     self.fish_y = self.fish_y + move

  201.         # 边界检测
  202.         if self.fish_x < 0:
  203.             self.fish_x = -self.fish_x
  204.         if self.fish_x > legal_x[1]:
  205.             self.fish_x = 2 * legal_x[1] - self.fish_x
  206.         if self.fish_y < 0:
  207.             self.fish_y = -self.fish_y
  208.         if self.fish_y > legal_x[1]:
  209.             self.fish_y = 2 * legal_x[1] - self.fish_y

  210.         return self.fish_x, self.fish_y

  211. #主程序
  212. print('===============game start===============')


  213. turtle = Turtle()
  214. #定义 10条鱼
  215. fish = {i : 10 for i in range(10)}

  216. for i in range(10):
  217.     fish[i] = Fish()

  218. #乌龟初始位置
  219. loc_turtle = (turtle.turtle_x, turtle.turtle_y)
  220. print('小甲鱼的初始位置', loc_turtle)
  221. #小鱼的初始位置
  222. loc = {i : (fish[i].fish_x, fish[i].fish_y) for i in fish.keys() }

  223. l = []
  224. for i in loc.keys():
  225.     l.append(i)
  226. l.sort()
  227. print(f'鱼的初始位置:{l[0]+1}号小鱼:坐标', loc[l[0]])
  228. for i in range(1, len(l)):
  229.     print(f'           {i+1}号小鱼:坐标 {loc[l[i]]}')

  230. while True:
  231.     print('========================================')
  232.     #print('鱼' , fish.keys())
  233.     if len(fish) == 0:
  234.         print('小甲鱼:win~~~   ヾ(&#3665;&#9593;&#9697;&#9593;)&#65417;"')
  235.         break

  236.     if turtle.turtle_blood == 0:
  237.         print('小甲鱼:轻轻地我走了,正如我轻轻地来~~~    (╥╯^╰╥)')
  238.         break

  239.     # 记录下能发现小甲鱼的小鱼的条数
  240.     dist_fish = []
  241.     for every_loc in loc.keys():
  242.         every_dis = math.sqrt((loc[every_loc][0] - loc_turtle[0]) ** 2 + (loc[every_loc][1] - loc_turtle[1]) ** 2)
  243.         if every_dis <= 3:
  244.             dist_fish.append(every_loc)

  245.     #记录每一条小鱼每移动一次到达的位置
  246.     for every_fish in fish.keys():
  247.         if every_fish in dist_fish:
  248.             loc[every_fish] = fish[every_fish].escape(loc_turtle[0], loc_turtle[1])
  249.             print(f' 小鱼{every_fish}号:救命啊,我被发现了,快跑快跑!!!    (&#65377;&#335;_&#335;)')
  250.             continue
  251.         loc[every_fish] = fish[every_fish].move()
  252.     # 好看地打印出每条小鱼的坐标
  253.     l = []
  254.     for i in loc.keys():
  255.         l.append(i)
  256.     l.sort()
  257.     print(f' 小鱼的位置:{l[0] + 1}号小鱼:坐标', loc[l[0]])
  258.     for i in range(1, len(l)):
  259.         print(f'           {i + 1}号小鱼:坐标 {loc[l[i]]}')

  260.     # 记录在小甲鱼能看到的每一条小鱼到达的位置,和到小甲鱼的距离
  261.     dist = {}
  262.     for every_loc in loc.keys():
  263.         every_dis = math.sqrt((loc[every_loc][0] - loc_turtle[0]) ** 2 + (loc[every_loc][1] - loc_turtle[1]) ** 2)
  264.         if every_dis <= 10.0:
  265.             dist[loc[every_loc]] = every_dis

  266.     if len(dist) > 0:   #在小甲鱼视野范围中的小鱼,启动快速模式
  267.         print(f' 小甲鱼:我发现了{len(dist)}条小鱼!', end='')
  268.         min_dist = min(dist.values())
  269.         for every_dist in dist.keys():
  270.             if dist[every_dist] == min_dist:
  271.                 if turtle.power >= 2:  #如果小甲鱼的能量大于 2,就可以使用超级无敌加速模式
  272.                     loc_turtle = turtle.quick_move(every_dist[0], every_dist[1])
  273.                     for z in loc.keys():
  274.                         if loc[z] == every_dist:
  275.                             print(f'  开启超级无敌加速模式!追击敌方{z}号小鱼')
  276.                             break
  277.                     break
  278.                 else:
  279.                     loc_turtle = turtle.move()
  280.                     print('  啊,没能量了,小鱼等等我!    ヽ(#`Д&#180;)&#65417;')

  281.     else:   #没有小鱼在小甲鱼的视野中,保持普通模式
  282.         if turtle.turtle_blood >= 20:
  283.             loc_turtle = turtle.move()
  284.             print(' 小甲鱼:悠哉哉~~~   ( ̄▽ ̄)~*')
  285.         else:   #饥饿中的小甲鱼,开始迫切地找食物!
  286.             loc_turtle = turtle.hungry_move()
  287.             print(' 小甲鱼:我得找吃的,好饿呀~~~   (ㄒoㄒ)')

  288.     print(' 小甲鱼的位置:坐标', loc_turtle)
  289.     loc_copy = loc.copy()
  290.     for fish_num in loc_copy.keys():
  291.         if loc[fish_num] == loc_turtle:
  292.             turtle.eat()
  293.             del fish[fish_num]
  294.             del loc[fish_num]
  295.             print(f' {fish_num}号小鱼:啊,我被吃掉了!')
  296.             if len(fish) == 0:
  297.                 break
  298.             print(f' 小甲鱼:好吃好吃!还剩{len(fish)}条小鱼   (&#3665;&#8226;&#1550; &#8226;&#3665;)&#10023;')
复制代码
屏幕截图 2023-06-08 192028.png

评分

参与人数 3荣誉 +13 鱼币 +5 贡献 +6 收起 理由
yinda_peng + 3 + 5 鱼C有你更精彩^_^
liuhongrun2022 + 5 + 3
歌者文明清理员 + 5 + 3

查看全部评分

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-8 19:34:27 | 显示全部楼层
沙发
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2023-6-8 20:16:57 | 显示全部楼层

可恶!自己抢
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 20:21:49 | 显示全部楼层
本帖最后由 yinda_peng 于 2023-6-8 20:23 编辑

厉害的厉害的
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 21:01:49 | 显示全部楼层
厉害
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2023-6-8 22:09:59 | 显示全部楼层

O(∩_∩)O哈哈~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2023-6-8 22:19:10 | 显示全部楼层
啊,文字互动里面的下标处理的不太好,发的时候都没发现,哈哈。打代码打的头晕了
我吃了个晚饭才发现
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-8 23:35:08 | 显示全部楼层
厉害了小伙子,学两个月就能做游戏开发了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2023-6-9 08:28:53 | 显示全部楼层
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-1 22:39

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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