壬天堂世界

 找回密码
 注册
搜索
热搜: 资料集合
查看: 13305|回复: 0
收起左侧

【资料】GBA-<火炎之纹章>乱数教程(原作者授权刊登)

[复制链接]
发表于 2005-2-10 10:50:40 | 显示全部楼层 |阅读模式
本文版权归原作者及《掌机王》所有,未经许可严禁转载!
# Q4 H, Z8 E; c, |# e" X■■■┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅★☆- A2 C) g1 H4 {1 H/ T* }4 N
■○→原作者:STAGE1 666/ K/ n' U) C) _
■◇→来 源:《掌机王》
0 j) A3 \* S2 v. w( y■■■┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅┅★☆: Z3 h* B1 B9 l
$ d% t+ _# u4 T, x/ ]( R
初级教程 6 M2 |& d! E+ `( d/ D+ Y8 ~% E

) C: u' x8 o# c8 ~- r4 i3 \7 Z& EI.何谓乱数?  O& O4 p: w9 z" c7 N( @; c& w
乱数,即随机数,是为了判定随机事件而产生的一系列看上去没有规律的,散乱的数。从计算机产生随机数的方式来看,一般也称其为伪随机数。
: q+ ^  l5 h0 [1 {2 V3 ]2 t可以说任何游戏,只要有随机情况的判定,就离不开乱数。. n. H8 i8 F7 }- ]) N1 z% @
在纹章系列中,攻击是否命中、必杀或特技是否发动、升级时各项能力值是否上升,甚至是某个敌人攻击我方的哪个人,攻击时是站在被攻击者的下方还是左方(假设距离一样)这样的AI,都是通过乱数来判定的。7 g% m, ?: _! X  T( d; V
因为命中率、必杀率、特技发动率、成长率等等都是以百分率表示的,具体的判定方法就很简单了。假如某几率是50%,如果乱数的大小在0-49的范围内,则判为成立,否则在50-99的范围内则判为否决。判定成立,意味着对命中率来说是攻击命中,对必杀率来说是必杀发动,对成长率来说,则是某项能力的提升。* ?- @% ~8 b5 T$ X1 I3 q

8 m/ j7 {; T% ^* ?3 e+ F" p2 ]II.何谓乱数表?
5 I' z1 E& E. U- N. |, F. u' m0 Y0 H既然要用乱数作随机判定,乱数就自然要存在于内存中。而乱数表就是指内存中连续存放的乱数的集合。如果这样说还是比较难理解的话,我们看一个具体实例。圣战之系谱的乱数表是由55个乱数组成的表。就是说在内存的55个连续地址中,存放了55个大小不等,范围由0-99的整数。
4 p/ E$ k  r3 u+ s$ X  o游戏的每一个随机判定都会消耗一个乱数。当55个乱数都用完时,游戏会用某种方法产生新的乱数表。游戏产生乱数的方法一般都不是计算机常用的生成随机数的算法。以系谱为例,只是用55个数和100之间作加减法而得到新的乱数表。虽然这样的处理方法使得随机数分别不太均匀,不过对游戏过程的影响还是基本可以忽略的。4 X" ]& E# [! Y/ [! W3 S
对系谱比较熟悉的老玩家可能都有这样的印象:游戏序章一开始,无论是用ノイッシュ还是アレク攻击敌方,敌方的反击都一定会命中,尽管在シグルド的指挥下敌人的命中只有三十多。/ \# v! \5 Y( e( n" n
, }; [4 A5 G) Q' k6 R! t5 Y

' A" L# l4 n% L3 {; q这时因为游戏每次开始都是由以下的这张乱数表开始的。& F9 g& c$ o4 s! H

6 {7 Y: `1 N2 V  V( z" i5 d$ b
; \& ^7 K. d/ t( M9 T这个由55个乱数组成的乱数表就是游戏每次开始时都会用到的第一张乱数表,称为初始乱数表。游戏中的各个随机判定将由第一个乱数开始,逐个往后消耗乱数来达成。这里有个特殊情况,仅限于游戏刚开始的这张初始乱数表,第一个乱数会被舍去。实际开始用的是第二个,即“17”。1 f; @: `: ~3 W: K) U
我们来具体分析一下。
9 x  Q1 W# }8 T) `1 ?: h' ], D0 Y如果开始先用アレク对敌人斧男发动攻击,第一个需要判定的是攻击是否命中,这将会用“17”来作判定,因为命中率是100%,自然判为成立。而之后第二个“15”则是敌人反击的命中率。敌人的命中率是32%,17<32,所以也是判为成立,敌人的攻击也命中了。
0 c8 |. m" Q+ [( K$ L* }重新load档,换为ノイッシュ先发动攻击,注意ノイッシュ比アレク多了一个特技必杀。第一个仍是命中判定,同样判为成立。而第二个则是必杀判定。因为ノイッシュ的技只有7,即必杀率为7%,15>7,故判为否决。所以ノイッシュ只作出了普通攻击。第三个是敌人反击的命中判定,乱数是“33“。而敌人的命中率刚好是36%,33<36,很不幸ノイッシュ也只能被敌人的反击打中。
4 o$ E3 E0 z/ q9 U( g4 i1 g从刚才的分析中,不知道大家有没有注意到,即使是100%的命中率,同样要用一个乱数来判定。这是因为根本没有必要对100%的情况作额外的特殊处理。虽然百分百命中的攻击在我们看来算不上随机事件就是了-_-。% U- c1 s- P% G
同样值得留意的是,必杀判定是在命中判定之后的。如果攻击不命中,则会跳过必杀的判定。这也解释了为何没有落空的必杀。说的具体点,就是一次命中的攻击会消耗两个乱数,一个用于命中判定,一个用于必杀判定。而一次攻击落空,则只消耗了一个乱数用于命中判定。
. L# N$ N0 L. _  p6 h" ]游戏之后的情况也是类似的,通过不断的消耗乱数来做随机情况的判定。( J8 V/ v: c* \& a
对于升级,因为系谱升级时能提升的能力有8项,这就需要用连续8个乱数来逐一判定。, p# L) c6 y9 R7 W
2 L) u1 P; C/ b0 P! u
III.何谓凹点?
4 x* O  `' Z0 d/ `9 B如果某次升级的结果不满意就马上save&load(以下简称S/L),直至得到一个满意的结果,这一过程称之为凹点,是纹章迷的常用词汇(其实我当地方言是叫“屈点”-_-b)5 ]6 y9 P  O/ G0 q$ ^5 |
因为系谱的乱数是会保存入记录的。即使S/L重来,乱数还是原来的那些。就是说如果把S/L前的操作重复一遍,还是会发生完全一样的结果。这就必须通过改变战斗的情况来使升级用的乱数发生变化。具个最简单的例子,如果A打死敌人后升级的情况不满意,则S/L,让B先去打其他的敌人,这样必然会消耗几个乱数。再回头让A打死敌人升级,因为升级用的乱数不同了,能力的上升情况就会发生改变。+ _; w, H0 U* C8 Y$ n3 F& D% d
( Y0 f* [' D; q; `( r
实用教程 6 d5 t3 ], d* \4 t6 C  x6 s$ A; u
1 d0 @, v2 j0 Y' i) v0 J
对乱数有了一定的认识,就可以开始详细的说明封印和烈火中预测乱数,并利用乱数凹点的方法了。因为模拟器凹点的方法可以更为随意,故以下的方法都主要是针对GBA玩家的。  D' S0 l' I6 n/ L% j. Z
要利用乱数凹点,首先就是要了解游戏中乱数在哪些情况下会被消耗掉。因为封印和烈火没有了特技,自然减少了相应的乱数消耗。乱数的主要消耗是以下4个方面:战斗、升级、敌人AI和移动。
0 A$ C9 j1 `( {. J
6 f7 g! T* u- k; l+ V8 g4 vI.移动对乱数的消耗$ ?2 T3 w+ k8 }0 ^+ p! }
先说说移动对乱数的消耗。这是封印和烈火特别的地方,也是用GBA也能预测乱数大小的关键所在。
5 U( o1 g% X" {" e游戏中人物的各种移动方式也会使用乱数。
; x" H$ `7 x% w+ ^0 v7 s6 TGBA 2作中移动对乱数的消耗,其规律可以概括如下:
- y+ l/ ]1 z! }由移动的终点向起点移动,如果既可以水平移动又可以竖直移动(无障碍物或敌人)则消耗乱数作判定,乱数为小时水平移动一格,乱数为大时竖直移动一格,直至移动到与起点水平或竖直为止。
" D  z1 C6 D1 m1 q
) U- l. @0 I& {/ Q# Q. h6 }' N要通过移动来预测乱数,下面具体介绍两种方法。6 \- ^1 P# S7 s( p0 ?5 {/ t

. E. ?* L2 q; {$ G1. 一次一个法: H) I. f0 f$ c1 x, e- j/ A' m/ ]
指用该法一次能预测一个乱数,是最基本的方法。, d, s, P5 a" P  [4 G3 I
首先,让移动的光标围自己绕圈
; e7 s, a' ^, A7 i) V7 Q9 i& O' V' X" H6 ?, S4 d0 I; W2 i

7 g- F, U  t3 B* u  S; g这时只要再往上一格,箭头就会发生变化。随着变化的不同,表明消耗乱数的情况如下:
1 N% x0 ]3 e9 C9 C2 X/ ^) c& T$ v; q  `5 Y0 ~6 |! `
大。表示一个50-99范围内的乱数。
5 R7 Y5 i" ~3 `# f/ q5 ?# {1 l$ l+ P# t" O
  z6 z9 V$ Y& a5 S7 B/ Z
小。表示该乱数在0-49的范围内。
$ D3 G; i2 Z) ]) G; H
; u; U! `' z- \7 x. D9 A; @3 c  x! k2 }, J+ q: c8 V, [/ F
注意如果当箭头由人物的垂直方向开始出发,则表示乱数为小,否则为大。绕的方向不同,箭头的指向也会不同。而判断的依据就是箭头由人物的哪个方向开始出发。* t. f2 p  F; I* q. c

: ^9 O9 _5 o, U0 ~. v5 e. P3 k2. 一个多个法2 r9 b3 Z4 B7 R6 `( m8 I
该法一次能判断出多个乱数。两种方法可以根据场合选择使用。
" y' @0 ?4 H& H. r% ]/ m1 w8 ~! }; K2 q0 |5 J" @
先把箭头绕成这样。只要再往右一格,箭头就会发生变化。随着变化的不同,消耗乱数的情况如下:
, L; q$ U* I  T0 z3 z6 n) P0 r& `2 l8 w' f0 O" ?) _# u( O
/ B9 s- j# v0 f! x
大。表示一个50-99范围内的乱数,是最多发的情况。6 _0 F7 P* ?3 r' H% r% t! A  B

& x! F, L" \  ?  }' i  F2 u) W
1 d- X- U9 w0 N0 T& Z小大。表示消耗了2个乱数,分别是一个小(1-49)一个大(50-99)。
. e) t4 x+ b6 M" F# q7 Z; e* \
3 K& _$ H- S8 ]& s
6 s; d/ ]9 Z% O) ^& F小小大。消耗了3个乱数。
( i. G. |2 `" E& J; K3 H" g9 k2 O$ p1 U

; C$ a& R* h6 v* l: I小小小。消耗了3个均小于50的乱数。* B2 y: H( h8 H5 ^; U5 I5 _
6 b' N, [$ k/ u2 }8 w; s/ H
6 A* _/ E% w2 G3 I
小。用此法对移动力高的骑士等职业,一次能测得更多的乱数。方法也是类似的。
% f: E7 P- o# R+ Z& ~8 @
4 D8 v5 R6 d1 r; |. M1 U注意箭头由人物的哪个方向开始出发,像上图这样的情况,其实是消耗了一个小的乱数。就是说如果转了90度,情况刚好相反。实际操作时为了避免混乱,应该始终按同一个方向绕。
: e; U7 H$ w+ a4 F
+ y4 g8 D. `1 U5 H5 g4 v5 W- o0 p* w通过反复以上的操作,就可以记录下随后各个乱数的大小情况。* [* G0 r( ~+ ~( q+ R9 Z" c
要在GBA用移动凹点,就是要知道乱数的大小状况,并通过乱数的调整使得升级时,需要凹的能力对应判定用的乱数都是小于50的乱数。既然是对乱数的预测,那么自然不但可以用到升级上,对命中、必杀等的预测也是可以的。" P/ E) s1 U% e" l& a& o% \) r
要通过调整乱数影响升级,则必须对战斗和升级的乱数使用情况都有所了解。3 u$ }# w  d7 s+ N. h
4 z* H# F2 F7 Y4 W
II.战斗对乱数的消耗- o  O5 L+ B# N2 D& Q
下面说说战斗。因为烈火比封印多了一个瞬杀,使得情况有所不同。. ^$ c% }. v/ P( d; C7 _) }
封印的情况:
6 r  V1 z- @3 y攻击miss消耗2个乱数,攻击命中而没有必杀消耗3个,必杀攻击也是3个。
! N3 Q3 G4 A, ~3 r) d9 E; A2 A烈火的情况:
; U8 C1 n4 ?( }- D2 M攻击miss消耗2个乱数,攻击命中而没有必杀消耗3个,必杀攻击消耗4个乱数,瞬杀也是消耗4个。  b1 T  E, m( M9 u
为何会有这样的差别,结合之前系谱的分析就很好理解了。- t* s3 [5 l# j1 e# n1 z
封印的一次攻击中,头两个乱数判定命中,第三个判定必杀。而烈火则是头两个判定命中,第三个判定必杀,第四个判定瞬杀。如果没有命中则不会有必杀判定,必杀没有发动则不会有瞬杀的判定。1 E+ D6 o. N8 s' n% M
至于为何会使用两个乱数来判定命中?很遗憾我也还不知道。两个乱数中,有时是用第一个来判定,有时则用第二个,至于具体规律还不清楚。如果想通过乱数预测来保证命中,则应该保证两个乱数都同为小。3 o) C5 T8 I/ j% ~( i

$ [9 N" w+ o, N. w( GIII.升级的乱数消耗
$ Q8 j3 A8 a' x* R; p2 v& L. R一次升级消耗7个乱数用于能力是否成长的判定。依次是HP、力、技、速、守备、魔防、幸运。注意幸运是排最后的。
+ y5 [5 Q' _* q8 l- A3 U2 j. u
! P9 `5 O5 h# yIV.具体凹点方法# }" j& ]: y1 ]1 ?
因为游戏是自动记录的,当某个人物攻击或待机被输入时,状态都会马上被记录。之后reset,也只能读回到上一次攻击或待机时的状况。而乱数的相应状况也会一并记录。不过如果只是通过移动消耗乱数,并不会马上进行记录。利用这一点,调整乱数的具体方法如下:
$ o3 Z  P9 m! J- }2 H4 A+ v% z1. 通过移动预测出一连串乱数的大小情况。
% G" I+ U5 E7 {' b" W, \2. 选择希望用于升级的乱数。升级会使用7个乱数,这里假设你希望的是第8至第14个乱数用于升级判定。( Z  c% X6 ^9 ~8 s1 ~6 O3 E
3. S/L。这时乱数又回复到了没有移动之前。
# [6 a. u) k, J3 C+ |9 [5 s9 n6 G. r4. 把前面的7个乱数消耗掉,使第8个开始用于升级判定。( {9 v2 X7 c! _8 A
对于用杖或跳舞等非战斗方式升级的,很简单,只要用移动的方法把7个乱数消耗掉就可以了。而对于战斗升级的,假设敌人能被你的一次攻击打死,因为一次没有必杀的攻击是消耗3个乱数,就是说应该先用移动消耗4个乱数。这里要求首先对攻击的命中、必杀等情况作个预测。0 P, E3 Z( `# l- L* o) m
因为敌人AI消耗乱数的情况更复杂,一般的预测和使用都是在我方的回合内进行。
) b, R4 V) o0 d6 R+ X) P$ `利用该方法凹点,对于成长率50%以上的能力,可以保证一定提升。而对于成长率低于50%的能力,因为乱数的范围由原来的0-99变成了0-49,等于成长率提升了一倍。使7项能力的判定乱数都是小乱数是不现实也没必要的,只需保证几项重点凹的能力就可以了。
+ l* k6 m3 t) n( J: C6 e' L( a3 p, x0 g/ S2 }$ E& m9 c
进阶教程! W" m1 B# r# Z( y% u5 c- x* i8 i
9 W2 W& f, U; @/ X  s
I. 0-99的乱数表和0-255的乱数表。: k" [# h; I9 Q$ n: \# c
为了应付不同的随机判定,有些游戏准备了两张不同的乱数表。其中一张存放的是0-99的乱数,另一张则是0-255的乱数。比如我们熟悉的FF系列,像命中判定这类最大值是100%的随机判定仍然是使用0-99的乱数表,因为那样比较直观;而踩地雷的遇敌方式则由另外一张0-255的乱数表作判定。以FF6为例,在地图上移动时,每移动一格就会用一个0-255的乱数判定是否发生战斗,然后再用一个0-255的乱数判定敌人的种类和数量。再之后,则会用一个0-99的乱数判定战斗是先制攻击、前后夹击还是普通模式等。
( k& p0 W& U0 D- _5 B3 T  x% s而纹章系列则一贯只采用一张0-99的乱数表的形式。
8 B6 p( |6 [- p' R: e2 V
$ M/ y1 ]% @! f  T' PII. 为什么要把乱数表的当前状态保存至游戏进度里呢?0 _/ x- Y! ^% Z% b2 W% k1 x! U2 W
这样做主要是为了使玩家不能通过无限反复的S/L来达到某种目的。作为系列中首次引入每回合可以S/L的系谱,这样的做法就变得有必要了。因为通过行动次序改变乱数的方法始终是有限的,把乱数表的当前状态保存至游戏进度里,起码避免了机械式的S/L来改变某个随机事件的发生情况。1 `. _& |' B6 ]* i
其实在RPG中也有这样做的必要。拿FF2来作例子,该游戏有个所谓在大地图不遇敌的方法:走一定格数如果还没遇敌,则S/L。因为乱数表已经更新,这时再走一定格数再S/L,重复就可以一直走下去而不遇敌了。不过因为该法对游戏过程影响毕竟不大,所以到了之后的FF数作仍然没有被去掉。
# t" z) s$ j  x0 x2 i1 x( K$ m! x: A9 V* r; _3 W) R4 s
III. 关于乱数的改变方式。
" g+ O9 n$ f: O除了游戏的各种随机情况要用作判定的乱数外,不少游戏还有其他的使乱数改变的方式。比如776,在人物状态画面中乱数会按帧自动消耗,武器的选择过程也会消耗一个乱数。这样做主要也是为了增加变化,不让玩家轻易能抓住游戏的漏洞,利用乱数达到各种目的。其实在状态画面中消耗乱数是RPG的常用方法,比如FF5(FF6则不会)。再有就是封印和烈火的做法,不过那样的做法更像是设计者有意为玩家提供一种利用乱数的方法。注意在776中,状态画面中乱数是按帧自动消耗,即在该画面的停留时间越长消耗的乱数越多,而且对消耗乱数的个数很难加以控制。而选择攻击指令后选择一次武器是固定消耗一个乱数,可以通过反复选择来控制乱数的消耗。不过因为776没有每回合的存档,控制乱数只对模拟器的玩家有意义。FF5则是每打开一次状态画面就消耗一个乱数,与停留时间无关。
回复

使用道具 举报

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

本版积分规则

QQ|小黑屋|手机版|Archiver|壬天堂世界 ( 京ICP备05022083号-1 京公网安备11010202001397号 )

GMT+8, 2026-8-8 04:59 , Processed in 0.010501 second(s), 4 queries , Redis On.

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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