見出し画像

IchigoJamでけいさんバトル

某SNSで、こんな投稿を見つけた。

1時間に44京回以上計算できるスーパーコンピュータ「富岳」と、10秒間に行えるたしざんの回数で競う企画のようである。
しかし、普通の人間がズルやハプニングなしで「富岳」に勝つのは普通に考えて5000兆%不可能だろう。
そこで、まずは身近なコンピュータと対戦し、練習してみるのがいいかもしれない。

というわけで、IchigoJam でそれっぽいプログラムを実装してみた。

※IchigoJamはjig.jpの登録商標です。

今回のプログラムの仕様

起動すると、まずプレイヤーが10秒間の足し算に挑戦するパートが始まる。

3カウントのあと、ゲームが始まり、答えが1~10の整数になる足し算が表示される。
プレイヤーは、答えが1~9のときはそれぞれの値に対応するキーを、10のときは0のキーを押して答える。
正解なら次の問題に進み、不正解なら問題は変わらない。

10秒後、プレイヤーが答えるパートが終了する。
Enter キーを押すと、コンピュータが10秒間の足し算に挑戦するパートに移る。

さらに10秒後、コンピュータが答えるパートが終了する。
Enter キーを押すと、また最初 (プレイヤーが挑戦するパート) からできる。

プログラム

10 ' ケイサン バトル
20 CLS:?"VER()=";VER();:LOCATE6,4:?"アト    ビョウ";:LOCATE15,14:?"+    = ?";:M=0:Y=8:I=110
30 LOCATE11-4*M,Y:IFM?"コンピュータ";:ELSE?"アナタ";
40 S=0:T=0:LOCATE14,Y:?DEC$(S,9);
50 FORJ=1TO3:LOCATE15,16:?4-J;:WAIT60:NEXT:LOCATE15,16:?" ";:P=-1:CLT
60 C=RND(10)+1:A=RND(C+1):B=C-A:LOCATE12,14:?DEC$(A,2);:LOCATE17,14:?DEC$(B,2);
70 L=10-TICK()/60:IFL<>PLOCATE9,4:?DEC$(L,2);:P=L:IFL<=0GOTO140
80 GOSUBI:IFK<>CGOTO70
90 S=S+1:IFS>9999S=S-10000:T=T+1:LOCATE14,Y:?DEC$(T,5);
100 LOCATE19,Y:?DEC$(S+10000*(T>0),4);:GOTO60
110 K=INKEY():IF48<=KANDK<58K=K-48+10*(K=48)ELSEK=-1
120 RETURN
130 K=A+B:RETURN
140 LOCATE12,14:?"  ";:LOCATE17,14:?"  ";:IFMGOTO190
150 LOCATE3,18:?"オツカレサマ デシタ!";:LOCATE3,19:?"ツギ ハ コンピュータ ガ チョウセン シマス";
160 LOCATE3,20:?"Enter キー ヲ オシテ クダサイ":M=1:Y=10:I=130
170 K=INKEY():IFK<>10ANDK<>13WAIT1:GOTO170
180 FORJ=18TO20:LOCATE3,J:?DEC$(0,26);:LOCATE28,J:?" ";:NEXT:GOTO30
190 LOCATE3,18:?"オワリ!";:LOCATE3,20:?"Enter キー デ リトライ"
200 K=INKEY():IFK<>10ANDK<>13WAIT1:GOTO200
210 GOTO20

※ DEC$ を用いているため、IchigoJam BASIC 1.0.0 では動きません

このプログラムは、CC BY 4.0 でライセンスする。

実行結果例

MeganeJam (1.2.3)

コンピュータの記録は 247 回であった。

画像
MeganeJam での実行結果例

IchigoJam S (1.3.1)

コンピュータの記録は 370 回であった。

画像
IchigoJam S での実行結果例

IcigoJam Q (1.4.3)

コンピュータの記録は 371 回であった。

画像
IchigoJam Q での実行結果例

IcigoJam R (1.5b rv)

コンピュータの記録は 2112 回であった。

画像
IchigoJam R での実行結果例

IchigoJam P (1.6.0)

コンピュータの記録は 6365 回であった。

画像
IchigoJam P での実行結果例

解説

ポイント

プレイヤーの挑戦とコンピュータの挑戦でプログラムを共通にし、スコアを表示する位置と入力を受け取るサブルーチンのみ変数を用いて切り替えることで、不公平さを減らすことを試みた。
とはいえ、人間のプレイヤーは画面から数字を読み取り、答えをキーで入力しなければいけないのに対し、コンピュータは内部の変数から直接数字を読み取ることができ、答えも内部の変数に直接書き込める、という不公平さはある。

各変数の役割

  • A:足される数 (問題)

  • B:足す数 (問題)

  • C:問題の答え

  • S:正解した問題数の十進数で下位4桁

  • T:正解した問題数の上位

  • M:モード (プレイヤーが答えるか、コンピュータが答えるか)

  • Y:スコアを表示する縦位置

  • I:入力を受け取るサブルーチンの行番号

  • J:ループ変数

  • L:残り秒数

  • P:今画面に表示している残り秒数

  • K:入力されたキーまたは答え

プログラムの各部分の役割

  • 10~20行目:全体の初期化

    • 10行目:FILES 対応のタイトル

    • 20行目:画面の初期化・動きの無い部分の描画・プレイヤーの挑戦用の設定

  • 30~100行目:挑戦の処理

    • 30~50行目:挑戦開始時の描画・スコアおよび時間の初期化

    • 60行目:問題の生成と描画

    • 70行目:残り時間の描画と終了判定

    • 80行目:入力を受け取るサブルーチンの呼び出しと正解判定

    • 90~100行目:スコアの更新と描画

  • 110~130行目:入力を受け取るサブルーチン

    • 110~120行目:プレイヤーの入力を受け取るサブルーチン

    • 130行目:コンピュータが計算を行うサブルーチン

  • 140~210行目:挑戦終了時の処理

    • 140行目:問題の消去・挑戦者の種類による分岐

    • 150~160行目:プレイヤーの挑戦終了時のメッセージ表示・コンピュータの挑戦用の設定

    • 170行目:Enterキーが押されるのを待機

    • 180行目:メッセージの消去・挑戦に進む

    • 190行目:コンピュータの挑戦終了時のメッセージ表示

    • 200行目:Enterキーが押されるのを待機

    • 210行目:最初に戻る (リトライ)

おわりに

IchigoJamは本当に1秒間に5000万回計算できるのか!? 高専生向けマシン語入門スライド
では、IchigoJam BASIC (バージョン不明) の計算速度を「足し算1000回 1.8秒」(10秒に換算すると5,556回)「VIDEO0で表示を消してもせいぜい1秒に1000回」(10秒に換算すると10,000回) としている。

今回のプログラムでは、足し算をする時間だけでなく、問題の生成やスコアの更新などの処理も含めて10秒での挑戦となっているので、足し算だけを行ったときに比べて回数は少なくなると考えられる。

ちなみに、同ページでは「富岳」の計算速度を1秒間に100京回としている。
これは、本記事の冒頭で紹介した投稿の「1秒間に44京回以上」という主張と矛盾しない。

いいなと思ったら応援しよう!

コメント

ログイン または 会員登録 するとコメントできます。
IchigoJamでけいさんバトル|みけCAT
word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word word

mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1
mmMwWLliI0fiflO&1