CANVAS 20,24,"CATCH"; ← ゲーム画面を作ります。よこ20マス、たて24マスの大きさです。
HI=0; ← ハイスコアを0に設定します。
FOR; ← 繰り返し命令で、一番下のNEXTまでの範囲を繰り返します。
SC=0; ← スコアを0点に設定します。
FOR LV=1,9999; ← LV=1から順番に上がっていくための繰り返しです。
PX=9; ← PXはお皿の位置です。
FOR BG=0,LV; ← バーガーをLVの数だけ降らせるための繰り返しです。
BX=RND(20); BY=0; ← バーガーの初期位置を乱数で決めています。
FOR T=0,9999; ← ゲーム内時間を数えるために変数Tを使います(表示されません)。
CLS@ 0; ← 画面をまず黒(色番号0)で消します
PRINT@ 0,0,7,0,"LEVEL:%02d SCORE:%05d HIGH:%05d",LV,SC,HI; ← 画面の上の方に、レベル、点数、ハイスコアを表示します。
IF T%4==0 THEN BY++; FI; ← もしゲーム内時間Tが4の倍数だったら、バーガーを1マスだけ落とします。
CHAR@ BX,BY,2,6,0; ←バーガーを場所(BX,BY)に表示します。キャラクターは丸(番号2)、色は(6,0)です。
CHAR@ PX,23,4,3,0; ←水色のお皿を場所(PX,23)に表示します。キャラクターは横棒(番号4)、色は(3,0)です。
CHARBOX@ 1,BG,PX,23-BG,2,6,0; ←積みあがったバーガーを(PX,23-BG)からBG個表示します。キャラクターは丸(番号2)、色は(6,0)です。
I=INKEY@WRC(50); ←50ミリ秒(0.05秒)だけ待ってからキー入力状態を確認します。
TX=MINMAX(PX+XMOVE(I),0,19); ←キー入力での移動先をTXに計算します。MIXMAXを使って、0~19の範囲から出ないようにしています。
IF NOT(TX==BX AND BY>=23-BG) THEN PX=TX; FI; ←もしもTXにお皿を移動した時に、落下中のバーガーと衝突しなかったら、PXを更新します。
IF PX==BX AND BY==22-BG BREAK; ←もしバーガーがキャッチできたら、TのFOR~NEXTから抜けます。
IF BY==23 GOTO OVER; ←もしバーガーが床に落ちてしまったら、OVERにジャンプします。
NEXT; ←TのためのFORのところに戻ります。このときにTは1増えます。
SC++; ←SCに1を足します。
HI=MAX(HI,SC); ←SCとHIのうち、大きいほうをHIとします。
NEXT; ←BGのためのFORのところに戻ります。このときにBGは1増えます。
PRINT@ 6,20,0,2,"LEVEL:%02d CLEAR!",LV; ←クリアした時のメッセージを書きます。
WAIT 3000; ←3000ミリ秒(=3秒)だけ待ちます。
NEXT; ←LVのためのFORのところに戻ります。このときにLVは1増えます。
OVER:
WAITKEY@ 10; ←Enterキーが押されるまで待ちます。
NEXT; ←一番最初のFORのところに戻って、ゲームを最初からやり直します。
| 0:黒 | 1:青 | 2:みどり | 3:水色 | 4:赤 | 5:むらさき | 6:黄色 | 7:白 |
| 0:空白 | 1:四角 | 2:丸 | 3:バツ | 4:よこぼう | 5:たてぼう | 6:顔マーク | 7:ひしがた | 8:ななめせん | 9:ななめせん |
hlx>run catch.txt
#include <acl.c>
void aMain()
{
int hi = 0, sc, px, tx, bx, by, t, bg, lv, i;
AWindow *w = aOpenWinEx(20, 24, "catch", 0);
for (;;) {
sc = 0; px = 9;
for (lv = 1;; lv++) {
for (bg = 0; bg < lv; bgr++) {
bx = aRnd(20); by = 0;
for (t = 0;; t++) {
aCls(w, 0);
aGrPrintf(w, 0, 0, 7, 0, "Level:%02d Score:%05d High:%05d", lv, sc, hi);
if (t % 4 == 0) by++;
aEch(w, bx, by, 2, 6, 0);
aEch(w, px, 23, 4, 3, 0);
aEchBox(w, 1, bg, px, 23 - bg, 2, 6, 0);
i = aInkey_waitRC(w, 50);
tx = aSaturateInt(px + aMoveDx(i), 0, 19);
if (!(tx == bx && by >= 23 - bg)) px = tx;
if (px == bx && by == 22 - bg) break;
if (by == 23) goto over;
}
sc++;
hi = aMax(hi, sc);
}
aGrPrintf(w, 6, 20, 0, 2, "Level:%02d Clear!", lv);
aWait(3000);
}
over:
aWaitKey(w, AKEY_ENTER);
}
}
hlx>run catch.c
| コメント | お名前 | NameLink | |