查看: 16249|回复: 82

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

[复制链接]
david_ng223 该用户已被删除
发表于 2014-2-1 09:30:36 | 显示全部楼层 |阅读模式
提示: 作者被禁止或删除 内容自动屏蔽

百合控

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

开拓者

发表于 2014-2-1 09:54:22 | 显示全部楼层
module(英:模块)用来定义一个模块(废话) 每个module必须有一个end与之对应 恩 满足条件
模块名必须大写字母开头 没问题
module可以嵌套 你这里就是一个Zero模块嵌套Pokedex模块 没问题
#开头的就是注释 没问题
大写字母开头的一般是常量 用的很对 常量用=赋值 没问题 语法完全正确 新手长错的数组也用的很好
我唯一比较好奇的是 09、18、19行 既然说了是开关 为什么用的是真伪……好吧语法上没问题
另外在游戏中这段脚本的作用不会体现出来 因为你只是定义了而已

点评

我新加了一句"POKEDEX_PICTURES_DEFAULT = "Graphics/PokedexPitures/000.png" # Pokedex默认图像" 這句有錯麼??  发表于 2014-2-1 10:02

评分

参与人数 1梦石 +2 收起 理由
Sion + 2 给你2个意思一下,我懒得看了.....

查看全部评分

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

使用道具 举报

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

使用道具 举报

…あたしは天

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

开拓者贵宾

发表于 2014-2-1 14:08:51 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-1 14:40 编辑
david_ng223 发表于 2014-2-1 13:57
@余烬之中
這段改自敌人图鉴 VA-核心脚本-第61-83行
應該是讀取數據庫-敵人(我改成主角)-註釋內的東西?? ...


以下[建议]可以让你的代码更加美观易读。
       [问题]就是代码有bug,需要修改

[建议]if语句在单行且不长的情况下使用这样的形式:把if用作修饰符。即 return $1 if ...

[??]关于你的注释,请参阅任意正则表达式教程。 楼下的介绍就不错。

[问题]30、38行中$1是字符串,需要转化成数值类型

[问题]29、37行的正则表达式无法读取浮点数

[建议]多行的block请使用do...end的形式

[建议]在不需要的时候不用显式地写上return

[建议]String#each_line 可以代替 split 那些东西。不过在这里的代码完全不需要分行处理。

[建议]给一个修改意见吧:
[pre lang="ruby" line="1"]
def pokedex_height      #我想在數據庫-主角-註釋用[pkdh 7.4]之後在窗口顯示數值7.4(pokemon的身高)
  @note =~ /\[pkdh\s*(\d+(?:\.\d+)?)\]/ ? $1.to_f : 0.0
end
# 像这样,一行就可以解决的为什么要写这么长呢?
# 如果觉得很难理解,请参阅F1文档和正则表达式的教程
# 正则表达式看样子很可怕,其实是非常简单易用的,请务必学会
[/pre]

点评

29 37行直接传送字符串也可以 因为他的目的还是显示 大概要用到draw_text 传数字又要to_s  发表于 2014-2-1 14:27

评分

参与人数 1梦石 +2 收起 理由
Sion + 2 认可答案

查看全部评分

回复

使用道具 举报

百合控

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

开拓者

发表于 2014-2-1 14:22:42 | 显示全部楼层
david_ng223 发表于 2014-2-1 13:57
@余烬之中
這段改自敌人图鉴 VA-核心脚本-第61-83行
應該是讀取數據庫-敵人(我改成主角)-註釋內的東西?? ...
#為什麼上面用d+這裡用S+??
#什麼是$1??

这些你需要了解一下正则表达式
直接解释的话 是这样:[pre lang="ruby" line="1"]line =~ /\[(?:pkdp) (\S+)\]/[/pre]
你应该知道 line是一个字符串(String类的实例)变量   字符串常量用英文半角双引号""括起来
而后面的/\[(?:pkdp) (\S+)\]/是一个正则表达式(Regexp类的实例)常量   正则式常量用一对斜杠//括起来
字符串 =~ 正则式
将正则式与字符串进行匹配,匹配的结果存储在全局变量$~、$&和$1、$2、$3....中
$~存储所有匹配信息 $&是匹配成功的字符串 $1之类(后位引用)是分别匹配成功的字符串
这里有点难懂 给几个例子
[pre lang="ruby" line="1"]"hello!" =~ /he/
# $~.to_a    ["he"]
# $&            "he"
# $1            nil[/pre]
匹配成功 但未分群 所以无法后位引用 分群使用一对英文括号
[pre lang="ruby" line="1"]"Nice to meet you!" =~ /(nice).*(meet)/
# $~.to_a   []
# $&           nil
# $1           nil[/pre]
匹配失败 分了群 但无匹配 大小敏感
[pre lang="ruby" line="1"]"Nice to meet you!" =~ /(nice).*(meet)/i
# $~.to_a   ["Nice to meet", "Nice", "meet"]
# $&           "Nice to meet"
# $1           "Nice"
# $2           "meet"
# $3           nil[/pre]
匹配成功 且分了两个群 前面的存在$1 后面的$2 如果更多 以此类推
这一个能成功匹配 因为在正则式后面加了i 大小写不敏感

点评

汗,我点评的时候没看到你的点评,抱歉~  发表于 2014-2-1 14:26
耐心细致地写了这么多,真是好人~ 不过我觉得LZ应该学学正则表达式怎么写。比如 \d, *, + 是什么意思之类的 并且还需要学学Ruby的基础语法  发表于 2014-2-1 14:26
正则式中的.匹配任意单一字符 \s匹配空格 \S匹配非空格 \d匹配数字 在后面使用+代表至少匹配一次 使用*代表至少匹配零次  发表于 2014-2-1 14:25
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

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

使用道具 举报

百合控

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

开拓者

发表于 2014-2-1 15:27:54 | 显示全部楼层
本帖最后由 余烬之中 于 2014-2-1 16:47 编辑
david_ng223 发表于 2014-2-1 15:12
\s
匹配任意的空白符

点评累死了……
==================================================================编辑↓
你的错误在这句话没有错误
[pre lang="ruby" line="1"]@note =~ /\[pkdh\s*(\d+(?:\.\d+)?)\]/ ? $1.to_f : 0.0[/pre](第二个问号不需要 但是也不会出错 既然是冗余我就删了)
================ 补充:问号表示匹配一次或零次 如果所有数据强制要求0.0的形式不用问号 如果允许写整数就加上问号 ================
进行匹配
[pre lang="ruby" line="1"]"[pkdh 99.98]" =~ /\[pkdh\s*(\d+(?:\.\d+))\]/
# $1  "99"
# $2  nil[/pre]

(感谢@taroxd 指出的Bug 这段解说↑有误 正确的如下)
[pre lang="ruby" line="1"]"[pkdh 99.98]" =~ /\[pkdh\s*(\d+(?:\.\d+))\]/
# $1  "99.98"
# $2  nil[/pre]
==================================================================编辑↑
因为(?:)是 无后位引用功能的分群 不能被$2引用
你可以这样
[pre lang="ruby" line="1"]"[pkdh 99.98]" =~ /\[pkdh\s*(\d+)\.(\d+)\]/
# $1  "99"
# $2  "98"[/pre]还可以这样
[pre lang="ruby" line="1"]"[pkdh 99.98]" =~ /\[pkdh\s*(\d+\.\d+)\]/
# $1  "99.98"
# $2  nil[/pre]还可以这样
[pre lang="ruby" line="1"]"[pkdh 99.98]" =~ /\[pkdh\s*(.+\..+)\]/
# $1  "99.98"
# $2  nil[/pre]
所以 最后就是这样
[pre lang="ruby" line="1"]@note =~ /\[pkdh\s*(.+\..+)\]/ ? $1.to_f : 0.0[/pre]
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

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

使用道具 举报

百合控

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

开拓者

发表于 2014-2-1 16:24:24 | 显示全部楼层
david_ng223 发表于 2014-2-1 16:09
分拆完應該是

@note =~ /       #這些不明白.......這個是a


a

[pre lang="ruby" line="1"]字符串 =~ 正则式[/pre]这代表将字符串与正则式进行匹配 失败则返回nil 成功返回未匹配的字符个数
[pre lang="ruby" line="1"]表达式1 ? 表达式2 : 表达式3[/pre]等价于[pre lang="ruby" line="1"]if 表达式1
   表达式2
else
   表达式3
end[/pre]
如果表达式1为false或者nil则条件伪 执行3 否则条件真 执行2
所以
[pre lang="ruby" line="1"]字符串 =~ 正则式 ? 使用$1 : 默认值[/pre]
如果匹配了 就使用匹配信息 否则就用默认值

b与c

(不带反斜杠的)括号表示分群 只有分群后才能后位引用
[pre lang="ruby" line="1"]"ruby 1.9" =~ /ruby\s*\d+\.\d+/
# $&  "ruby 1.9"
# $1   nil

"ruby 1.9" =~ /ruby\s*(\d+\.\d+)/
# $&  "ruby 1.9"
# $1   "1.9"[/pre]

点评

一般很少会强制匹配小数的吧…… 反正写整数也会转成浮点的,不然加个 .0 多麻烦  发表于 2014-2-1 16:42
萌新瑟瑟发抖
看到我请叫我去干活
回复

使用道具 举报

…あたしは天

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

开拓者贵宾

发表于 2014-2-1 16:30:03 | 显示全部楼层
本帖最后由 taroxd 于 2014-2-1 16:31 编辑
余烬之中 发表于 2014-2-1 15:27
点评累死了……

你的错误在这里


1. 第二个问号不需要,那我打一个整数怎么办?我为什么一定要打小数?我就打 [pkdh 8]呢?
2.  "[pkdh 99.98]" =~ /\[pkdh\s*(\d+(?:\.\d+)?)\]/
# $1  "99.98"
# $2  nil
不测试不要瞎说,我在Ruby、RGSS上测试出来都是99.98

点评

不过如果强制要求小数的话还是不加问号较好  发表于 2014-2-1 16:37
啊 不对 记错了 ?是一次或零次 你的正确  发表于 2014-2-1 16:36
不好意思,pokedex_height,pokedex_weight全部都是小數的 例如 7.5kg, 80.0kg, 0.5m, 13.0m 等等  发表于 2014-2-1 16:35
第二个问号的意思是 前面的重复一次或多次……也就是说 可以匹配 33.34.35.36……不加问号才是正确的  发表于 2014-2-1 16:35
2.这个确实错了 眼花 把括号看到了前面……参见七楼第三块代码  发表于 2014-2-1 16:33

评分

参与人数 1星屑 +36 收起 理由
余烬之中 + 36 我很赞同

查看全部评分

回复

使用道具 举报

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

本版积分规则

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

在本版发帖返回顶部