CHASE
超シンプルな追っかけゲーム「CHASE」を作ってみます。
1 ゲームの概要
超シンプルな追っかけゲームです。プレーヤー(@)はひたすらポイント(P)を追いかけて、ポントを
ゲットするゲームです。
キャラクターは以下の通りです。
プレーヤー @
ポイント P
敵1 C 敵2 D
ポイントはランダムにいろんな位置に現れます。プレーヤーがポントをゲットすると、5点獲得です。
敵が先にポイントをゲットすると1点減点です。
プレーヤーを動かすキー操作は以下の通りです。
8 上
|
4 左<−−−−>右 6
|
2 下
プレーヤーが敵に当たるとゲームオーバーです。
ゲームの様子は以下の通りです。
********CHASE ver0.01******** Coded by Tsuyoshi Kasai for TurboC(for DOS/V) POINT : 0 |######################################| | | | | | | | | | | | | | | | D P @ | | C | | | | | | | | | | | | | |######################################| Your character is @, and get P. C and D are enemies. If you(@) are caught by enemies(C and D), Game is over. Key 2 Down 4 Left 6 Right 8 Up |
敵の動きは、それぞれ異なり、敵1はプレーヤーに向かって動いてきます。
敵2はポイントに向かって動きます。
2 コード
TurboC For PC/AT用のコードですが、TurboC For PC98でも問題なくコンパイルできるはず
です。短いので全コードを以下に載せておきます。
ゲームで使用している変数は以下の通りです。
A)キャラクタ座標
x,y自キャラ座標 cx,cy dx,dy敵キャラ座標 px,pyポイント座標
B)座標の状態
g[ ][ ] 0 何もいない 1 自キャラ 2,3 敵キャラ 4 ポイント
C)フラグ
end 0 ゲーム継続中 1 ゲーム終了(プレーヤーと敵が当たると1がたてられます)
D)その他
point 得点
/* chase ver0.0.1 coded by Tsuyoshi Kasai */ /* TurboC (PC/AT) English Version 用 */ #include <stdio.h> #include <time.h> #include <stdlib.h> #include <conio.h> #include <dos.h> /*変数 x,y自キャラ座標 cx,cy dx,dy敵キャラ座標 px,pyポイント座標 */ /* g[][] 0 何もいない 1 自キャラ 2,3 敵キャラ 4 ポイント */ int x,y,px,py,cx,cy,dx,dy; int point=0; int end=0; int g[40][20]; void init(); /*初期化*/ void setp(); /*ポイントの初期設定、配置*/ void setc(); /*敵キャラその1の初期設定、配置*/ void setd(); /*敵キャラその2の初期設定、配置*/ void move(); /*自キャラの移動*/ void cmove(); /*敵キャラ1の移動*/ void dmove(); /*敵キャラ2の移動*/ void cymove(); void dxmove(); /* Main関数 本体プログラム */ main(){ init(); x=20;y=12;g[x][y]=1; /*初期画面 GAMEの説明、枠の表示、キャラの初期配置 */ gotoxy(1,1);printf("********CHASE ver0.01********\n"); printf(" Coded by Tsuyoshi Kasai for TurboC(for DOS/V)"); gotoxy(1,22);printf("Your character is @, and get P. C and D are enemies.\n"); printf("If you(@) are caught by enemies(C and D), Game is over.\n"); printf("Key 2 Down 4 Left 6 Right 8 Up\n"); setp(); setc(); setd(); for(;;){ gotoxy(1,3);printf("POINT : %3d",point); move(); /*自キャラの移動*/ cmove(); /*敵キャラ1の移動*/ dmove(); /*敵キャラ2の移動*/ delay(3000); /*ゲームスピードの調整*/ if (end == 1) break;} /*endフラグがたったら終了*/ /* 終了画面表示 */ gotoxy(x,y);putchar('*'); printf("----E N D----"); printf("\x1b[>5l"); } /*初期化*/ void init(){ int i,j; printf("\x1b[2J");printf("\x1b[>5h"); for(i=1;i<=40;i++){gotoxy(i,4);putchar('#');gotoxy(i,20);putchar('#');} for(i=4;i<=20;i++){gotoxy(1,i);putchar('|');gotoxy(40,i);putchar('|');} randomize(); for(i=2;i<=39;i++){ for (j=5;j<=19;j++) g[i][j]=0;} } /*ポイントの初期設定、配置*/ void setp(){ st: px=random(38)+2;py=random(15)+5; if (g[px][py] != 0) goto st; g[px][py]=2;gotoxy(px,py);putchar('P'); } /*敵キャラ1の初期設定、配置*/ void setc(){ st: cx=random(38)+2;cy=random(15)+5; if (g[cx][cy] != 0) goto st; g[cx][cy]=3; } /*敵キャラ2の初期設定、配置*/ void setd(){ st: dx=random(38)+2;dy=random(15)+5; if (g[dx][dy] != 0) goto st; g[dx][dy]=4; } /*自キャラの移動*/ void move(){ int c; for(;;){ if(!kbhit())break; /*キーが押されていたら、変数cにキー取得*/ else c=getch(); } gotoxy(x,y);putchar(' ');g[x][y]=0; /*変数c(押されたキー)別に移動方向の処理*/ switch(c){ case '2': if(y<19) y++; else y=19; break; case '4': if(x>2) x--; else x=2; break; case '6': if(x<39) x++; else x=39; break; case '8': if(y>5) y--; else y=5; break; } gotoxy(x,y);putchar('@'); /*当り判定とその処理*/ switch(g[x][y]){ case 2: /* ポイントと当たったら5点追加 */ point=point+5;setp(); break; case 3: /* 敵と当たったら終了フラグ立てる end=1 */ end=1;break; case 4: /* 敵と当たったら終了フラグ立てる end=1 */ end=1;break; } g[x][y]=1; } /*敵キャラ1の移動*/ void cmove(){ int oldcx,oldcy,r; r=random(3); if (r == 0) return; /* 3分の2の確立で移動 */ oldcx=cx;oldcy=cy; gotoxy(cx,cy);putchar(' ');g[cx][cy]=0; if(cx>x) {cx--;goto cpos;} if(cx<x){cx++;goto cpos;} if(cx==x) cymove(); /*x座標が同じなら、縦方向(y軸)の移動に*/ cpos: /*当り判定とその処理*/ switch(g[cx][cy]){ case 1: /*自キャラに当たる。ゲーム終了(end=1)*/ end=1;break; case 2: /*ポイントに当たる。マイナス1ポイント*/ point--;setp();break; case 4: /*敵2キャラと位置が重なる。この場合は移動させない*/ cx=oldcx;cy=oldcy;break; /*元の座標(oldcx,oldcy)を代入*/ } gotoxy(cx,cy);putchar('C');g[cx][cy]=3; } void cymove(){ if(cy<y) cy++; if(cy>y) cy--; } /*敵キャラ2の移動*/ void dmove(){ int olddx,olddy,r; r=random(3); if (r == 0) return; olddx=dx;olddy=dy; gotoxy(dx,dy);putchar(' ');g[dx][dy]=0; if(dy<py) {dy++;goto dpos;} if(dy>py){dy--;goto dpos;} if(dy == py) dxmove(); dpos: /*当り判定とその処理*/ switch(g[dx][dy]){ case 1: end=1;break; case 2: point--;setp();break; case 3: dx=olddx;cy=olddy;break; } gotoxy(dx,dy);putchar('D');g[dx][dy]=4; } void dxmove(){ if(dx<px) dx++; if(dx>px) dx--; } |
3 プログラムの解説
(1) ゲームスピードの調整
ゲームスピードの調整に、delay( )
関数を使用しています。TurboCでは、指定したミリセカンドだけ
プログラムを停止させます。
(2) 自キャラの移動
A) キーの取得
以下は押されているキーの取得の常套手段です。
for(;;){
if(!kbhit())break; /*キーが押されていたら、変数cにキー取得*/
else c=getch();
}
・・・・省略・・・・
}
キーが押されていなかったら(!kbhit()) 一挙に for
ループを抜けます (break)
押されていたら変数cにキーを取得します。
kbhit( ) はキーが押されていれば0以外を返し、押されていなければ0を返します。
B) キーの判定と移動処理
switch........case
文で、押されたキーを判定し、必要な移動処理をおこないます。
gotoxy(x,y);putchar(' ');g[x][y]=0;
/*変数c(押されたキー)別に移動方向の処理*/
switch(c){
case '2':
if(y<19) y++;
else y=19;
break;
case '4':
if(x>2) x--;
else x=2;
break;
case '6':
if(x<39) x++;
else x=39;
break;
case '8':
if(y>5) y--;
else y=5;
break;
}
コードにかなりコメントを入れましたので、あとは自分で解析して下さい。簡単なコードなので
特に説明しなくてもわかると思います。