楼主: david_ng223

[結帖]我開始學腳本啦~~求大神們指點~~

[复制链接]

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-2 19:15:48 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-2 20:56 编辑
david_ng223 发表于 2014-2-2 18:57
实践:Hello world!          明白了
关于msgbox函数             明白了
字串                            ...


抱歉才看到

----------------------------------------------------------

关于 / 与 %

简单地说,/ 向负无穷取整,% 结果的正负号和除数相同

搜狗截图_2014-02-02_19-09-44.png

上表可以参考。注:modulo是%的别名

另外提一句,负无穷作为一个常量在Ruby中是存在的。不过你还是不用知道了。

----------------------------------------------------------

关于常量,你一楼写得那堆东西就叫常量。
使用常量可以让你要修改的时候方便许多。
一是方便查找,二是不需要改动已经写好的代码。
你需要知道常量的作用域,知道 Zero::Pokedex::POKEDEX_TYPE 是怎么回事(这个词见你的1L)

-----------------------------------------------------------

关于print、p和puts

简单地说,print和puts给使用者看,p给程序员调试看。在RGSS中,其中的区别不重要,反正玩游戏的人看不到输出=。=
所以在RGSS中,这三个方法都是供你自己调试程序用的。一般用p

------------------------------------------------------------

关于比较运算

不用深究,暂时按照符号本身的意思理解就好。但是记得 == 千万不能写成 =

------------------------------------------------------------

作为一个综合以上内容的小练习,你可以试试已知一天内的第x秒(如x=10000秒),利用/和%把它拆成当天时间:a小时b分钟c秒(如2小时46分40秒)
然后输出 “a:b:c” (如02:46:40)  如果数字只有一位的话在前方补0(如前面小时数为2,则补为02)
代码越简单越好,写完用下面的代码测试。

[pre lang="ruby" line="1"]
loop do
  t = Time.now
  x = t.hour * 3600 + t.min * 60 + t.sec
  # 在这里填上你的代码。x已经代入了当前的秒数
  # 然后把代码放在脚本编辑器的Main之前
  # 如果代码正确的话,应该能看到控制台中不断输出当前时间
  # 注意把焦点放在游戏窗口上
  # 测试完了别忘把这段代码删掉
  Graphics.wait(60)
end
[/pre]

提示:可以用 < 10 来判断是否要补0。

注:有比较高级的方法,参见 Game_System#playtime_s 。暂时不需要掌握。

--------------------------------------------------------------

参考:
[pre lang="ruby" line="1"]

h = x / 60 / 60
m = x / 60 % 60
s = x % 60

h = h < 10 ? "0#{h}" : h.to_s
m = m < 10 ? "0#{m}" : m.to_s
s = s < 10 ? "0#{s}" : s.to_s

p "#{h}:#{m}:#{s}"

# 下面的两种方法现在不能理解没有关系
# p [h, m, s].collect {|num| num < 10 ? "0#{num}" : num.to_s }.join(':')
# p sprintf("%02d:%02d:%02d", h, m, s)

[/pre]

点评

至少人家没学过 =。=  发表于 2014-2-2 20:47
sprintf很高级吗……  发表于 2014-2-2 20:43
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-2 20:25:50 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-2 20:55:28 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-2 21:04:00 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-2 21:30 编辑
david_ng223 发表于 2014-2-2 20:55
@taroxd


条件语句的正确缩进,以及各种用法

[pre lang="ruby" line="1"]

if some_condition # 这里加 then 是不好的
  do_something_if_some_condition
elsif another_condition
  do_something_if_another_condition
else
  do_something_else
end

# unless...else...end 是不好的

do_something if some_condition
some_condition and do_something  # 这句话句意和上面一句相同,暂时可以不用理解。
# if some_condition then do_something end 是不好的
# unless !some_condition 是不好的

do_something_else unless some_condition  # do_something if !some_condition 是不好的
some_condition or do_something_else # 这句话句意和上面一句相同,暂时可以不用理解。
# unless condition1 && condition2 是不好的

some_condition ? do_something : do_something_else
# if some_condition then do_something else do_something_else end 是不好的

case expression
when condition1 then do1
when condition2 # 这里加 then 是不好的
  do2_line1
  do2_line2
# when condition3: do3 #这样写是不好的,并且在Ruby后期版本已经不支持。请务必不要用这样的写法。
else do_else # do_else 内容较长时建议换行
end
# 判断条件成立是用 condition === expression

# 以上“是不好的”仅仅是不建议这么写,写了也不会有任何问题。
# 但事实上,以上不建议的写法在默认脚本中一次都没有出现过。
[/pre]

点评

= =!一般有好奇心的人都会想去弄懂吧 这里不说最后大约是去百度……  发表于 2014-2-2 21:33
不是注释了“暂时可以不用理解”嘛  发表于 2014-2-2 21:26
话说短路逻辑这就放出来真的好吗……既然说的话不妨说透彻一点  发表于 2014-2-2 21:26
只是一个补充而已  发表于 2014-2-2 21:24
我记得一般不建议写if condition then do_sth else do_sth end来着 因为 ? : 的形式更简单美观  发表于 2014-2-2 21:11
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-2 23:53:27 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 2014-2-3 08:37:36 | 显示全部楼层
本帖最后由 余烬之中 于 2014-2-3 20:44 编辑
david_ng223 发表于 2014-2-2 23:53
A_B_C和B_C_D是标识符
a和b是變量
兩者都是輸出234,即是兩者沒有分別??


首先 【标识符】并不是常量专属的名称 凡是任何用于指代某对象 由使用者自定义的字符序列都是标识符
比如  local_var = 3   其中local_var就是标识符   @ins_var = 0   @ins_var是    $glo_var = 9    $glo_var是   CON = "Hi"   CON是   甚至【module AMOD】AMOD也是    【class CLS】CLS也是

常量和变量都可以提前操作 至于这句话:
常量无法改变,只能赋值给别人。
说的是不能动态的改变
看两个例子
=======================================================[pre lang="ruby" line="1"]CON = 100
p CON
#=>100
CON += 50
#warning: already initialized constant CON
p CON
#=>150
another_var = CON
p another_var #=> 150[/pre]在给常量第一次赋值以后 再对其赋值就会出现警告 但是不出错 继续执行 所以赋值还是能够成功
现在加上这样一段[pre lang="ruby" line="1"]def met
  CON += 3
  p CON
end #SyntaxError:dynamic constant assignment

met[/pre]这样的话这段代码无法通过语法检查 一句都不会执行 包括上面的100 150等
=======================================================
=======================================================[pre lang="ruby" line="1"]loc = 100
p loc
#=>100
loc += 50
p loc
#=>150
another_var = loc
p another_var #=> 150

def met
  loc += 3
  p loc
end

met
#undefined method '+' for nil:NilClass[/pre]这里也会出错 但是语法是正确的 它会输出100 150 150 然后报错 这里出错的原因是loc是局部变量 无法被met方法获取 但是其他变量可以
而且这里也没有出现警报
我们换成实例变量试试
[pre lang="ruby" line="1"]@ins = 100 # 坑人神句 下面不加井号之间的就是这样的结果
@ins#-=-=-=-=-=-=-=-=-=-=-=-=# = 100  #←把井号及之间的删掉
p @ins
#=>100
@ins#-=-=-=-=-=-=-=-=-=-=-=-=# += 50  #←把井号及之间的删掉
p @ins
#=>150
another_var = @ins
p another_var #=> 150

def met
  @ins += 3
  p @ins
end

met
#=>153[/pre]总体输出结果是 100 150 150 153
全局变量 类变量等结果一样 不过你暂时不用去管 记得是变量就行了
=======================================================
总结就是 常量的值不能被动态改变(方法中) 连语法都不允许 如果在方法外重新赋值 会出现警报 但是赋值本身还是成功的
变量的值能够被动态改变 只要方法能够获得该变量 就允许对他进行操作     

点评

论坛啊……  发表于 2014-2-3 09:17
第四段代码第一行,被坑~  发表于 2014-2-3 09:06
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-4 14:53:58 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

…あたしは天

梦石
0
星屑
2308
在线时间
4033 小时
注册时间
2010-10-4
回帖
10548

开拓者贵宾

发表于 2014-2-4 14:58:17 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-4 15:11 编辑

任何一个方法都有一个返回值。若没有显式指定返回值,那么方法会返回最后一次计算的结果。

其实p也是一个方法,它返回的是p所带的参数(或构成的数组)

于是 p @loc,也就是 self.p(@loc) 返回了100
而met方法返回了最后一次计算的结果,也就是p的返回值100

然后 p met 也就变成了 p 100

另外,puts的返回值是nil,你不要met返回100的话,把第3行改成puts就可以了

--------------------------------------------------

关于返回值

[pre lang="ruby" line="1"]def one
  return 1  # 1是该方法的返回值
end

p one # 输出1[/pre]

[pre lang="ruby" line="1"]def add_one(n)
  return n + 1
end

a = 1
b = add_one(a)  # => 2
p b             # 输出2[/pre]

方法的返回值就是类似于函数的值的感觉嗯。
另外上面两个例子只是写着演示的,没什么实际用处。
回复

使用道具 举报

百合控

梦石
0
星屑
6548
在线时间
1275 小时
注册时间
2013-8-21
回帖
3522

开拓者

发表于 2014-2-4 15:27:12 | 显示全部楼层
david_ng223 发表于 2014-2-4 14:53
請問

def met


当你使用def...end的时候 你就定义了一个方法
ruby中每个方法都有返回值 但是并不需要你【显式】的返回 多数情况下我们是【隐式】的
[pre lang="ruby" line="1"]def met1
  # 什么都没有的方法
end

p met1
#=>nil[/pre]
[pre lang="ruby" line="1"]def met2
  1314 # 只有一个 值 的方法
end

p met2
#=> 1314[/pre]
[pre lang="ruby" line="1"]def met3
  loc_var = 3 #定义局部变量
  loc_var + 5 #计算将局部变量与5的和
end

p met3
#=> 8
#注意 loc_var 已经被释放 不再存在
#但是它的值一直是3[/pre]
[pre lang="ruby" line="1"]@ins= 999
def met4
  @ins/ 3
end

p met4
#=> 333
p @ins
#=> 999[/pre]
[pre lang="ruby" line="1"]def met5
  a = 12580
  submet(a) #调用另一个方法 传递了参数
end

p met5
#NameError:undefined local variable or method 'submet'

def submet(x)
  x * 100
end

p met5
#=> 1258000[/pre]
[pre lang="ruby" line="1"]def met6
   9
   return 100 #显式返回一个值的方法
   1 #后面的内容根本不执行 包括本行和下一行
   puts "dodododo"
end

p met6
#=> 100[/pre]

  
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

david_ng223 该用户已被删除
 楼主| 发表于 2014-2-4 18:34:08 | 显示全部楼层
提示: 作者被禁止或删除 内容自动屏蔽
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册会员

本版积分规则

Powered by Discuz! X5.0 © 2001-2026 Discuz! Team.

在本版发帖返回顶部