配列使えば何桁でも計算できんじゃね? って思いついて書いてみたよ。
思いつきで書いた割には予想外に使える予感……
最大桁数 = 10 ; この変数を変えるだけで何桁でも可能。
dim スコア配列, 最大桁数 ; この配列にスコアが保存される。初期化する時もこの方法で。
; ランダムにスコアを加算し続けるテスト。
randomize
repeat
;「加算スコア」に加算したいスコアを代入して、*スコア追加を呼ぶことでスコアに追加する。
加算スコア = rnd( 32768 ) * 1000 + rnd( 32768 ) ; ちなみにrndは32768までの値しか出せない。
gosub *スコア追加
gosub *スコア表示
wait 1
loop
stop
*スコア追加
加算スコア文字列 = str(加算スコア) ; 加算スコアを文字列にする。
加算桁数 = strlen( 加算スコア文字列 ) ; 文字列にすれば文字数を取得するだけで桁数がわかる。
; このループでは加算スコアの加算と、それに伴う値の繰上を行なっている。
repeat 最大桁数
加算終了 = 1 ; 加算終了フラグ。スコアの加算と繰り上げが行われている内は0にされて終了しない。
;スコア加算処理
if cnt < 加算桁数 {
スコア配列( cnt ) += int( strmid( 加算スコア文字列, 加算桁数 - ( cnt + 1 ), 1 ) )
加算終了 = 0
}
;スコア繰上処理
if スコア配列( cnt ) >= 10 {
;カンスト判定
if cnt >= 最大桁数 - 1 {
;最大桁数を越えたらオール9でカンストを表す。
repeat 最大桁数
スコア配列( cnt ) = 9
loop
加算終了 = 1
} else {
スコア配列( cnt ) -= 10
スコア配列( cnt + 1 ) += 1
加算終了 = 0
}
}
;加算終了処理。
if 加算終了 == 1 : break
loop
return
*スコア表示
;画面クリアとかいろいろ。
redraw 0
pos 0,40
gcopy 0,0,0,ginfo_sx,ginfo_sy
pos 0,0
color 200+rnd(56),200+rnd(56),200+rnd(56);色を変えていることに意味はない。
boxf 0,0,ginfo_sx,40
color 0,0,0
redraw 1
; スコアをいくつ加算したか表示
mes "+" + 加算スコア
;スコア表示用の文字列を作成。これを応用すればスコアを画像で表示できる。
;つまりスコア配列の要素0が1の位になってて、要素1が10の位になってる。そんな感じ。
表示スコア = ""
repeat 最大桁数
表示スコア = str( スコア配列( cnt ) ) + 表示スコア
loop
; 現在のスコアを表示
mes 表示スコア
return
内容はコメント参照。
1行目を変えるだけで何桁でも表示可能。
カンスト処理もしてる。スコアが限界を越えるとオール9で表示される。