鱼C论坛

 找回密码
 立即注册
查看: 593|回复: 10

[已解决]萌新想知道怎么给随机移动的变量设定边界。。。求各位大侠帮忙

[复制链接]
发表于 2018-7-27 10:25:17 | 显示全部楼层 |阅读模式

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

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

x
这组代码,就没有一次运行出结果,一是前面没有设定边界,二是我不知道我下面的
if (fish1.x==turtle.x and fish1.y==turtle.y) or (fish2.x==turtle.x and fish2.y==turtle.y) or (fish3.x==turtle.x and fish3.y==turtle.y):
这一行代码可不可以表达三条鱼随便一条被乌龟碰到就gameover的意思呢???
各位大侠帮帮忙
最佳答案
2018-7-27 17:25:22
ljm6131191 发表于 2018-7-27 17:15
版主新的代码好有意思!但是萌新还是有几个基础的点不明白,
第一是  print('fish1说:我在('+str(fish ...

1.这个是三元运算符不需要else,然而else是必须部分,所以填0(就是什么都不干)
2.就是格式化(就是把要输出的数据变一个格式,不是指硬盘那个格式化)输出,举个例子你就明白了。
比如:
'hi%s,%d' % ('everyone',2)
表示用'everyone'替换里面的第一个格式化符(即“%s”,意思是把要替换的内容转换成字符串再替换),然后用2替换里面第二个格式化符(即“%d”,意思是把要替换的内容转换成整数再替换)。
如果你理解了,下面的用法估计就很容易理解吧?
>>> '%f' % 1
'1.000000'
>>>
(表示用1替换里面的第一个格式化符(即“%f”,意思是把要替换的内容转换成浮点数再替换))
K[9GT`U~GBIF3JA(@M)O1D0.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2018-7-27 10:30:21 | 显示全部楼层
发代码上来好吗,我可不想打字啊……
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-27 10:34:37 | 显示全部楼层
无符号整形 发表于 2018-7-27 10:30
发代码上来好吗,我可不想打字啊……

好的好的
import random as r
class Fish:
    def __init__ (self):
        self.x=r.randint(0,10)
        self.y=r.randint(0,10)
    def move(self):
        i=r.choice([0,1])
        if i==0:
            self.x=self.x+r.choice([1,-1])
        elif i==1:
            self.y=self.y+r.choice([1,-1])

fish1=Fish()
fish2=Fish()
fish3=Fish()
turtle=Fish()
while True:
    fish1.move()
    fish2.move()
    fish3.move()
    turtle.move()
    print('fish1说:我在('+str(fish1.x)+','+str(fish1.y)+')')
    print('fish2说:我在('+str(fish2.x)+','+str(fish2.y)+')')
    print('fish3说:我在('+str(fish3.x)+','+str(fish3.y)+')')
    print('turtle说:我在('+str(turtle.x)+','+str(turtle.y)+')')
    if (fish1.x==turtle.x and fish1.y==turtle.y) or (fish2.x==turtle.x and fish2.y==turtle.y) or (fish3.x==turtle.x and fish3.y==turtle.y):
        print('turtle说:哈哈哈小金鱼抓到你啦')
        True==False
    else:
        True==True
print('Gameover')
多谢大侠
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-27 10:43:44 | 显示全部楼层
本帖最后由 无符号整形 于 2018-7-27 15:33 编辑

可以。
另外我看你理解好像有问题啊,True不是个变量啊,是个常量啊,不可以修改啊,我猜你想修改True = False就被说错误对吧?while True就是个死循环,要退出应该用break。
我帮你优化了下。
范围是5*5的。(其实这样更麻烦,不如直接修改随机数,这样它们就根本不会“想”跑出去(误,没看到move具体实现))
  1. import random as r
  2. class Fish:
  3.     def __init__ (self):
  4.         self.x=r.randint(0,10)
  5.         self.y=r.randint(0,10)
  6.     def move(self):
  7.         i=r.choice([0,1])
  8.         if i==0:
  9.             self.x=self.x+r.choice([1,-1])
  10.         elif i==1:
  11.             self.y=self.y+r.choice([1,-1])
  12.         if self.x > 5.5:
  13.             self.x = 5
  14.         elif self.y > 5.5:
  15.             self.y = 5
  16.         elif self.x < -5.5:
  17.             self.x = -5
  18.         elif self.y < -5.5:
  19.             self.y = -5

  20. fish1=Fish()
  21. fish2=Fish()
  22. fish3=Fish()
  23. turtle=Fish()
  24. while not (fish1.x==turtle.x and fish1.y==turtle.y) or (fish2.x==turtle.x and fish2.y==turtle.y) or (fish3.x==turtle.x and fish3.y==turtle.y):
  25.     fish1.move()
  26.     fish2.move()
  27.     fish3.move()
  28.     turtle.move()
  29.     print('fish1说:我在('+str(fish1.x)+','+str(fish1.y)+')')
  30.     print('fish2说:我在('+str(fish2.x)+','+str(fish2.y)+')')
  31.     print('fish3说:我在('+str(fish3.x)+','+str(fish3.y)+')')
  32.     print('turtle说:我在('+str(turtle.x)+','+str(turtle.y)+')')

  33. print('turtle说:哈哈哈小金鱼抓到你啦\n')
  34. print('Gameover')
复制代码

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

使用道具 举报

发表于 2018-7-27 10:46:07 | 显示全部楼层
设定边界的话只要在move后面检测移动之后的xy是否超出允许范围,假如超出就修改。

点评

其实这个没太大必要,原因看楼上  发表于 2018-7-27 10:48
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-27 12:06:00 | 显示全部楼层
无符号整形 发表于 2018-7-27 10:43
可以。
另外我看你理解好像有问题啊,True不是个变量啊,是个常量啊,不可以修改啊,我猜你想修改True = F ...

多谢版主大人
萌新对while not的使用还是不理解(当然已经尝试了是完全正确的),按照我的理解,while not...or...or就是三个条件里面随便一个不满足都会继续循环,那样不会发生一个满足了然而其他不满足所以继续循环的情况吗

还有一个问题是,版主前面说‘可以让数据不会自己想跑出去’,是该怎么操作呢,其实我的构想是碰到边界就会往其他地方走,而不是停下来,唉。。。一个看似简单的构想,对萌新来说都够难了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-27 15:29:39 | 显示全部楼层
本帖最后由 无符号整形 于 2018-7-27 15:33 编辑
ljm6131191 发表于 2018-7-27 12:06
多谢版主大人
萌新对while not的使用还是不理解(当然已经尝试了是完全正确的),按照我的理解 ...


1.你的理解差不多是对滴~~~,但是不会发生这种情况(只要有鱼被抓住就会gameover)
2.不好意思,是我看错了~~没仔细看move实现
假如要让全部鱼实现死掉再gameover的话要用not and,那么这个代码还少了一个就是鱼不会死亡,导致鱼被抓住后还会移动。

顺便帮你改进了下:
  1. import random as r
  2. class Fish:
  3.     def __init__ (self):
  4.         self.x=r.randint(0,0)
  5.         self.y=r.randint(0,10)
  6.         self.dead = False
  7.     def move(self):
  8.         if not self.dead:
  9.             i=r.choice([0,1])
  10.             if i==0:
  11.                 self.x=self.x+r.choice([1,-1])
  12.             elif i==1:
  13.                 self.y=self.y+r.choice([1,-1])
  14.             if self.x > 5.5:
  15.                 self.x = 5
  16.             elif self.y > 5.5:
  17.                 self.y = 5
  18.             elif self.y < -5.5:
  19.                 self.y = -5
  20.             elif self.y < -5.5:
  21.                 self.y = -5
  22.     def kill(self):
  23.         self.dead = True

  24. fish=[Fish(),Fish(),Fish()]
  25. turtle=Fish()
  26. while not (fish[0].dead and fish[1].dead and fish[2].dead):
  27.     fish[0].move()
  28.     fish[1].move()
  29.     fish[2].move()
  30.     turtle.move()
  31.     count = 0 #送代次数
  32.     print('fish1说:我在('+str(fish[0].x)+','+str(fish[0].y)+')') if not fish[0].dead else 0
  33.     print('fish2说:我在('+str(fish[1].x)+','+str(fish[1].y)+')') if not fish[1].dead else 0
  34.     print('fish3说:我在('+str(fish[2].x)+','+str(fish[2].y)+')') if not fish[2].dead else 0
  35.     print('turtle说:我在('+str(turtle.x)+','+str(turtle.y)+')')
  36.     for eachfish in fish:
  37.         if eachfish.x == turtle.x and eachfish.y == turtle.y and not eachfish.dead:
  38.             fish[count].kill()
  39.             print('turtle说:哈哈哈fish%d抓到你啦' % (count+1))
  40.         count+=1
  41. print('Gameover')
复制代码

输出:
fish1说:我在(1,5)
fish2说:我在(0,5)
fish3说:我在(0,5)
turtle说:我在(0,5)
turtle说:哈哈哈fish2抓到你啦
turtle说:哈哈哈fish3抓到你啦
fish1说:我在(2,5)
turtle说:我在(0,5)
fish1说:我在(1,5)
turtle说:我在(1,5)
turtle说:哈哈哈fish1抓到你啦
Gameover
>>>
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-27 17:15:27 | 显示全部楼层
无符号整形 发表于 2018-7-27 15:29
1.你的理解差不多是对滴~~~,但是不会发生这种情况(只要有鱼被抓住就会gameover)
2.不好意 ...

版主新的代码好有意思!但是萌新还是有几个基础的点不明白,
第一是  print('fish1说:我在('+str(fish[0].x)+','+str(fish[0].y)+')') if not fish[0].dead else 0
             这行代码里面 not fish[0].dead 是不是等同于fish[0].dead=False,然后后面的else 0是什么意思呢,可以换
             其他数字?
第二是  print('turtle说:哈哈哈fish%d抓到你啦' % (count+1))
             这行代码不太明白,%d和%是什么意思呢,看小甲鱼老师的课的时候也看到类似的代码,但是不明白
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2018-7-27 17:25:22 | 显示全部楼层    本楼为最佳答案   
ljm6131191 发表于 2018-7-27 17:15
版主新的代码好有意思!但是萌新还是有几个基础的点不明白,
第一是  print('fish1说:我在('+str(fish ...

1.这个是三元运算符不需要else,然而else是必须部分,所以填0(就是什么都不干)
2.就是格式化(就是把要输出的数据变一个格式,不是指硬盘那个格式化)输出,举个例子你就明白了。
比如:
'hi%s,%d' % ('everyone',2)
表示用'everyone'替换里面的第一个格式化符(即“%s”,意思是把要替换的内容转换成字符串再替换),然后用2替换里面第二个格式化符(即“%d”,意思是把要替换的内容转换成整数再替换)。
如果你理解了,下面的用法估计就很容易理解吧?
>>> '%f' % 1
'1.000000'
>>>
(表示用1替换里面的第一个格式化符(即“%f”,意思是把要替换的内容转换成浮点数再替换))
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2018-7-27 17:49:03 | 显示全部楼层
无符号整形 发表于 2018-7-27 17:25
1.这个是三元运算符不需要else,然而else是必须部分,所以填0(就是什么都不干)
2.就是格式化(就是把 ...

万分多谢版主大大
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-7 08:22

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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