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;
}
コードにかなりコメントを入れましたので、あとは自分で解析して下さい。簡単なコードなので
特に説明しなくてもわかると思います。