;ver0.1 ; 骨格完成。 ;ver0.1→ver0.2 ; クリック数をカウントするようになった。加えて、上限値を設けた。 ; ただしテキストエリアのクリックは、カウントしない。 ; 得点制を搭載。 ;ver0.2→ver0.3 ; ハイスコアを記録するようになった。 ; それにともない、セーブファイルを残すようになった。 ; ウィンドウメニューバーを消した。 ; 終了ボタン(ルーチン)を搭載。 ; …なんか、ワリとゲームらしくなってきたかもしれない(笑)。 ;ver0.3→ver0.4 ; タイトル画面をつけた。 ; それにともない、一部のフローを変更。 ; コメントアウト解説を、自分用に追加(笑)。 ;ver0.4→ver0.5 ; セーブ内容をグローバル変数に持つようにした(セーブ先の変更)。 ; タイトルから、ハイスコアデータをリセット(っぽく)できるようにした。 ; 変数周りを整理。 ; あとは難易度の設定ができるようにしたいですねー。 *define caption "★を探そう! Ver0.5" defaultfont "MS ゴシック" globalon maxkaisoupage 1 humanz 20 windowback deletemenu roff intlimit %7,0,9999 game *start *title1 if %9==1 csp 10 :csp 11 :csp 12 :csp 13 :csp 14 :print 10,200 mov %0,0 :mov %4,0 bg black,10,200 setwindow 70,100,20,10,25,25,0,0,20,1,0,#ffffff,0,0,640,480 erasetextwindow 0 textoff if %9==1 wait 500 mov %9,0 lsph 5,":s/30,20,0,2;#aa9988#ffffffStartGame",185,320,255 lsph 6,":s/30,20,0,2;#aa9988#ffffffResetScore",170,360,255 lsph 7,":s/30,20,0,2;#aa9988#ffffffEnd",275,400,255 lsp 8,":s/60,40,0,2;#deb887#deb887を探そう!",230,180,255 lsp 9,":s/240,240,0,2;#ffaa44#ffaa44★",120,20,255 print 4,500 delay 500 vsp 5,1 :vsp 6,1 :vsp 7,1 :print 10,200 spbtn 5,1 spbtn 6,2 spbtn 7,3 *title2 btnwait %0 if %0<=0 goto *title2 if %0==1 gosub *titlesub if %0==2 gosub *titlesub :goto *title3_0 if %0==3 gosub *titlesub :end goto *foregame *title3_0 mov $30,"      初期化しました" mov $31,"     初期化を中止しました" lsph 3,":s/40,30,0,2;#aa9988#ffffffはい",280,220,255 lsph 4,":s/40,30,0,2;#aa9988#ffffffいいえ",260,300,255      ハイスコアデータを   リセットしてもよろしいですか?   vsp 3,1 :vsp 4,1 :print 1 spbtn 3,1 spbtn 4,2 *title3_1 btnwait %0 if %0<=0 goto *title3_1 ; 実際にはここでリセットしてるわけではなくて、下の*foregame節で ;判定スイッチとなる%200に0を渡してるだけ。 ; 「いいえ」で%200に1を渡すと、それが初期プレイであった場合後で ;面倒なことになるので、そのままスルーする。 if %0==1 mov %200,0 :mov %1,30 :goto *title3_2 if %0==2 mov %1,31 :goto *title3_2 *title3_2 vsp 3,0 :vsp 4,0 :print 1 textclear $%1 delay 1000 mov $30,"" :mov $31,"" goto *title1 *foregame if %200==1 goto *ongame ; 初期スコアデータ。 mov %210,3000 :mov $210,":s/30,20,0,0;#ffffff臍下屯田兵" mov %211,2600 :mov $211,":s/30,20,0,0;#ffffffアルベガス" mov %212,2400 :mov $212,":s/30,20,0,0;#ffffff音速丸  " mov %213,2200 :mov $213,":s/30,20,0,0;#ffffffボイジャー" mov %214,2000 :mov $214,":s/30,20,0,0;#ffffff八丁堀  " mov %215,1800 :mov $215,":s/30,20,0,0;#ffffffテリー  " mov %216,1600 :mov $216,":s/30,20,0,0;#ffffffどしえもん" mov %217,1400 :mov $217,":s/30,20,0,0;#ffffff忍    " mov %218,1200 :mov $218,":s/30,20,0,0;#ffffff悪司   " mov %219,1000 :mov $219,":s/30,20,0,0;#ffffffサミアどん" goto *ongame *ongame setwindow 20,20,30,10,20,20,0,5,20,1,0,#000000,0,0,640,90 erasetextwindow 0 lsph 10,":s/40,40,0,0;#ffaa44#ffaa44★",0,0,255 lsph 11,":s/20,20,0,0;#ffcc88#ffcc88Click ",585,67,255 lsph 14,":s/20,40,0,0;#ff8866#ffaa44End,",580,0,255 ; カウント変換テーブル用。主に文字列スプライトに渡す。 mov $0,"0" mov $1,"1" mov $2,"2" mov $3,"3" mov $4,"4" mov $5,"5" mov $6,"6" mov $7,"7" mov $8,"8" mov $9,"9" mov $10," " ; 反応メッセージ用 mov $11,"発見〜。" mov $12,"メチャクチャ近いです。" mov $13,"だいぶ近いですよ?" mov $14,"このへんにいるような気が…。" mov $15,"見当たりません。気配はするんですが。" mov $16,"まだまだ遠いですねー。" mov $17,"どこ探してるんですか。" mov $18,"そりゃ論外ですよ…。" mov $19,"それだけは、絶対ないです(汗)。" ; クリック数の制限。制限回数を変える場合は、%8を弄る。 ; スタートアップ画面から弄れるようにすると面白いかも。 mov %8,15 ; 文字列スプライト用の演算。 mov %0,%8/10 if %8<10 mov %0,10 mov %1,%8 mod 10 mov $21,"/" add $21,$%0 add $21,$%1 ;実画面。 bg black,1  画面の青い部分のどこかに、#ffaa44★#ffffffが隠れています。 delay 800 textclear  適当な場所をクリックして、返ってくるメッセージをヒントに、隠れている#ffaa44★#ffffffを見つけてください。 delay 1500 textclear *newfinder texton mov %6,0 :mov %7,0 lsph 13,":s/20,20,0,0;#ffffff#ffffffScore:0 ",10,65,255 bg #335588,10,500 delay 200 br #ffcc66        New Game Start!! #ffffff delay 1000 textclear saveoff vsp 11,1 :vsp 13,1 :vsp 14,1 :print 1 ; ターゲットスプライト配置位置をランダムに設定(a,b)。 rnd2 %10,10,590 rnd2 %11,100,430 amsp 10,%10,%11,255 print 10,200 goto *finder2 *finder2 ; ゲーム終了操作。 if %9==1 goto *title1 mov %9,0 ;・円形捜査の仕組み ; (x-a)^2+(y-b)^2=c^2 を応用。 ; 定数cは円の半径に置き換えられますから、その範囲で判定。 ; クリック位置を円周座標(x,y)として考える。 clickpos %0,%1 ; "End"をクリックした場合。 if %0>580 && %1<40 gosub *gameout :goto *finder2 ; テキストエリアをクリックした場合の対処。 if %1<90 mov %5,19 :goto *finder3 ; 円周演算。-20は、スプライトの中心を取るために。 mov %2,(%0-%10-20)*(%0-%10-20) mov %3,(%1-%11-20)*(%1-%11-20) add %2,%3 ; 値の範囲判定、及びスコア追加。 if %2<=625 mov %5,11 ;r<=25 if %2>625 && %2<=2500 mov %5,12 :add %7,200 ;252500 && %2<=6400 mov %5,13 :add %7,100 ;506400 && %2<=14400 mov %5,14 :add %7,50 ;8014400 && %2<=25600 mov %5,15 ;12025600 && %2<=40000 mov %5,16 :sub %7,20 ;16040000 && %2<=57600 mov %5,17 :sub %7,40 ;20057600 mov %5,18 :sub %7,80 ;r>240 ; カウンターを回す。描画と演算はサブルーチンで。 inc %6 gosub *countclick goto *finder3 *finder3 ;主に分岐処理。 ;クリアした場合、クリック数オーバーした場合、そして継続する場合。 if %5==11 vsp 10,1 :print 10,200 :delay 1000 $%5 if %5==11 && %6==1 add %7,2000 ;一発ボーナス if %5==11 && %6==%8 add %7,3000 ;フルカウントボーナス if %5==11 add %7,4000/%6+8000/%8 ;クリアボーナス gosub *score delay 500 if %5==11 goto *nextgame if %6>=%8 goto *gameover textclear goto *finder2 *gameover delay 500 textclear vsp 13,0 :print 10,1000 delay 400  制限回数以内に、#ffaa44★#ffffffを見つけられませんでした。 delay 800 textclear  ちなみに正解は/ vsp 10,1 :print 10,200 :delay 600 ここでした。 click textclear vsp 10,0 :vsp 11,0 :vsp 12,0 :vsp 14,0 :print 10,200 bg black,10,400 delay 600 goto *lastgame *nextgame click textclear vsp 10,0 :vsp 11,0 :vsp 12,0 :vsp 13,0 :vsp 14,0 :print 10,200 bg black,10,400 delay 600 gosub *highscore goto *lastgame *lastgame ;最終的に一本化した方が、処理を追加するときに流れが把握しやすいので。 mov %200,1 goto *newfinder ;以下サブルーチン群----------------------------------------------- *titlesub ;あんまりカッコよくないですが…。 csp 5 :csp 6 :csp 7 :print 1 wait 100 csp 9 :csp 8 :print 5,500 bg black,10,200 return *countclick ;クリック数のカウントと表示。 ;スプライト文字列全体を、文字変数に格納する。 mov %0,%6/10 if %6<10 mov %0,10 mov %1,%6 mod 10 mov $20,":s/20,40,0,0;#ffffff#ffffff" ; *ongame節で定義した$0〜$10(全角数字)が適用される。 add $20,$%0 add $20,$%1 ; CGタグを含めた文字列全てを、文字変数に格納。 add $20,$21 lsp 12,$20,485,50,255 print 1 return *score ;countclickとは別の手法を取ってみる。 ;itoaで得られる半角数字を、そのまま表示する場合。 mov $23,":s/20,20,0,0;#ffffff#ffffffScore:" ; 一応intlimitはかけてあるが、念のため。 if %7<0 mov %7,0 if %7>=10000 mov %7,9999 itoa $22,%7 ; 奇数桁の場合、半角スペースを文字列に加える(表示仕様のため)。 if %7>=0 && %7<10 add $22," " if %7>=100 && %7<1000 add $22," " add $23,$22 lsp 13,$23,10,65 print 1 return *highscore ;ここから以下"*high4"までの、全体が大きなサブルーチンとなっている。 ;数値を入れ替え取っ替えが面倒な部分(苦笑)。 textoff if %7<%219 mov %3,10 :goto *high3 mov $25,":s/30,20,0,0;#ffffff" input $26,"全角5文字以内で、お名前をどうぞ。","コイツ",10,1 ; 入力文字列の長さに応じてスペースを加えて、長さを揃える。 len %0,$26 if %0==2 add $26,"    " if %0==4 add $26,"   " if %0==6 add $26,"  " if %0==8 add $26," " add $25,$26 ; ハイスコアエントリの位置を指定。同スコアの場合は、上位になる。 if %7>=%210 mov %3,9 :goto *high2 if %7>=%211 mov %3,8 :goto *high2 if %7>=%212 mov %3,7 :goto *high2 if %7>=%213 mov %3,6 :goto *high2 if %7>=%214 mov %3,5 :goto *high2 if %7>=%215 mov %3,4 :goto *high2 if %7>=%216 mov %3,3 :goto *high2 if %7>=%217 mov %3,2 :goto *high2 if %7>=%218 mov %3,1 :goto *high2 if %7>=%219 mov %3,0 :mov %219,%7 :mov $219,$25 :goto *high3 goto *high3 *high2 ; 順位の入れ替え。 mov %1,219 :mov %2,218 for %0=1 to %3 mov %%1,%%2 :mov $%1,$%2 dec %1 :dec %2 next mov %1,219 :sub %1,%3 mov %%1,%7 :mov $%1,$25 goto *high3 *high3 ; ハイスコアの実表示。 lsp 40,":s/40,30,0,0;#ffaa44#ffaa44High Score",120,20,255 print 1 mov %1,70 mov %2,30 ; ハイスコアには4桁の数字(1000〜9999)のみ表示なので、桁数調整等の ;補完処理は行わない。手抜きでつ(汗)。 for %0=210 to 219 mov $%2,$%0 itoa $26,%%0 add $%2,":" :add $%2,$26 lsp %2,$%2,210,%1,255 add %1,40 :inc %2 next print 10,400 if %3==10 goto *high4 amsp 10,165,418-(%3*40),255 vsp 10,1 :print 10,100 vsp 10,0 :print 10,100 vsp 10,1 :print 10,100 vsp 10,0 :print 10,200 vsp 10,1 :print 10,100 vsp 10,0 :print 10,200 vsp 10,1 :print 10,200 *high4 ; 表示消去。スコアデータは残る(グローバル変数)。 click for %0=30 to 40 csp %0 next vsp 10,0 :print 10,200 texton return *gameout ;サブルーチンから直接終了するのも、なんだかなー、ということで。 ;いったん抜けてから、上位フローで処理。 cell 14,1 :print 1  ゲームを終了します。よろしいですか? lsp 15,":s/40,30,0,2;#aa9988#ffffffはい",280,220,255 lsp 16,":s/40,30,0,2;#aa9988#ffffffいいえ",260,300,255 print 10,100 spbtn 15,1 :spbtn 16,2 *out1 btnwait %0 if %0<=0 goto *out1 if %0==1 mov %9,1 if %0==2 mov %9,0 cell 14,0 :csp 15 :csp 16 :print 1 textclear return *eos ;----------------------------------------------------------------- 作成:國杜正弓 e-mail:msym@earth.interq.or.jp WebPage:http://www.interq.or.jp/earth/msym/