* 初心者向けプログラミング体験ワークショップ#7
-(by [[K]], 2021.12.08)
** (0)
-今回紹介するのは、「ブロックくずし」です。44行で書けます。
-このページは[[「初心者向けプログラミング体験ワークショップ」>a21_edu01]]の教材のうちの一つです。
** (1) ストーリー & ルール
-みなさんは、ブロックくずしというゲームを知っていますか?画面の中にブロックがあって、ボールを当てるとブロックがこわれて消えるのです。ボールを下に落としてしまうとそれでゲームが終わってしまうので、ボールを落とさないようにしなければいけません。古くから人気のあるゲームです。
-でもなぜボールを使ってブロックをこわすことになったのか、そのストーリーはわかりません・・・。
----
| http://k.osask.jp/files/pic20211209a.png |
|ゲーム開始直後に、カーソルの左を一度だけ押すと、動かなくても150点取れます。そこからは自分でがんばりましょう!|
-自分はカーソルキーの上下左右でぼうを動かします。ボールが下に落ちないようにしてください。ブロックをこわすと点がもらえます。下のブロックよりも上のブロックのほうが点数は高いです。
-ゲームオーバーになった時の再ゲームは Enterキー です。
-ゲームをやめたくなったら、いつでも ESCキー を押せば終了できます。
-なお、HLXでは現在開いているゲームウィンドウよりも大きなウィンドウを開くことができません。ですから、たとえばもし「坂道を走ってきれいな石を拾い集めるゲーム」を遊んだ後にこれを実行しようとするとエラーになるはずです。その場合は、お手数ですがHLXを一度終了させて、もう一度HLXを起動して、それからblocks.txtやblocks.cをrunしてください。
** (2-1) HLX-BASICでのプログラム(44行)
-プログラム中に日本語で説明を書き込んでいますが、その部分は入力しないでください。矢印も入力しないでください。
CANVAS 32,24,"BLOCKS"; ← ゲーム画面を作ります。よこ32マス、たて24マスの大きさです。
CHARBOX@ 32,23,0,1,1,7,0; ← よこ32マス、たて23マスの白い四角をかきます(つまりかべをかいています)。
HI=0; ← ハイスコアを0点にします。
FOR; ← ゲームオーバーになって再ゲームの時にはここから繰り返しになります。
SC=0; PL=6; ← 点数を0点に設定して、自分のぼうの長さを6にしています。
FOR; ← ブロックを全部消したときはここからの繰り返しになります。
CHARBOX@ 30,22,1,2,0,0,0; ← よこ30マス、たて22マスの黒い(色番号(0,0))四角をかきます。
FOR Y=4,10; CHARBOX@ 30,1,1,Y,1,10-Y,0; NEXT; ← 色を変えながら6本のブロック列をかきます。
BL=180; PX=13; PY=22; BX=20; BY=21; VX=1; VY= -1; ← 画面上に残っているブロック数、自分のぼうの位置、ボールの最初の位置、ボールの最初の向きを設定しています。記号が連続するとうまく実行できないので、イコールとマイナスの間にはスペースを入れてください。
FOR T=0,999999; ← ゲームのメインループで、ゲーム内時間を数えるところ。
CHARBOX@ PL,1,PX,PY,1,7,0; ← 自分のぼうを画面にかきます(よこPL、たて1の四角を場所(PX,PY)にキャラクター番号1、色(7,0)でかく)。
IF T%2==0 THEN ← もしゲーム内時間が2で割り切れたら、ボールを動かす。
FOR I=1,4; ← I=1,2,3で繰り返す。
X=BX; Y=BY; ← ここから3行で、I=1のときは、(X,Y)=(BX+VX,BY)になる。I=2のときは(X,Y)=(BX,BY+VY)になる。
IF I==1 OR I==3 THEN X+=VX; FI; ← I=3のときは、(X,Y)=(BX+VX,BY+VY)になる。これらはボールの処理をするときに進行方向とその周りの3マスを見なければいけないことに対応している。
IF I==2 OR I==3 THEN Y+=VY; FI;
IF GETCH@(X,Y)!=0 THEN ← もし(X,Y)が空白ではなかったら、
IF X!=BX THEN VX= -VX; FI; ← ボールの向きを変更。
IF Y!=BY THEN VY= -VY; FI;
IF GETCHCOL@(X,Y)!=0XFFFFFF THEN ← もし(X,Y)の色が白ではなかったら、
SC+=10-Y; BL--; ← Yの値に応じて(=ブロックの高さに応じて)得点を加算。残りのブロック数を1減らす。
CHAR@ X,Y,0,0,0; ← (X,Y)のブロックを消す。
FI;
FI;
NEXT;
IF GETCH@(BX+VX,BY+VY)==0 THEN BX+=VX; BY+=VY; FI; ← ボールの進行方向が空白なら、その方向に進める。
FI;
CHAR@ BX,BY,2,7,0; ← ボールを画面にかく。
HI=MAX(HI,SC); ← HIとSCの大きいほうをHIに。
PRINT@ 8,0,7,0,"SCORE:%05d HIGH:%05d",SC,HI; ← 画面にSCとHIを書く。
IF BY==23 GOTO OVER; ← もしボールが下に落ちたらゲームオーバー処理へ。
IF BL==0 BREAK; ← もしブロックを全部消したらメインループを抜ける。
I=INKEY@WRC(50); ← 50ミリ秒(つまり0.05秒)待って、キーの入力状態を調べる。
CHARBOX@ PL,1,PX,PY,0,0,0; ← 自分のぼうを画面から消す。
X=PX+XMOVE(I); ← キー入力通りに動かしたらぼうがどこへ移動するかを計算。
Y=PY+YMOVE(I);
IF Y<=23 AND GETCHBOX@(PL,1,X,Y)==0 THEN PX=X; PY=Y; FI; ← ぼうが画面内で、かつ、移動先が空白なら、仮計算した場所に移動させる。
CHAR@ BX,BY,0,0,0; ← ボールを消す。
NEXT;
WAIT 3000; ← (ブロックを全部消したら、ここにくる。)3000ミリ秒(=3秒)待つ。
NEXT;
OVER:
WAITKEY@ 10; ← (ゲームオーバーになったらここにくる。)Enterキーが押されるのを待つ。
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(6)について: RNDは乱数(らんすう)の命令で、RND(6)は0~5までのどれかの数を適当に決める命令です。
** (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を適当なフィルだ内において、同じフォルダの中にblocks.txtというテキストファイルを作ります。このテキストファイルをお子さんに入力させてあげてください。
--入力の際にはまずテキストエディタを開き(メモ帳でもいいですが、私はTeraPadが好きです)、キーボードのCapsLockをオンにした状態で、大人がテキストを一文字ずつ読んであげて、お子さんがキーを探して入力する、というスタイルがおすすめです。大人は1とI、0とOの入力間違いが起こりやすいので、特にそこを注意してみてあげます。
--キーを見つけられないときは、ほらここにあるよと教えてあげますが、それでもキーボードのキーを指さすだけにして、実際の入力はお子さんにやらせてあげてください。入力ミスがあった時の訂正も、「矢印キーを使ってカーソルをここに動かして、そこでDelキーを押して。」みたいに操作の指示はしても、実際の操作はお子さんにやらせてみてください。
--そうすると、「これは全部自分がやった。」という満足感が得られるはずです。
--(何回もやって慣れてきたら、自分でプログラムを読んで入力できるようになると思います。)
-入力が終わったら、先ほどのhlx_x86_win.exeを起動して、そこで
hlx>run blocks.txt
-と入力してください。入力ミスがなければゲームが始まるはずです。
-ミスがあった場合は、エラーメッセージを見ながら間違いを探して直してください(エラーメッセージはかなり不親切なので、大人の方の手伝いが不可欠です。よろしくお願いします。お手数をおかけしてすみません)。
-なおゲーム中のキー操作は、ゲーム画面が入力アクティブになっていないと有効ではありませんので、あれ?操作が効かないなと思ったら、ゲーム画面が一番上のウィンドウになっているかどうかをまず確認してください。
-Windows以外のOSの方は、[[a21_hlx003]]のページを見て、ソースコードからhlxをビルドしなければいけません。そこがクリアできれば、あとは同じようにできるはずです。
** (2-3) 改造のポイント
-このゲームは自分で入力したのですから、自分で改造することだってできます。ただ遊ぶだけじゃなくて改造も楽しんでほしいです。
-まずこのゲームが簡単すぎるという人は少ないでしょう。だからもっと簡単にする方法だけを説明することにします。
-「IF T%2==0 THEN」の2を、3とか4とかに変えれば、ボールが1マス動く間にぼうが3マスや4マス動けるようになるので、だいぶ楽になるでしょう。これでクリアできるようになると思います。
-そのほかの改造としては、「PL=6;」のところを「PL=9;」とかにしたらいいかもしれません。ぼうの長さが長くなります。
-もっと大規模な改造としては、「ボールは白い壁には跳ね返るけど、色のブロックでは跳ね返らないで全部壊してしまう」というルールに変更することもできます。これはブロックがどんどん壊れるのでちょっと面白いです。この改造をする場合は、「IF GETCH@(X,Y)!=0 THEN」からの8行を以下の記述に書き換えます。
IF GETCH@(X,Y)!=0 THEN
IF GETCHCOL@(X,Y)==0XFFFFFF THEN
IF I==1 OR I==3 THEN VX= -VX; FI;
IF I==2 OR I==3 THEN VY= -VY; FI;
ELSE
SC+=10-Y; BL--;
CHAR@ X,Y,0,0,0;
FI;
FI;
** (3-1) C言語でのプログラム(aclライブラリ利用)(49行)
-内容的に、(2-1)とほぼ一対一で対応しているので、細かい説明は省略します。
#include <acl.c>
void aMain()
{
int x, y, i, t, px, py, pl, bx, by, vx, vy, bl, sc, hi = 0;
AWindow *w = aOpenWinEx(32, 24, "BLOCKS", 0);
aEchBox(w, 32, 23, 0, 1, 1, 7, 0);
for (;;) {
sc = 0; pl = 6;
for (;;) {
aEchBox(w, 30, 22, 1, 2, 0, 0, 0);
for (y = 4; y < 10; y++) aEchBox(w, 30, 1, 1, y, 1, 10 - y, 0);
bl = 180; px = 13; py = 22; bx = 20; by = 21; vx = +1; vy = -1;
for (t = 0;; t++) {
aEchBox(w, pl, 1, px, py, 1, 7, 0);
if (t % 2 == 0) {
for (i = 1; i <= 3; i++) {
x = bx; y = by;
if (i == 1 || i == 3) { x += vx; }
if (i == 2 || i == 3) { y += vy; }
if (aGetEch(w, x, y) != 0) {
if (aGetEchCol(w, x, y) != 0xffffff) {
sc += 10 - y; bl--;
aEch(w, x, y, 0, 0, 0);
}
if (x != bx) vx = - vx;
if (y != by) vy = - vy;
}
}
if (aGetEch(w, bx + vx, by + vy) == 0) { bx += vx; by += vy; }
}
aEch(w, bx, by, 2, 7, 0);
hi = aMaxInt(hi, sc);
aGrPrintf(w, 8, 0, 7, 0, "Score:%05d High:%05d", sc, hi);
if (by == 23) goto over;
if (bl == 0) break;
i = aInkey_waitRC(w, 50);
aEchBox(w, pl, 1, px, py, 0, 0, 0);
x = px + aMoveDx(i);
y = py + aMoveDy(i);
if (y <= 23 && aGetEchBox(w, pl, 1, x, y) == 0) { px = x; py = y; }
aEch(w, bx, by, 0, 0, 0);
}
aWait(3000);
}
over:
aWaitKey(w, AKEY_ENTER);
}
}
** (3-2) C言語のプログラムを実行するための方法(大人の方へ)
-このプログラムは、C言語でありながらHLXのサポート範囲内の機能だけで書かれているので、HLXで実行することができます。この場合、C言語やaclライブラリのインストールは不要です(もしWindows以外で、まずhlx自身のビルドからやらなければいけない場合は、Cコンパイラやaclライブラリのインストールが必要です)。
-使い方もほとんど同じで、blocks.cを作って、
hlx>run blocks.c
-とするだけでOKです。
-もし、HLXを使わずに普通のCコンパイラとaclライブラリの組み合わせでやる場合は、[[a21_acl01]]のページを見てaclライブラリを使えるようにしたうえで、上記のblocks.cをビルドしてください。
-そのほかの操作方法や改造方法などは、(2-2)、(2-3)と同等なのでここでは省略します。
* こめんと欄
#comment