見出し画像

【IchigoJam】streak typing ~streakを繋げ!3~

頭が悪いので、今週も記事を書くのを怠ってしまった。
今回も IchigoJam 用の適当なプログラムを書いてごまかすぞ。

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

ルール

60秒間で「streak」といっぱいタイプし、streakを増やしていこう!
ただし、streakを増やすにあたってミスは厳禁!
ミスタイプをすると、streakがゼロに戻っちゃうよ!

操作方法

  • 各種キー:タイピング (ゲーム画面)

  • スペースキー:スタート (タイトル画面) / 再スタート (タイムアップ画面)

プログラム

10 ' streak typing
20 LET[0],#73,#74,#72,#65,#61,#6B
30 CLS:LOCATE9,7:?"streak typing":LOCATE6,15:?"Press SPACE to start"
40 IF INKEY()<>32 WAIT1:GOTO40
50 CLS:?"Current streak    0":?"Longest streak    0":C=0:M=0:S=0:P=-1:T=60:LOCATE13,11:?"streak"
60 LOCATE1,23:FORI=1TO30:?CHR$(#8F);:NEXT:CLT
70 K=INKEY()*(P<0):IF K=0 WAIT1:GOTO110
80 IF K|#20=[S] LOCATE13+S,11:?" ":S=S+1 ELSE LOCATE13+S,12:?CHR$(K):P=TICK()+60
90 IF S=6 C=C+1:S=0:LOCATE14,0:?DEC$(C,5):LOCATE13,11:?"streak"
100 IF C>M M=C:LOCATE14,1:?DEC$(M,5)
110 IF P>=0 AND TICK()>=P C=0:LOCATE14,0:?DEC$(C,5):LOCATE13+S,12:?" ":S=0:LOCATE13,11:?"streak":P=-1
120 U=60-TICK()/60
130 IF U<T T=T-1:LOCATE1+T/2,23:?CHR$(#80+T%2*#5);
140 IF U>0 GOTO 70
150 LOCATE12,7:?"TIME UP!":LOCATE6,15:?"Press SPACE to retry"
160 IF INKEY()<>32 GOTO160 ELSE GOTO50

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

OneFiveCrowd で実行する (非公式、高速、推奨)
IchigoJam web で実行する (公式、低速)

実行結果例

タイトル画面。
このプログラムを起動すると、まずこの画面になる。

タイトル画面

ゲーム画面。
真ん中に打ち込むべき文字列が表示されており、この文字列の左端の文字が次にタイプするべき文字である。
上にはスコアが表示されている。「Current streak」が現在何連続でミスなく「streak」を打ち込んだからであり、「Longest streak」はこのゲーム中における Current streak の最大値である。
(ゲームを越えて保持される「ハイスコア」は実装していない)
下には制限時間を表すバーが表示されている。これが段々短くなっていき、無くなったらゲーム終了である。

ゲーム画面

ゲーム画面でミスタイプをしたときの様子。
真ん中の文字列の左端の文字の下に、間違って入力した文字が表示されている。
なお、入力の大文字と小文字は区別しないので、たとえば「r」を入力するべきときに「R」を入力するのは正解扱いになる。
このあと、Current streak は 0 になり、入力するべき文字列は「streak」に戻る。

ゲーム画面 (ミスタイプ)

タイムアップ画面。
メッセージが表示され、ゲームが停止している。
スペースキーを押すと、スコアや文字列をリセットし、新しいゲームを開始する。

タイムアップ画面

解説

プログラムは、以下の構成になっている。

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

  • 20行目:打ち込んでもらう文字列「streak」のデータ

  • 30~40行目:タイトル画面

    • 30行目:タイトル画面の描画

    • 40行目:スペースキーが押されるまで待機する

  • 50~140行目:ゲーム画面

    • 50行目:初期状態の描画と、変数の初期化

    • 60行目:残り時間バーの初期状態の描画

    • 70~100行目:キー入力の受け付け

      • 70行目:キー入力を読み取り、押されていないか硬直中であればこの後の処理を飛ばす

      • 80行目:押されたキーの処理を行う

        • 押されたキーが正解の場合、対応する文字を画面から消し、状態を進める

        • 押されたキーが不正解の場合、押されたキーを表示し、硬直を開始する

      • 90行目:「streak」を1個打ち終えた際の処理 (Current streak の加算、状態のリセット) を行う

      • 100行目:Curren streak が Longest streak を上回ったら、Longest Streak を更新する

    • 110行目:硬直中、硬直終了時刻になったら、状態をリセットして硬直を解除する

    • 120行目:時刻から残り時間を求める

    • 130行目:残り時間が減っていれば、それに描画を追従させる

    • 140行目:残り時間が1秒以上あれば、ゲームの処理を繰り返す

  • 150~160行目:タイムアップ画面

    • 150行目:タイムアップ画面の描画 (ゲーム画面に追加する)

    • 160行目:スペースキーが押されるまで待機する

以下の変数を用いている。

  • C:Current streak

  • M:Longest streak

  • S:次に打つべきなのが何文字目か

  • P:ミスタイプ時の硬直終了時刻

  • T:残り時間として表示している時間 (秒)

  • I:ループ変数

  • K:入力されたキーコード

  • U:残り時間 (秒)

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