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;
| 0:黒 | 1:青 | 2:みどり | 3:水色 | 4:赤 | 5:むらさき | 6:黄色 | 7:白 |
| 0:空白 | 1:四角 | 2:丸 | 3:バツ | 4:よこぼう | 5:たてぼう | 6:顔マーク | 7:ひしがた | 8:ななめせん | 9:ななめせん |
hlx>run blocks.txt
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;
#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);
}
}
hlx>run blocks.c
| コメント | お名前 | NameLink | |