ヒット・アンド・ブロー

  • 投稿日:
  • by
  • カテゴリ:

下手なくせに、アクションゲームばかり作って来ましたが、一転して、数当てゲームを作ってみました。

ヒット・アンド・ブロー、またはマスターマインドと呼ばれるゲームです。

ルールは、IchigoJamが0~9の数字から重複しないように選び出して並べた4の数字を当てるというものです。

プロンプト">"が表示されたら、0~9の数字を押して、コンピュータのチョイスを予想します。Back Spaceキーで一つ前の数字を削除できます。4桁の数字は重複は出来ないので、既に入力されている数字を選んでも無視されます。4桁入力して、変更がないならスペースを押して確定してください。

確定するとIchigoJamが自分の選んだ数字と比較して、ヒントを出してきます。数字も位置もあっていればH(ヒット)で、数字はあっているけれど位置が違えばB(ブロー)になります。全く何もあたってなければ何も表示されません。

IchigoJamが1357を選んでいたとして、1234と入力したら、1は位置も合っているのでH、3は位置が違うので1H1Bと返してきます。このヒントを元に、次の試行へ進み、最終的に4Hになればステージクリアです。

試行は15回まで出来るようにしてありますが、コツがつかめれば、まあ大体5回前後であたるようになりますから、ある意味終わりのないゲームになります。

試行回数によってステージクリアのスコアが変わります。一回目であたれば100点で、以後80,50,30,20,10,9,8,7,6,5,4,3,2,1と減っていきます。高得点を目指して頑張ってください。

今回は、それほどカツカツでないので、いじる余地があると思います。118バイトほどあいています。重複を許すようにしてみたり、色々出来るかと思います。

1 CLS:CLV:CLP:FORI=0TO79:A=PEEK(#748+I%8):B=PEEK(#180+I):POKE#700+I,A&B^A:NEXT
2 SRNDTICK():R=1:E=15:LET[8],100,80,50,30,20,10,9,8,7,6,5,4,3,2,1
3 FORI=0TO9:[30+I]=0:NEXT:FORI=0TO3
4 V=RND(10):IF[30+V]CONTELSE[I]=V:[30+V]=1:NEXT:FORI=0TO9:[30+I]=0:NEXT
5 LC0,N:?">":X=0:IF!NLC0,23:?"RND:";R;"/SCR:";S;
6 K=INKEY():IFK=8BEEP:X=X-!!X:[30+[4+X]]=0:[4+X]=0:LC1+x,N:?" ":CONTELSEIFX=4&&K=32FORI=0TO9:[30+I]=0:NEXT:GOTO8ELSEIFX=4||K<48||K>57CONTELSEO=K-48:IF[30+O]CONT
7 BEEP:[4+X]=O:[30+O]=1:LC1+X,N:?CHR$(224+O):X=X+1:GOTO6
8 PLAY"L20GEC":H=0:B=0:FORI=0TO3:FORJ=0TO3:C=([J]=[4+I]):H=H+C*(I=J):B=B+C*(I<>J):NEXT:NEXT
9 IFH<4GOTO11ELSELC6,N:?"MADE IT! +";[8+N]:PLAY"L8<C>ABG<C>ABGL4<CEC"
10 IFSOUND()CONTELSELC1,N:?"HIT ANY KEY":IF!INKEY()CONTELSES=S+[8+N]:R=R+1:CLS:N=0:GOTO3
11 LC6,N:IFH?H;"H";
12 IFB?B;"B"
13 LC0,N:?" ":N=N+1:IFN<EGOTO5
14 LC1,N+1:?"GAME OVER":PLAY">AAA8AR8<C>B8BA8A+G8A"

変数

  • A    ●パターン抽出用
  • B    数字パターン抽出用/ブロー数カウンター
  • H    ヒット数カウンタ
  • I    ループ処理(数字生成、重複使用フラグクリア、入力評価など)
  • J    ループ処理(入力評価)
  • K    キー入力
  • N    試行回数(0~)
  • R    ステージ数
  • S    スコア
  • V    面生成用
  • [0]~[4]    IchigoJamの選択した4桁の数値
  • [5]~[7]    ユーザ入力用
  • [8]~[22]    クリア時のスコアテーブル
  • [30]~[39]    重複チェック用テーブル

1行目で初期化と、足し算インベーダー改でやったように、  丸数字の作成を行っています。今回は⓪も使うので、少しコードが違いますが、やっていることは同じです。2行目は乱数の初期化と面数、試行回数上限と、クリア時のスコアテーブルを作っています。乱数の種はTICK()を使っています。なので、他のゲームではやっているCLTをあえてしていません。

3~4で、IchigoJamが4桁の数字を作ります。重複管理は[30]~[39]が未使用(0)かどうかで行っています。ゲーム中では、ユーザ入力の重複チェックにも使うので、数字を選び終わったら全て未使用(ゼロクリア)しています。

5行目は画面の初期状態。プロンプトの表示と、初回だけ画面最下行に面数とスコアとを表示しています。

6~7行目はキー入力処理です。BSの場合、4桁入力した状態でスペースキーが押された場合、数字が押された場合の順にチェックしています。BSは入力をクリアするだけでなく数字の使用フラグも忘れずにクリアしないといけません。BSまたは数字が押された場合にはBEEP、4桁確定のスペースキーではL20GECとならしています。

8行目で入力された数字の評価をしています。9~10行目は4Hつまりあたった場合の処理です。音楽が鳴り終わるまで待って、次の面への移動待ちになります。HIT ANY KEYですので、何かキーが押されるまで待っています。

11~13行はあたらなかった場合のヒントの表示です。試行回数を増やして、ゲームオーバーのチェックもします。14行目はGAME OVERの表示と、音楽です。ここでは演奏の終了は特には待ちません。

簡単ですね。