CANVAS 40,30,"ROCKET"; ← ゲーム画面を作ります。よこ40マス、たて30マスの大きさです。
HI=1; ← ハイスコアを1に設定します。
FOR; ← ここから繰り返します(ゲームオーバーの再ゲームの時にここに戻ってきます)。
FOR ST=1,9999; ← ここから繰り返します(ステージクリアの後の次ステージ開始時にここに戻ってきます)。
HI=MAX(HI,ST); ← HIとSTの大きいほうをHIとします。
CLS@ 0; ← 画面を黒(色番号0)で消します。
PRINT@ 0,0,7,0,"STAGE:%2d HIGH:%2d",ST,HI; ← 画面の上のほう(場所(0,0))に白色(色番号(7,0))で現在のステージとハイスコアを書きます。
LOOP 21; ← 以下を21回の繰り返しますです。
R=ST*3; ← 半径はステージ数の3倍。
X=RND(620-R); ← 円が620ピクセルよりも右に行かないように、中心を決定(乱数を使っています)。
Y=RND(460-R)+20+R; ← 円が20ピクセルよりも下になるように、中心を決定(乱数を使っています)。
FILLOVALCENTER@@ RF,X,Y,R,R,RND(6)+1; ← 場所(X,Y)を中心に半径Rの円を描きます。色は1~6のどれかです。
NEXT;
FILLRECT@@ RF,80,40,280,228,7; ← 横80ピクセル縦40ピクセルの長方形を、場所(280,228)に描きます。
X=630; Y=470; VX=0; VY= -20; ← ロケットの初期位置と、初期速度を設定します。
FOR; ← ゲームのメインループです。
C=GETPIX@@(RF,X,Y); ← ロケットの場所のピクセルの色を調べます。
CHARSAVE@@ RF,X-8,Y-8,7,15,-1; ← ロケットをかきます。場所は(X-8,Y-8)で、キャラクター番号は7番、色は(15,-1)です。
IF C==0XFFFFFF BREAK; ← もしCが白色なら、メインループを抜けます(ステージクリア)。
IF Y<16 OR 479<Y OR C!=0 GOTO CRASH; ← ロケットが上に行きすぎたか、もしくは下に行きすぎたか、もしくはCが黒以外なら、ゲームオーバー処理(CRASH)へ。
I=INKEY@WRC(200); ← 200ミリ秒(つまり0.2秒)待って、キー入力を確認して、先ほどかいたロケットを消します。
IF I==32 THEN VY-=9; FI; ← もしスペースキーを押していたら、VYから9を引きます。
VX+=XMOVE(I); VY++; ← VXの値を、キー入力に応じて増やしたり減らしたりします。
X=(X+VX+640)%640; Y+=VY; ← XにVXを足します。そして右はしにいったら左はしに、左はしにいったら右はしに移動させます。YにVYを足します。
NEXT;
PRINT@ 18,15,0,7," CLEAR!"; ← (ステージクリアなので)「CLEAR!」と表示します。
WAIT 3000; ← 3000ミリ秒(つまり3秒)待ちます。
NEXT; ← STに1を足して、次のステージへ。
CRASH:
Y=MINMAX(Y,16,479); ← Yが画面外なら画面内に収まるように修正します。
FOR I=0,3; R=I*5+10; DRAWOVALCENTER@@ RF,X,Y,R,R,4; NEXT; ← 赤い丸を半径を広げながら3つかいています。
PRINT@ 18,15,4,7," CRASH!"; ← 「CRASH!」と表示します。
WAITKEY@ 10; ← Enterキー が押されるまで待ちます。
NEXT;
| 0:黒 | 1:青 | 2:みどり | 3:水色 | 4:赤 | 5:むらさき | 6:黄色 | 7:白 |
| 0:空白 | 1:四角 | 2:丸 | 3:バツ | 4:よこぼう | 5:たてぼう | 6:顔マーク | 7:ひしがた | 8:ななめせん | 9:ななめせん |
hlx>run rocket.txt
#include <acl.c>
void aMain()
{
int hi = 1, st, x, y, vx, vy, r, i, c;
AWindow *w = aOpenWinEx(40, 30, "ROCKET", 0);
for (;;) {
for (st = 1;; st++) {
hi = aMaxInt(hi, st);
aCls(w, 0);
aGrPrintf(w, 0, 0, 7, 0, "STAGE:%2d HIGH:%2d", st, hi);
for (i = 0; i < 21; i++) {
r = st * 3;
x = aRnd(620 - r);
y = aRnd(460 - r) + 20 + r;
aFillOvalCentOpt(w, AOPT_Rf, x, y, r, r, aRnd(6) + 1);
}
aFillRectOpt(w, AOPT_Rf, 80, 40, 280, 228, 7);
x = 630; y = 470; vx = 0; vy = -20;
for (;;) {
c = aGetPixOpt(w, AOPT_Rf, x, y);
aEchSavOpt(w, AOPT_Rf, x - 8, y - 8, 7, 15, -1);
if (c == 0xffffff) break;
if (y < 16 || 479 < y || c != 0x000000) goto crash;
i = aInkey_waitRC(w, 200);
if (i == 32) { vy -= 9; }
vx += aMoveDx(i); vy++;
x = (x + vx + 640) % 640; y += vy;
}
aGrPrintf(w, 18, 15, 0, 7, " CLEAR!");
aWait(3000);
}
crash:
y = aSaturateInt(y, 16, 479);
for (i = 0; i < 3; i++) { r = i * 5 + 10; aDrawOvalCentOpt(w, AOPT_Rf, x, y, r, r, 4); }
aGrPrintf(w, 18, 15, 4, 7, " CRASH!");
aWaitKey(w, AKEY_ENTER);
}
}
hlx>run rocket.c
| コメント | お名前 | NameLink | |