鱼C论坛

 找回密码
 立即注册
查看: 2961|回复: 5

[已解决]python中关于乌龟和鱼的游戏改进

[复制链接]
发表于 2017-2-23 16:51:25 | 显示全部楼层 |阅读模式
5鱼币
  1. import random as r
  2. import easygui as g

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

  5. class Turtle:
  6.     g.msgbox('你是乌龟,你的初始体力为100')
  7.     def __init__(self):
  8.         #初始体力
  9.         self.power = 100
  10.         #初始位置随机
  11.         self.x = r.randint(legal_x[0],legal_x[1])
  12.         self.y = r.randint(legal_y[0],legal_y[1])
  13.         g.msgbox('你的初始位置是:x = %s, y = %s' % (self.x,self.y))

  14.     def move(self):
  15.         msg = '请选择移动方向'
  16.         title = None
  17.         choices = ('上','下','左','右')
  18.         direction = g.buttonbox(msg,title,choices)
  19.         msg = '请选择移动距离'
  20.         title = None
  21.         choices = ('1','2')
  22.         distance = g.buttonbox(msg,title,choices)
  23.         distance = int(distance)
  24.         if direction == '上':
  25.             new_x = self.x
  26.             new_y = self.y + distance
  27.         if direction == '下':
  28.             new_x = self.x
  29.             new_y = self.y - distance
  30.         if direction == '左':
  31.             new_x = self.x - distance
  32.             new_y = self.y
  33.         if direction == '右':
  34.             new_x = self.x + distance
  35.             new_y = self.y

  36.         #检查是否超出边界
  37.         if new_x > 10 :
  38.             self.x = 10 - (new_x - 10)
  39.         elif new_x <0:
  40.             self.x = -new_x
  41.         else:
  42.             self.x = new_x
  43.         if new_y >10:
  44.             self.y = 10 - (new_y - 10)
  45.         elif new_y < 0:
  46.             self.y = - new_y
  47.         else:
  48.             self.y = new_y

  49.         
  50.         #体力消耗
  51.         self.power -= 10
  52.         msg = '你现在所处位置是:x=%s,y=%s.你目前体力为:%d'% (new_x,new_y,self.power)
  53.         g.msgbox(msg)
  54.         
  55.         return (self.x,self.y)
  56.    
  57.     def eat(self):
  58.         self.power += 20
  59.         if self.power > 100:
  60.             self.power = 100

  61. class Fish:
  62.     def init_pos(self):
  63.         #初始位置随机
  64.         self.x = r.randint(legal_x[0],legal_x[1])
  65.         self.y = r.randint(legal_y[0],legal_y[1])
  66.         return self.x,self.y

  67.     def move(self):
  68.         new_x = self.x + r.choice([1,-1])
  69.         new_y = self.y + r.choice([1,-1])
  70.         #检查是否超出边界
  71.         if new_x > 10 :
  72.             self.x = 10 - (new_x - 10)
  73.         elif new_x <0:
  74.             self.x = -new_x
  75.         else:
  76.             self.x = new_x
  77.         if new_y >10:
  78.             self.y = 10 - (new_y - 10)
  79.         elif new_y < 0:
  80.             self.y = - new_y
  81.         else:
  82.             self.y = new_y

  83.         return (self.x,self.y)

  84. turtle = Turtle()
  85. fish = []
  86. for i in range(10):
  87.     new_fish = Fish()
  88.     fish.append(new_fish)
  89.     #此处本应该在easygui上显示每个小鱼的位置,但是我只会每个窗口弹出一个小鱼的位置
  90.     print(new_fish.init_pos())


  91. while True:
  92.     if not len(fish):
  93.         g.msgbox('鱼都吃完了,游戏结束')
  94.     if not turtle.power:
  95.         g.msgbox('乌龟体力耗尽,挂掉了')
  96.         break

  97.     pos = turtle.move()

  98.     for each_fish in fish[:]:
  99.         if each_fish.init_pos() == pos:
  100.             turtle.eat()
  101.             fish.remove(each_fish)
  102.             g.msgbox('你吃掉了一条鱼')

复制代码



这是我改编了一下乌龟吃鱼的代码,我想让它能够在easygui上实现,然而出了一些问题想要求教各位鱼油。
1、easygui是不是没法用格式化字符啊 就是%s 这种东西
2、我这里想要有一个box显示10条鱼的初始位置,能让玩家可以看到,但是发现我只能每次显示一个鱼的坐标,虽已被迫无奈用了print
3、我想设置为鱼都不要动,只有乌龟能动。然而我再把乌龟移动到鱼的位置后发现没能吃鱼,而有时候又莫名其妙的会吃到鱼。
4、发现乌龟到边界后并不会马上弹回来,比如我现在位置(0,9),向上移动两格,它会显示位置是(0,11),我再向上移动两格才会变成(0,9)。
麻烦各位能给我讲讲啦。
最佳答案
2017-2-23 16:51:26
1.正常是格式化字符串后再传给窗口的,easygui我没用过,原理应该跟MFC的差不多
2.参考下小甲鱼的easygui教程,我觉得textbox可以实现,不过就是要先将所有信息存到一个字符串之后再放到textbox中,这个不知道有没有清除功能或者添加新的文字功能,可能还需要你自己研究下
3.你的问题主要是each_fish.init_pos()你每次调用一次函数都重新设定x,y导致你那种现象,你应该在Fish类中加上一个只用于获取x,y的函数,调用这个函数,而不是每次都重新调用重新获取x,y的函数

最佳答案

查看完整内容

1.正常是格式化字符串后再传给窗口的,easygui我没用过,原理应该跟MFC的差不多 2.参考下小甲鱼的easygui教程,我觉得textbox可以实现,不过就是要先将所有信息存到一个字符串之后再放到textbox中,这个不知道有没有清除功能或者添加新的文字功能,可能还需要你自己研究下 3.你的问题主要是each_fish.init_pos()你每次调用一次函数都重新设定x,y导致你那种现象,你应该在Fish类中加上一个只用于获取x,y的函数,调用这个函数,而不是每次 ...
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-23 16:51:26 | 显示全部楼层    本楼为最佳答案   
1.正常是格式化字符串后再传给窗口的,easygui我没用过,原理应该跟MFC的差不多
2.参考下小甲鱼的easygui教程,我觉得textbox可以实现,不过就是要先将所有信息存到一个字符串之后再放到textbox中,这个不知道有没有清除功能或者添加新的文字功能,可能还需要你自己研究下
3.你的问题主要是each_fish.init_pos()你每次调用一次函数都重新设定x,y导致你那种现象,你应该在Fish类中加上一个只用于获取x,y的函数,调用这个函数,而不是每次都重新调用重新获取x,y的函数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-2-23 20:16:03 | 显示全部楼层
我今天才学到30课,还没够水平回答
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-2-23 21:35:38 | 显示全部楼层
32269100 发表于 2017-2-23 20:16
我今天才学到30课,还没够水平回答

嗯啊谢谢你,等你学到了帮我看看哈
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2017-3-11 12:26:53 From FishC Mobile | 显示全部楼层
先回答第四个问题,你输出的时候用错变量而已
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2017-3-12 10:38:32 | 显示全部楼层
lumber2388779 发表于 2017-2-23 16:51
1.正常是格式化字符串后再传给窗口的,easygui我没用过,原理应该跟MFC的差不多
2.参考下小甲鱼的easygui教 ...

哈哈问题全部搞定,这是太感谢你啦
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-5-16 02:46

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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