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;
IF T%2==0 THEN
FOR I=1,4;
X=BX; Y=BY;
IF I==1 OR I==3 THEN X+=VX; FI;
IF I==2 OR I==3 THEN Y+=VY; FI;
IF GETCH@(X,Y)!=0 THEN
IF X!=BX THEN VX= -VX; FI;
IF Y!=BY THEN VY= -VY; FI;
IF GETCHCOL@(X,Y)!=0XFFFFFF THEN
SC+=10-Y; BL--;
CHAR@ X,Y,0,0,0;
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);
PRINT@ 8,0,7,0,"SCORE:%05d HIGH:%05d",SC,HI;
IF BY==23 GOTO OVER;
IF BL==0 BREAK;
I=INKEY@WRC(50);
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;
NEXT;
OVER:
WAITKEY@ 10;
NEXT;
| 0:黒 | 1:青 | 2:みどり | 3:水色 | 4:赤 | 5:むらさき | 6:黄色 | 7:白 |
| 0:空白 | 1:四角 | 2:丸 | 3:バツ | 4:よこぼう | 5:たてぼう | 6:顔マーク | 7:ひしがた | 8:ななめせん | 9:ななめせん |
hlx>run blocks.txt
#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 | |