2011年12月4日日曜日

ルートの計算。その1

自費出版予定の書籍にはルートを求めるプログラムを載せようと思い
何カ月か前に書いてました
しかーし!しばらく放っておいたら何書いてるかわからんw
とりあえず載せますが
更に改良してる版もあり
未完成版ですが
コレ載せるとまたやる気出るかもってかんじでよろしく!
use strict;
use warnings;

#expression:式
my $expression=3;
my $ret01=&in_calc(0,1);
my $ret02=&in_calc($ret01,0.1);
my $ret03=&in_calc($ret02,0.01);
my $ret04=&in_calc($ret03,0.001);
my $ret05=&in_calc($ret04,0.0001);
my $ret06=&in_calc($ret05,0.00001);
my $ret07=&in_calc($ret06,0.000001);
sub get_mul{
# これ以下で大きい数値
my $exp01=$_[0];
# 計算の単位
my $unit01=$_[1];
# 返り値用 1:大きい 0:等しい -1:小さい
my $is_big=0;

my $cmp=$unit01*$unit01;
if ($exp01>$cmp){
$is_big=1;
} elsif ($exp01==$cmp){
$is_big=0;
} else {
$is_big=-1;
}

$is_big
}
sub in_calc{
# 計算結果を入れる
my $exp01=$_[0];
# 計算の単位
my $unit01=$_[1];
# 返り値用
my $ans01=0;
# 乗算の基
my @for_mul;
for (0..9){
$for_mul[$_]=$exp01+($_*$unit01);
}
# 乗算の基を2乗
my @of_mul;
for (0..9){
$of_mul[$_]=$for_mul[$_]*$for_mul[$_];
print "i:$for_mul[$_]:i*i:$of_mul[$_]\n";
}
# X以下で大きい数値を求める
for (0..9){
if ($of_mul[$_]<=$expression){
$ans01=$for_mul[$_];
}
}
print "解の候補:$ans01\n";
$ans01;
}

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