* 初心者向けプログラミング体験ワークショップ#4
-(by [[K]], 2021.12.03)
** (0)
-今回紹介するのは、「ジャンプ・ゲーム」です。29行で書けます。
-このページは[[「初心者向けプログラミング体験ワークショップ」>a21_edu01]]の教材のうちの一つです。
** (1) ストーリー & ルール
-今日ぼくはおじさんのうちにあそびにいきます。おじさんはいつもおもしろい話をしてくれるのでとてもたのしみです。
-おじさんはとてもふるいアパートに住んでいます。あまりにも古すぎてろうかに穴があいているところがあるくらいです。
-それにおじさんのアパートはクモのすがあったり、ネズミがでたりといやなものもたくさんあります。でもたまに百円がおちていたりもするので、ちょっと楽しくなる時もあります。
-あ!そうだ、今日はだいすきなアニメの日だった!・・・うわー、じゃあ急いでおじさんのうちに行って見せてもらうことにしよう。
----
|http://k.osask.jp/files/pic20211203d.png|
|こんなゲームです|
-黄色の顔が「ぼく」です。スタートは1階で、おじさんのへやは4階の右はしにあります。
-1階の右はしに行けば2階の左はしに行けます。2階の右はしに行けば3階の左はしに行けます。3階の右はしに行けば4階の左はしに行けます。
-白丸はいい匂いのするお花や、100円玉などの、元気をくれるものです。赤いバツはクモの巣やネズミなどの、元気がなくなるものです。
-元気が0になってしまったらゲームオーバーです。テレビの時間に間に合わせようとしているので基本的に「ぼく」は常に走っています。そのため何もしなくても徐々に元気がなくなっていきます。
-操作はスペースキーしか使いません。スペースキーを押せばジャンプします。ジャンプ中もスペースキーを連打すると、大きなジャンプができます。少ししか押さなければ小さなジャンプになります。ジャンプをうまく使い分けて、うまく進んでください。
-床があちこちで抜けています。そこはタイミングよく飛び越すしかありません。たとえそのせいで赤いバツを取らされるとしても、それはがまんするしかありません。そういう配置になることもたまにあります。
-ゲームオーバーもしくはゲームクリア―の画面では、Enterを押せば再ゲームです。
-ゲームをやめたくなったら、いつでも ESCキー を押せば終了できます。
-なお、HLXでは現在開いているゲームウィンドウよりも大きなウィンドウを開くことができません。ですから、たとえばもし「坂道を走ってきれいな石を拾い集めるゲーム」を遊んだ後にこれを実行しようとするとエラーになるはずです。その場合は、お手数ですがHLXを一度終了させて、もう一度HLXを起動して、それからjump.txtやjump.cをrunしてください。
** (2-1) HLX-BASICでのプログラム(29行)
-プログラム中に日本語で説明を書き込んでいますが、その部分は入力しないでください。矢印も入力しないでください。
CANVAS 32,24,"JUMP"; ← ゲーム画面を作ります。よこ32マス、たて24マスの大きさです。
HI=1000; ← ハイスコアを0に設定します。
FOR; ← 再ゲームの時はここから始まります。
CLS@ 0; ← 画面を消去して真っ黒(色番号0)にします。
FOR I=0,5; CHARBOX@ 32,1,0,I*5+2,1,3,0; NEXT; ← 画面に水色の横線を5本引きます。
LOOP 10; CHARBOX@ 2,1,RND(5)*5+6,RND(3)*5+7,0,0,0; NEXT; ← 床に10個の穴をあけています。
LOOP 16; CHAR@ RND(26)+4,RND(19)+3,3,4,0; NEXT; ← 画面に16個の赤いバツをかいています(キャラクター番号3、色番号(4,0))。
LOOP 16; CHAR@ RND(26)+4,RND(19)+3,2,7,0; NEXT; ← 画面に16個の白い丸をかいています(キャラクター番号2、色番号(7,0))。
GE=1000; X=0; Y=21; J=0; ← 最初の元気の値、スタート地点、ジャンプ中かどうかの変数=0 を設定しています。
FOR; ← ここから繰り返し(ゲームのメインループです)。
PRINT@ 0,0,7,0,"GENKI:%5d HIGH:%5d",GE,HI; ← 点数を表示します。
CHAR@ X,Y,6,6,0; ← 「ぼく」を表示します。場所は(X,Y)で、キャラクター番号は6で、色番号は(6,0)です。
IF GE<=0 THEN CHAR@ X,Y,6,5,0; BREAK; FI; ← もし元気が0かマイナスになってしまったら、「ぼく」の色をむらさきで書き直して、メインループを抜けます。
IF Y<=6 AND X==31 THEN PRINT@ 23,0,0,2," << CLEAR !! >> "; BREAK; FI; ← もし4階の右はじに着いたら「クリア!」と表示して、メインループを抜けます。
I=INKEY@WRC(200); ← 200ミリ秒(0.2秒)待ってからキー入力状態をチェックします。
CHAR@ X,Y,0,0,0; ← 画面上から「ぼく」を消します(移動するからです)。
IF I!=32 OR Y%5==3 THEN J=0; FI; ← もしスペースキーを連打していないか、もしくは各階の天井に頭が付いたら、J=0にします。
IF I==32 AND GETCH@(X,Y+1)==1 THEN J=1; FI; ← もしスぺスキーを押していて、かつ、足元が床だったら、J=1にします。
X++; ← 「ぼく」を1マスだけ右に進めます。
IF X==32 THEN X=0; Y-=5; FI; ← もしも「ぼく」が右はしに着いたら、1つ上の階の左はしに移動させます。
Y-=J; ← J=1なら、「ぼく」を1マスだけ上に移動させます。
IF J==0 AND GETCH@(X,Y+1)!=1 THEN Y++; FI; ← もしジャンプ中ではなくて、足元が床ではなかったら、「ぼく」を1マスだけ下に移動させます。
GE--; ← 元気の値を1減らします。
IF GETCH@(X,Y)==3 THEN GE=MAX(GE-400,0); FI; ← もし赤いバツを取ったら、元気を400引きます。そして0よりも小さくなってしまったら0にします。
IF GETCH@(X,Y)==2 THEN GE+=200; FI; ← もし白い丸をとったら、元気に200を足します。
NEXT; ← ゲームのメインループ開始位置のFORのところに戻ります。
HI=MAX(HI,GE); ← HIと元気値を比べて、大きいほうをHIとします。
WAITKEY@ 10; ← Enetrが押されるまで待ちます。
NEXT; ← 上から3行目の再ゲーム開始用のFORのところに戻ります。
-ほそく説明:
--PRINT@の中の%以降には、数字のゼロや小文字の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(5)について: RNDは乱数(らんすう)の命令で、RND(5)は0~4までのどれかの数を適当に決める命令です。
** (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を適当なフィルだ内において、同じフォルダの中にjump.txtというテキストファイルを作ります。このテキストファイルをお子さんに入力させてあげてください。
--入力の際にはまずテキストエディタを開き(メモ帳でもいいですが、私はTeraPadが好きです)、キーボードのCapsLockをオンにした状態で、大人がテキストを一文字ずつ読んであげて、お子さんがキーを探して入力する、というスタイルがおすすめです。大人は1とI、0とOの入力間違いが起こりやすいので、特にそこを注意してみてあげます。
--キーを見つけられないときは、ほらここにあるよと教えてあげますが、それでもキーボードのキーを指さすだけにして、実際の入力はお子さんにやらせてあげてください。入力ミスがあった時の訂正も、「矢印キーを使ってカーソルをここに動かして、そこでDelキーを押して。」みたいに操作の指示はしても、実際の操作はお子さんにやらせてみてください。
--そうすると、「これは全部自分がやった。」という満足感が得られるはずです。
--(何回もやって慣れてきたら、自分でプログラムを読んで入力できるようになると思います。)
-入力が終わったら、先ほどのhlx_x86_win.exeを起動して、そこで
hlx>run jump.txt
-と入力してください。入力ミスがなければゲームが始まるはずです。
-ミスがあった場合は、エラーメッセージを見ながら間違いを探して直してください(エラーメッセージはかなり不親切なので、大人の方の手伝いが不可欠です。よろしくお願いします。お手数をおかけしてすみません)。
-なおゲーム中のキー操作は、ゲーム画面が入力アクティブになっていないと有効ではありませんので、あれ?操作が効かないなと思ったら、ゲーム画面が一番上のウィンドウになっているかどうかをまず確認してください。
-Windows以外のOSの方は、[[a21_hlx003]]のページを見て、ソースコードからhlxをビルドしなければいけません。そこがクリアできれば、あとは同じようにできるはずです。
** (2-3) 改造のポイント
-このゲームは自分で入力したのですから、自分で改造することだってできます。ただ遊ぶだけじゃなくて改造も楽しんでほしいです。
-もし簡単すぎると思ったら、床の穴の数や、赤いバツの数、白い丸の数を変えてみてはどうでしょうか。また最初の元気の値も1000ではなくて、700とか500とかにしたらいいかもしれません。
-また丸をとった時やバツをとった時の元気の増減の量を調整してもいいかもしれません。
-難しすぎる場合も結局改造するところは同じですね。数字を増やすか減らすかの違いです。
-色やキャラクターを変更するのも楽しいかもしれません。背景色とかも調整すれば、もっとアパートっぽくできるかもしれないです。
** (3-1) C言語でのプログラム(aclライブラリ利用)(33行)
-内容的に、(2-1)とほぼ一対一で対応しているので、細かい説明は省略します。
#include <acl.c>
void aMain()
{
int i, j, ge, hi = 1000, x, y;
AWindow *w = aOpenWinEx(32, 24, "JUMP", 0);
for (;;) {
aCls(w, 0);
for (i = 0; i < 5; i++) aEchBox(w, 32, 1, 0, i * 5 + 2, 1, 3, 0);
for (i = 0; i < 10; i++) aEchBox(w, 2, 1, aRnd(5) * 5 + 6, aRnd(3) * 5 + 7, 0, 0, 0);
for (i = 0; i < 16; i++) aEch(w, aRnd(26) + 4, aRnd(19) + 3, 3, 4, 0);
for (i = 0; i < 16; i++) aEch(w, aRnd(26) + 4, aRnd(19) + 3, 2, 7, 0);
ge = 1000; x = 0; y = 21; j = 0;
for (;;) {
aGrPrintf(w, 0, 0, 7, 0, "GENKI:%5d HIGH:%5d", ge, hi);
aEch(w, x, y, 6, 6, 0);
if (ge <= 0) { aEch(w, x, y, 6, 5, 0); break; }
if (y <= 6 && x == 31) { aGrPrintf(w, 23, 0, 0, 2, " << CLEAR !! >> "); break; }
i = aInkey_waitRC(w, 200);
aEch(w, x, y, 0, 0, 0);
if (i != 32 || y % 5 == 3) j = 0;
if (i == 32 && aGetEch(w, x, y + 1) == 1) j = 1;
x++; if (x == 32) { x = 0; y -= 5; }
y -= j;
if (j == 0 && aGetEch(w, x, y + 1) != 1) y++;
ge--;
if (aGetEch(w, x, y) == 3) ge = aSaturateInt(ge - 400, 0, ge);
if (aGetEch(w, x, y) == 2) ge += 200;
}
hi = aMaxInt(hi, ge);
aWaitKey(w, AKEY_ENTER);
}
}
** (3-2) C言語のプログラムを実行するための方法(大人の方へ)
-このプログラムは、C言語でありながらHLXのサポート範囲内の機能だけで書かれているので、HLXで実行することができます。この場合、C言語やaclライブラリのインストールは不要です(もしWindows以外で、まずhlx自身のビルドからやらなければいけない場合は、Cコンパイラやaclライブラリのインストールが必要です)。
-使い方もほとんど同じで、jump.cを作って、
hlx>run jump.c
-とするだけでOKです。
-もし、HLXを使わずに普通のCコンパイラとaclライブラリの組み合わせでやる場合は、[[a21_acl01]]のページを見てaclライブラリを使えるようにしたうえで、上記のjump.cをビルドしてください。
-そのほかの操作方法や改造方法などは、(2-2)、(2-3)と同等なのでここでは省略します。
* こめんと欄
#comment