* 初心者向けプログラミング体験ワークショップ#5
-(by [[K]], 2021.12.04)
** (0)
-今回紹介するのは、「タイピングゲーム」です。31行で書けます。
-このページは[[「初心者向けプログラミング体験ワークショップ」>a21_edu01]]の教材のうちの一つです。
** (1) ストーリー & ルール
-ぼくは今、学校で英語の勉強をしているのだけど、勉強のやりすぎで、夜空にアルファベットがあらわれて、それがゆっくりと降りてくる夢を見るようになりました。アルファベットの夜空はとてもきれいです。
-アルファベットが地面に落ちる前に、アルファベットの名前を呼ぶと(エーとかビーとか)、その文字は消えます。消えるところもきれいです。アルファベットがどれか一つでも地面に落ちると夢から覚めてしまうので、ぼくはできるだけ長くがんばってこのきれいな夢の世界で遊んでいたいです。
-それにこの夢を見るようになってからは、アルファベットをよく覚えられるようになった気がします。勉強になっているかもしれません。
----
|http://k.osask.jp/files/pic20211205a.png|
|こんなふうに、文字がゆっくりと上から落ちてきます。|
-画面上にアルファベットがでて、ゆっくり落ちてきます。キーを入力すると、もしその文字が画面上にあればその文字は消えて点数が10点ふえます。間違えると1点減ります。
-文字が画面の一番下まで落ちてしまったら終了です。
-終了したら Enter を押すことで再ゲームできます。
-いつでも ESCキー を押せばゲームは終了します。
-なお、HLXでは現在開いているゲームウィンドウよりも大きなウィンドウを開くことができません。ですから、たとえばもし「坂道を走ってきれいな石を拾い集めるゲーム」を遊んだ後にこれを実行しようとするとエラーになるはずです。その場合は、お手数ですがHLXを一度終了させて、もう一度HLXを起動して、それからtyping.txtやtyping.cをrunしてください。
** (2-1) HLX-BASICでのプログラム(31行)
-プログラム中に日本語で説明を書き込んでいますが、その部分は入力しないでください。矢印も入力しないでください。
CANVAS 32,24,"TYPING"; ← ゲーム画面を作ります。よこ32マス、たて24マスの大きさです。
INT AB[24], HI=0; ← AB[0]~AB[23]を用意して、HIを0にします。
FOR; ←再ゲームの時の繰り返し開始位置です。
SC=0; ← 点数を0にします。
ARYSET AB,0,24,0; ← AB[0]~AB[23]をすべて0にします。
CLS@ 0; ← 画面を黒(色番号0)で消します。
FOR T=0,999999; ← ゲーム内時間を数えながら繰り返し処理をします。ゲームのメインループです。
IF T%5==0 THEN ← もしTが5の倍数なら、
SCROLL@ 32,22,0,1,0,1,1; ← 画面上の文字をすべて1マスだけ下に移動させます。
ARYMOVE AB,1,0,23; ← AB[0]~AB[22]の値を、AB[1]~AB[24]に代入します(画面の移動に合わせています)。
AB[1]=RND(26)+65; ← AB[1]に65~90のどれかの値を入れます。これは「A」~「Z」の文字コードです。
PRINT@ RND(32),1,2,0,"%c",AB[1]; ← AB[1]の文字コードに対応する文字を画面の上部にも書きます。どこに書くかは乱数で決めます。色は(2,0)なので黒地に緑です。
FI;
PRINT@ 8,0,7,0,"SCORE:%05d HIGH:%05d ",SC,HI; ← 点数とハイスコアを表示します。
I=UPPER(INKEY@WR(100)); ← 100ミリ秒(0.1秒)待った後に入力状態を確認します。もし小文字が入力されていたら大文字に変換します。
IF I!=0 THEN ← もし何か押されていたら、
SC--; ← まずとにかく1点引きます。
FOR J=23,0,-1; ← AB[]を23番から順番に見ていきます(=下から見ていきます)。
IF AB[J]==I THEN ← もしAB[]の中に一致するものがあったら、
AB[J]=0; ← AB[]の中から消します。
SC+=11; ← 点数を11点加算します。
HI=MAX(HI,SC); ← SCとHIのうち、大きいほうをHIとします。
CHARBOX@ 32,1,0,J,0,0,0; ← 入力された文字を画面からも消します。どこに書いたか覚えていないので、横一線を全部消します。
BREAK; ← AB[]の中から入力文字を探す繰り返し処理を終了させます。
FI;
NEXT;
FI;
IF AB[23]!=0 BREAK; ← もし一番下までアルファベットが落ちてしまったら、ゲームオーバーなのでメインループから抜けます。
NEXT;
WAITKEY@ 10; ← Enterキーを押すまで待ちます(=押したら最初のFORに戻るので再ゲームです)。
NEXT;
-ほそく説明:
--PRINT@の中の%以降には、数字のゼロや小文字のc、dがあります。英語のオーではないので注意してくださいね。
--色番号の表
|0:黒|1:青|2:みどり|3:水色|4:赤|5:むらさき|6:黄色|7:白|
--色を2つの数字で表すときは、1つ目の数がキャラクターの色で、2つ目の数が背景の色です。
--キャラクターの表示位置は、2つの数字で表します。1つ目が左から数えて何番目のマスか(0番から数えます)、2つ目が上から数えて何番目のマスか(0番から数えます)。
---このゲームでは32x24マスを用意しているので、0,0~31,23までが使えます。
--キャラクター番号の表
|0:空白|1:四角|2:丸|3:バツ|4:よこぼう|5:たてぼう|6:顔マーク|7:ひしがた|8:ななめせん|9:ななめせん|
--RND(26)について: RNDは乱数(らんすう)の命令で、RND(26)は0~25までのどれかの数を適当に決める命令です。
** (2-2) HLX-BASICのプログラムを実行するための方法(大人の方へ)
-もしWindowsでHLX-BASICを使うなら、話は簡単です!
-[[a21_hlx003]]のページへ行って、 hlx003b.zip をダウンロードして、中にある hlx_x86_win.exe を入手してください。それだけあれば十分で他のファイルは捨ててしまってもかまいません。
-[[a21_hlx003]]のページへ行って、 hlx003c.zip をダウンロードして、中にある hlx_x86_win.exe を入手してください。それだけあれば十分で他のファイルは捨ててしまってもかまいません。
-このhlx_x86_win.exeを適当なフィルだ内において、同じフォルダの中にtyping.txtというテキストファイルを作ります。このテキストファイルをお子さんに入力させてあげてください。
--入力の際にはまずテキストエディタを開き(メモ帳でもいいですが、私はTeraPadが好きです)、キーボードのCapsLockをオンにした状態で、大人がテキストを一文字ずつ読んであげて、お子さんがキーを探して入力する、というスタイルがおすすめです。大人は1とI、0とOの入力間違いが起こりやすいので、特にそこを注意してみてあげます。
--キーを見つけられないときは、ほらここにあるよと教えてあげますが、それでもキーボードのキーを指さすだけにして、実際の入力はお子さんにやらせてあげてください。入力ミスがあった時の訂正も、「矢印キーを使ってカーソルをここに動かして、そこでDelキーを押して。」みたいに操作の指示はしても、実際の操作はお子さんにやらせてみてください。
--そうすると、「これは全部自分がやった。」という満足感が得られるはずです。
--(何回もやって慣れてきたら、自分でプログラムを読んで入力できるようになると思います。)
-入力が終わったら、先ほどのhlx_x86_win.exeを起動して、そこで
hlx>run typing.txt
-と入力してください。入力ミスがなければゲームが始まるはずです。
-ミスがあった場合は、エラーメッセージを見ながら間違いを探して直してください(エラーメッセージはかなり不親切なので、大人の方の手伝いが不可欠です。よろしくお願いします。お手数をおかけしてすみません)。
-なおゲーム中のキー操作は、ゲーム画面が入力アクティブになっていないと有効ではありませんので、あれ?操作が効かないなと思ったら、ゲーム画面が一番上のウィンドウになっているかどうかをまず確認してください。
-Windows以外のOSの方は、[[a21_hlx003]]のページを見て、ソースコードからhlxをビルドしなければいけません。そこがクリアできれば、あとは同じようにできるはずです。
** (2-3) 改造のポイント
-このゲームは自分で入力したのですから、自分で改造することだってできます。ただ遊ぶだけじゃなくて改造も楽しんでほしいです。
-まず IF T%5==0 THEN の数字を変えれば文字が落ちてくる速度は調整できます。
-でも遅くして1000点を取りたいんじゃない、早く落ちてきて、でも早く入力して、かっこよく1000点を取りたいんだ!って思うかもしれません。・・・なるほど。・・・では、AB[1]=RND(26)+65; の 26 を 5 とかに変えたらどうでしょうか。そうすると、A~Eしか出てこなくなります。これなら速くてもついていけますよね?
-それでも難しければ、3とかにして(つまり、A~Cだけにしたりして)、自分の希望をかなえてください。
** (3-1) C言語でのプログラム(aclライブラリ利用)(36行)
-内容的に、(2-1)とほぼ一対一で対応しているので、細かい説明は省略します。
#include <acl.c>
void aMain()
{
int i, j, t, sc, hi = 0, ab[24];
AWindow *w = aOpenWinEx(32, 24, "TYPING", 0);
for (;;) {
sc = 0;
aArySetInt(ab, 0, 24, 0);
aCls(w, 0);
for (t = 0;; t++) {
if (t % 5 == 0) {
aScroll(w, 32, 22, 0, 1, 0, 1, 1, 0, 0, 0);
aAryMovInt(ab, 1, 0, 23);
ab[1] = 'A' + aRnd(26);
aGrPrintf(w, aRnd(32), 1, 2, 0, "%c", ab[1]);
}
aGrPrintf(w, 8, 0, 7, 0, "SCORE:%05d HIGH:%05d ", sc, hi);
i = aUppercase(aInkey_waitR(w, 100));
if (i != 0) {
sc--;
for (j = 23; j >= 0; j--) {
if (ab[j] == i) {
ab[j] = 0;
aEchBox(w, 32, 1, 0, j, 0, 0, 0);
sc += 11;
hi = aMaxInt(hi, sc);
break;
}
}
}
if (ab[23] != 0) break;
}
aWaitKey(w, AKEY_ENTER);
}
}
** (3-2) C言語のプログラムを実行するための方法(大人の方へ)
-このプログラムは、C言語でありながらHLXのサポート範囲内の機能だけで書かれているので、HLXで実行することができます。この場合、C言語やaclライブラリのインストールは不要です(もしWindows以外で、まずhlx自身のビルドからやらなければいけない場合は、Cコンパイラやaclライブラリのインストールが必要です)。
-使い方もほとんど同じで、typing.cを作って、
hlx>run typing.c
-とするだけでOKです。
-もし、HLXを使わずに普通のCコンパイラとaclライブラリの組み合わせでやる場合は、[[a21_acl01]]のページを見てaclライブラリを使えるようにしたうえで、上記のtyping.cをビルドしてください。
-そのほかの操作方法や改造方法などは、(2-2)、(2-3)と同等なのでここでは省略します。
* こめんと欄
#comment