- タイトル
MatchBit
- 開発環境
IchigoJamBASIC1.2.1
IchigoLatte1.0.1
- 内容
マイコンが決めた1と0の並びを30秒の制限時間以内に当てるゲームです。
クリアすると1桁ずつ増えていきます。 - 遊び方
「START!」の表示の後、キーを入力していきます。
入力された数字(0または1)は回答欄の右端に入り、それまであった並びは1桁ずつ左にずれます。一番左にあった数字は削除されます。(これを左シフトと言います)
マイコンが決めた数字と一致すればレベルクリアで、かかったタイムと積算時間が表示されます。 - 操作方法
RUNすると「Ready?」と表示され、カウントダウンが始まります。
「START!」の表示で入力開始。
どのキーを押してもOKです。("Esc"を除く)
入力されたキーのアスキーコードが奇数なら1、偶数なら0が入力されます。 - プログラムの具体的な入力方法
左にJavaScript、右にBASICのプログラムが書かれています。
IchigoLatteの場合は左のプログラムを、IchigoJamの場合は右のプログラムを入力してください。 - プログラムについて
プログラムは、IchigoJamのBASICから、IchigoLatteのJavaScriptへステップアップするための参考プログラムとして、あえて各命令が対になるように書いてあります。
また、IchigoLatteに無い「BIN$」命令は新たに作成しています。
各処理の内容は下記の通りです。 - BASICからJavaScriptへステップアップのコツ
BASICからJavaScriptへステップアップする際、最初に戸惑うのは「GOTO」命令が無いことと思います。
「GOTO」を使わないプログラムを書くためには、プログラムの設計段階から考えなくてはなりません。
まずBASICのプログラムリストを見てください。
全ての処理が小さなサブルーチンになっていて、それらはほとんどがメイン処理(main以後)から呼び出されています。
BASICではこの様な書き方はあまり見られないと思いますが(構造化BASICを除く)、これような書き方をすると「GOTO」をできるだけ使わない書き方ができます。
今回作ったJavaScriptのプログラムでは「GOTO」を使う代わりに、「while」で行を戻る、「if」や「break」で行を飛ばす、「return()」で処理を飛ばす、といった手法を使っています。
今日広く使われているプログラミング言語の多くは「GOTO」命令の使用を推奨していません。(これについては色々な意見はあります)
「GOTO」を使わない処理の流れを考えるクセをつけておくと、JavaScript以外の言語を習得する際にも役に立ちます。
なお、今回はBASICとJavaScriptの比較をテーマにしましたので、全ての変数がグローバル変数になっています。
実際にJavaScriptでプログラムする場合は、関数の返り値やローカル変数を多用します。
JavaScriptでのプログラムに慣れてきたら、変数のスコープも考えてプログラムを設計するようにしましょう。
以上、簡単ではありますが上記プログラムがJavaScript学習の一助になれば幸いです。 - 参考ゲーム
初歩のラジオ 1979年7月号 金庫破りゲーム「ルパン」
各行の処理 | ||
---|---|---|
JavaScript | BASIC | 処理内容 |
init() | 30 @I:'init | 変数設定 |
readyGo() | 90 @R:'ready_go | カウントダウン |
bin() | BIN$() | |
key() | 260 @K:'key | キー入力、一致確認、タイムアウト |
disp() | 400 @D:'disp | 結果表示 |
match() | 460 @O:'match | 一致した場合の表示 |
gameOvr() | 540 @E:'game over | ゲームオーバー表示 |
main() | 620 @M:'main | メイン処理 |
MachBit | |
---|---|
JavaScript | BASIC |
//MachBit var l=0, n, t, u=0, r, s=0, x, y; function init(){ l=l+1; x=0; n=1<<(l+1); y=rnd(n); } function readyGo(){ var i=0; cls(); log("LEVEL = ",l); lc(0,5); i=0; while(i<=l){ log("?"); i=i+1; } lc(0,2); log("Ready?"); i=0; while(i<=4){ lc(0,3); log(5-i); sleep(1000); i=i+1; } lc(0,3); log("START!\n\n"); } function bin(b,d){ while(d>0){ log(((1<<(d-1))&b)!=0); d=d-1; } } function key(){ var k; while(x!=y){ k=0; while(!k){ k=inkey(); lc(20,6); log((30000-tick()+t)/1000," "); if(tick()-t>30000){ return(0); } } k=k%2; x=(x<<1)+k; x=x&(n-1); lc(0,6); bin(x,l+1); } return(1); } function disp(){ lc(0,5); bin(y,l+1); lc(0,11); log("Your Level = ",l,"\n"); log("Your time = ",u/1000,"sec\n"); log("Total time = ",s/1000,"sec\n"); } function match(){ u=tick()-t; s=s+u; log("\n\nMATCH BIT!"); disp(); log("\nHIT [enter] key then next level"); while(inkey()!=10){} } function gameOvr(){ log("\ntime out"); disp(); lc(13,11); log(l-1); lc(0,15); log("GAME OVER\n"); } function main(){ while(1){ init(); readyGo(); t=tick(); if(!key()){ break; } match(); } gameOvr(); } main(); |
10 'MachBit 20 GOTO@M 30 @I:'init 40 L=L+1 50 X=0 60 N=1<<(L+1) 70 Y=RND(N) 80 RTN 90 @R:'ready_go 100 CLS 110 ?"LEVEL = ";L 120 LC0,5 130 FORI=0TOL 140 ?"?"; 150 NEXT 160 LC0,2 170 ?"Ready?" 180 FORI=0TO4 190 LC0,3 200 ?5-I 210 WAIT60 220 NEXT 230 LC0,3 240 ?"START!" 250 RTN 'BIN$(b,d) 260 @K:'key 270 K=INKEY() 280 LC20,6 290 ?(1800-TICK())/60;" " 300 IFTICK()>1800R=0:RTN 310 IF!KGOTO@K 320 K=K%2 330 X=(X<<1)+K 340 X=X&(N-1) 350 LC0,6 360 ?BIN$(X,L+1) 370 IFX!=YGOTO@K 380 R=1 390 RTN 400 @D:'disp 410 LC0,5:?BIN$(Y,L+1) 420 LC0,11:?"Your Level = ";L 430 ?"Your time = ";U/60;"sec" 440 ?"Total time = ";S/60;"sec" 450 RTN 460 @O:'match 470 U=TICK()-T 480 S=S+U 490 ?:?:?"MATCH BIT!" 500 GSB@D:'disp 510 ?:?"HIT [enter] key then next level" 520 @W:IFINKEY()!=10GOTO@W 530 RTN 540 @E:'game over 550 ?:?"time out" 560 GSB@D:'disp 570 LC13,11 580 ?L-1 590 LC0,15 600 ?"GAME OVER" 610 RTN 620 @M:'main 630 CLV 640 @L:'loop 650 GSB@I:'init 660 GSB@R:'ready_go 670 CLT:T=TICK() 680 GSB@K:'key 690 IFRGSB@O:GOTO@L:'match:'loop 700 GSB@E:'end 710 END |
ダウンロードURLは下記になります。
MachBit(JavaScript) http://tagiyasoft.blog.jp/machbit_J.bin
MachBit(BASIC) http://tagiyasoft.blog.jp/machbit_B.bin
MachBit(JavaScript) http://tagiyasoft.blog.jp/machbit_J.bin
ブラウザでD/LしてIchigoJamに転送する場合は、通信ソフトでバイナリ送信をしてください。
(例:TeraTermの場合は、メニューの[ファイル]-[ファイル送信]で当該ファイルを送信します)