2011年11月22日火曜日

NのY乗。経験値と能力のUP

ここでいう経験値と能力とはリアルのことではありません
RPGとかSRPG(ゲーム)の世界の中の経験値と能力のことです
敵と戦って経験値を取得してLVが上がれば能力が上がって強くなるのです

LVが上がると、次にLVを上げるのに必要な経験値は増えますが
一般的にLVを上げるのに必要な経験値は(LV*X)の2乗みたいです
LVが上がる時に上がる能力値は一定みたいです
能力値=LV*Xですね

僕は簡単なGAMEしか作ったことがないですが
僕はLVが上がるのに必要な経験値はXのLV乗にしたいんです
例えば
LV1の場合、X*1.2
LV2の場合、X*1.44
LV3の場合、X*1.584
LVZの場合、X*(1.2のLV乗)
って具合に

能力値もLV*Xではなく
LVNの場合、Y*(1.1のLV乗)
にしたいんです

一般的なRPGやSRPGの場合
LVがある程度上がってくると
能力はそんなに伸びなくなりますが
そこでもグングン値を伸ばしたいんです
GAMEをしはじめの頃のLVが上がればスッゲー強くなる感覚を
常に表現したいんです
そこでX*(1.1のN乗)という概念を打ち立ててみました

ちなみにこの計算式を思いついたのは
魔界戦記ディスガイアというGAMEで
武器の価格が倍になると、強さが1.2倍になるー。すげー。と思い
パクッたんですがw
それは中盤までで
中盤以降は価格が(武器のランク*X)の2乗で
強さが武器のランク*Xっぽくなってきます
ですが僕は武器の価格も能力も
LVUPに必要な経験値もキャラクターの能力も
X*(1.1のN乗)なGAMEの構想を考えています

なら、どうでもいいことばかり考えないでプログラミングしれって?
そうですね
でもなかなか長続きしないんです。ごめんちゃい

2011年11月21日月曜日

8n+x? その2

8n+x?の記事は、何がやりたいかというと
LVが8上がるごとにclassが上がる処理なんですね
ただ1から9回上がるとclassが上がり
その後は8回上がるごとにclassを上げたいんです
で、ちょっと試行錯誤しながらやってみたら
スッキリになりました
#module
#deffunc get_imi_oct_int2 int _input,var p1,var p2
p2=(_input-2)/8
p1=(_input-2)¥8+1//¥の半角が表示できなくて全角になってます
return
#global

repeat 100
x=cnt:y1=0:y2=0
get_imi_oct_int2 x,y1,y2
logmes "n:"+x+" y1:"+y1+" y2:"+y2
loop
stop

Perlに翻訳してみました
use strict;
use warnings;

for my $x (0..99){
my ($y1,$y2)=&get_imi_oct_int2($x);


print "\$x:$x \$y1:$y1 \$y2:$y2\n";
}

sub get_imi_oct_int2{
my $x=$_[0];
my $y2=int(($x-2)/8);
my $y1=$x-2;
if ($y1>=0){
$y1=$y1%8+1;
}else{ $y1++; }
return ($y1,$y2);
}

HSPとPerlは剰余の挙動が違ってあんまりスッキリ書けませんでした。ガックリw

0~99を
0x+7,0x+8,1x+1,~,1x+8,2x+1~
とするのではなく
0x-1,0x+0,0x+1,~,0x+8,1x+1~
としてみました
Xn+YのYが-1~8になるのがポイントです
Yが0か1になるのはXが0の時だけなので
そこだけ条件分岐すればいいですね
Xn+YのYが-1と0の値があるのが考えてみた結果です

_input-2になっているのは
Xn+Yが(X+1)n+Yに桁あがりするのは8n+2だからです
0~7が0X+Yで8~15が1X+Yではなく
0~9が0X+Yで10~17が1X+Yなのです
(9-2)/8=0で(10-2)/8=1なんですよね
2引いた効果です

¥8+1になっているのは
Xn+YのYが0~7ではなく1~8にしたいからです
0~7に+1すると1~8になりますよね

この2点は出力を見ながら調整しました
Xn+(y1~y2)の数値を得たい時は
幾らか引いてnで割ればXが得られる
幾らか引いてnの剰余を得てそれに幾らかを足せば(y1~y2)の間の値を得られる
nで割ることと、nの剰余を計算することの2点を抑えれば
出力を見ながら調整すれば求められるのではないでしょうか

この記事と前の記事のスクリプトをPerlに翻訳するのが次のTODOです
Perlって有名だし前ver交換性がしっかりしているので
書籍に掲載する言語として優れている。と常々思っているので

8n+x?

こんなスクリプト(HSP)書いたんですけど
どう書けばスマートなのかがわからないw

while 1
if i<=9{ int1=i-1: int2=0:_break }
if i<=17{ int1=i-9: int2=1:_break }
if i<=25{ int1=i-17: int2=2:_break }
if i<=33{ int1=i-25: int2=3:_break }
if i<=41{ int1=i-33: int2=4:_break }
if i<=49{ int1=i-41: int2=5:_break }
if i<=57{ int1=i-49: int2=6:_break }
if i<=65{ int1=i-57: int2=7:_break }
if i<=73{ int1=i-65: int2=8:_break }
if i<=81{ int1=i-73: int2=9:_break }
if i<=89{ int1=i-81: int2=10:_break }
if i<=97{ int1=i-89: int2=11:_break }
if i<=99{ int1=i-97: int2=12:_break }
await 1
wend

自費出版に使う言語はPerlと決めているのでPerlに翻訳してみました


use strict;
use warnings;

for my $i (0..99){
my $int1=0;
my $int2=0;

while (1){
if ($i<=9) { $int1=$i-1; $int2=0; last; }
if ($i<=17){ $int1=$i-9; $int2=1; last; }
if ($i<=25){ $int1=$i-17; $int2=2; last; }
if ($i<=33){ $int1=$i-25; $int2=3; last; }
if ($i<=41){ $int1=$i-33; $int2=4; last; }
if ($i<=49){ $int1=$i-41; $int2=5; last; }
if ($i<=57){ $int1=$i-49; $int2=6; last; }
if ($i<=65){ $int1=$i-57; $int2=7; last; }
if ($i<=73){ $int1=$i-65; $int2=8; last; }
if ($i<=81){ $int1=$i-73; $int2=9; last; }
if ($i<=89){ $int1=$i-81; $int2=10; last; }
if ($i<=97){ $int1=$i-89; $int2=11; last; }
if ($i<=99){ $int1=$i-97; $int2=12; last; }
last;
}
print "\$i:$i \$int1:$int1 \$int2:$int2\n";
}

#ここ色変わらないw変だw

1+8進数みたいなかんじですけど
プログラム的には8*n+1+nみたいなかんじですけど
数学的にはどう表現するんだろうか?
8n 8n+1 8n+2みたいには表現できないint1が-(1+8n)みたいなかんじなので
8n+xみたいに表現するにはどうすべきなのだろうか?w