ヘビを貪るゲームの設計とアルゴリズム
4374 ワード
文字バージョンヘビを貪るゲームの設計とアルゴリズム
一、必要な機能:1.地図の境界と更新2.蛇の初期化3.蛇の4方向への移動(キーボードで実現)4.蛇が体や障害(境界や地図で定義)にぶつかってゲームが終わる.ヘビが食べ物を食べると、ヘビが一節伸びる.ランダムに食べ物を置く、蛇の上に置くか、境界を超えてはいけない.得点の表示と増加二・ゲームのフローチャート:三・ゲームの基本擬似コード:出力文字マトリクス
四.コードの実装
#include < stdio.h >
#include < stdlib.h >
#include < time.h >
#include < conio.h>//必要なヘッダファイル
#define SNAKE_MAX_LENGTH 20//蛇の最大長さを定義
#define SNAKE_HEAD'H'//蛇頭の定義
#define SNAKE_BOOY‘X’//蛇身の定義
#define BLANK_CELL’//空き地の定義
#define SNAKE_FOOD'$'//食べ物の定義
#define WALL_CELL'*'//マクロ定義アイテム
void snakeMove(int, int);//ヘビの移動を定義するvoid put_Money(void);//ランダムに食べ物void output(void);//出力パターンvoid gameover(void);//出力ゲーム終了int shifousiwang(void);//蛇が死ぬかどうかを判断するvoid foodChange(void);//食べ物char mapを更新する必要があるかどうかを判断する[12][13]={"*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*",};//初期化マップint snakeX[SNAKE_MAX_LENGTH]={1,1,1,1,1};//ヘビの座標int snakeY[SNAKE_MAX_LENGTH]={1,2,3,4,5}を初期化する.int snakeLength = 5;//ヘビの長さint counter=1を初期化します.int fx, fy, weibaX, weibaY, i;//一時変数の定義
int main(){printf("スペースでゲームに入る");//ゲームインタフェースに入るヒント語char ch 1=getch();//最初のコマンドif(ch 1=’’’){//入力が正しくゲームに入るとput_Money();//食べ物を置くoutput()//最初の地図for(;1;){snakeMove(snakeX[snakeLength-1],snakeY[snakeLength-1]);//移動蛇if(shifousiwang()break;//蛇が死亡したかどうかを判断foodChange();//食べ物がif(counter==0)continueを更新する必要があるかどうかを判断する//命令が正しいかどうかを判断し、エラーがoutput()}////////////ゲームに入るelse printf("これは間違った命令です");//エラーコマンドreturn 0を入力するプロンプト
void move() { for (i = 1; i < snakeLength;++ i) map[snakeX[snakeLength - i]][snakeY[snakeLength - i]] = map[snakeX[snakeLength - i - 1]][snakeY[snakeLength - i - 1]]; map[snakeX[0]][snakeY[0]] = ’ ‘; weibaX = snakeX[0]; weibaY = snakeY[0]; for (i = 0; i < snakeLength - 1;++ i) { snakeX[i] = snakeX[i + 1]; snakeY[i] = snakeY[i + 1]; } }//ヘッド以外の移動
void moveA(int headX, int headY) { map[headX][headY - 1] = map[headX][headY]; move(); snakeY[snakeLength - 1] = snakeY[snakeLength - 1] - 1; }//A方向の移動
void moveS(int headX, int headY) { map[headX + 1][headY] = map[headX][headY]; move(); snakeX[snakeLength - 1] = snakeX[snakeLength - 1] + 1; }//S方向の移動
void moveD(int headX, int headY) { map[headX][headY + 1] = map[headX][headY]; move(); snakeY[snakeLength - 1] = snakeY[snakeLength - 1] + 1; }//D方向の移動
void moveW(int headX, int headY) { map[headX - 1][headY] = map[headX][headY]; move(); snakeX[snakeLength - 1] = snakeX[snakeLength - 1] - 1; }//W方向の移動
void snakeMove(int headX,int headY){//蛇の移動char ch 2=getch();if(‘a’<=ch 2&&ch 2<=‘z’)ch 2=ch 2-‘a’+‘A’;if(ch 2!=‘A’&&ch 2!=‘S’&&ch 2!=‘D’&&ch 2!=‘W’){printf(‘これは誤った命令");counter=0;return;}if (ch2 == ‘A’) { moveA(headX, headY); }; if (ch2 == ‘S’) { moveS(headX, headY); }; if (ch2 == ‘D’) { moveD(headX, headY); }; if (ch2 == ‘W’) { moveW(headX, headY); };//判断方向}
void output() { int i; for (i = 0; i < 12;++ i) printf(“%s”, map[i]); }//新しいシーンを印刷
void gameover(){printf("ゲーム終了");}//ゲーム終了のヒント
void put_Money(//地図上でランダムに食べ物を生み出すwhile(1){fx=rand()%10;fy=rand()%10;if(map[fx][fy]='){//蛇が占有する位置map[fx][fy]=SNAKE_FOOD;break;}}
int shifousiwang() { if (snakeX[snakeLength - 1] == 0 || snakeX[snakeLength - 1] == 11 || snakeY[snakeLength - 1] == 0 || snakeY[snakeLength - 1] == 11) { gameover(); return 1; } for (i = 0; i < snakeLength - 2;++ i) { if ( snakeX[snakeLength - 1] == snakeX[i] && snakeY[snakeLength - 1] == snakeY[i]) { gameover(); return 1; } } return 0; }//蛇が死ぬかどうかを判断する
void foodChange() { if (snakeX[snakeLength - 1] == fx && snakeY[snakeLength - 1] == fy) { map[weibaX][weibaY] = SNAKE_BOOY; ++ snakeLength; for (i = snakeLength - 1; i >= 1; – i) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } snakeX[0] = weibaX; snakeY[0] = weibaY; put_Money(); } }//食べ物の更新
一、必要な機能:1.地図の境界と更新2.蛇の初期化3.蛇の4方向への移動(キーボードで実現)4.蛇が体や障害(境界や地図で定義)にぶつかってゲームが終わる.ヘビが食べ物を食べると、ヘビが一節伸びる.ランダムに食べ物を置く、蛇の上に置くか、境界を超えてはいけない.得点の表示と増加二・ゲームのフローチャート:三・ゲームの基本擬似コード:出力文字マトリクス
WHILE not DO
ch=
CASE ch DO
‘A’: ,break
‘D’: ,break
‘W’: ,break
‘S’: ,break
END CASE
IF THEN END WHILE
IF THEN
END WHILE
Game Over!!!
四.コードの実装
#include < stdio.h >
#include < stdlib.h >
#include < time.h >
#include < conio.h>//必要なヘッダファイル
#define SNAKE_MAX_LENGTH 20//蛇の最大長さを定義
#define SNAKE_HEAD'H'//蛇頭の定義
#define SNAKE_BOOY‘X’//蛇身の定義
#define BLANK_CELL’//空き地の定義
#define SNAKE_FOOD'$'//食べ物の定義
#define WALL_CELL'*'//マクロ定義アイテム
void snakeMove(int, int);//ヘビの移動を定義するvoid put_Money(void);//ランダムに食べ物void output(void);//出力パターンvoid gameover(void);//出力ゲーム終了int shifousiwang(void);//蛇が死ぬかどうかを判断するvoid foodChange(void);//食べ物char mapを更新する必要があるかどうかを判断する[12][13]={"*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*","*",};//初期化マップint snakeX[SNAKE_MAX_LENGTH]={1,1,1,1,1};//ヘビの座標int snakeY[SNAKE_MAX_LENGTH]={1,2,3,4,5}を初期化する.int snakeLength = 5;//ヘビの長さint counter=1を初期化します.int fx, fy, weibaX, weibaY, i;//一時変数の定義
int main(){printf("スペースでゲームに入る");//ゲームインタフェースに入るヒント語char ch 1=getch();//最初のコマンドif(ch 1=’’’){//入力が正しくゲームに入るとput_Money();//食べ物を置くoutput()//最初の地図for(;1;){snakeMove(snakeX[snakeLength-1],snakeY[snakeLength-1]);//移動蛇if(shifousiwang()break;//蛇が死亡したかどうかを判断foodChange();//食べ物がif(counter==0)continueを更新する必要があるかどうかを判断する//命令が正しいかどうかを判断し、エラーがoutput()}////////////ゲームに入るelse printf("これは間違った命令です");//エラーコマンドreturn 0を入力するプロンプト
void move() { for (i = 1; i < snakeLength;++ i) map[snakeX[snakeLength - i]][snakeY[snakeLength - i]] = map[snakeX[snakeLength - i - 1]][snakeY[snakeLength - i - 1]]; map[snakeX[0]][snakeY[0]] = ’ ‘; weibaX = snakeX[0]; weibaY = snakeY[0]; for (i = 0; i < snakeLength - 1;++ i) { snakeX[i] = snakeX[i + 1]; snakeY[i] = snakeY[i + 1]; } }//ヘッド以外の移動
void moveA(int headX, int headY) { map[headX][headY - 1] = map[headX][headY]; move(); snakeY[snakeLength - 1] = snakeY[snakeLength - 1] - 1; }//A方向の移動
void moveS(int headX, int headY) { map[headX + 1][headY] = map[headX][headY]; move(); snakeX[snakeLength - 1] = snakeX[snakeLength - 1] + 1; }//S方向の移動
void moveD(int headX, int headY) { map[headX][headY + 1] = map[headX][headY]; move(); snakeY[snakeLength - 1] = snakeY[snakeLength - 1] + 1; }//D方向の移動
void moveW(int headX, int headY) { map[headX - 1][headY] = map[headX][headY]; move(); snakeX[snakeLength - 1] = snakeX[snakeLength - 1] - 1; }//W方向の移動
void snakeMove(int headX,int headY){//蛇の移動char ch 2=getch();if(‘a’<=ch 2&&ch 2<=‘z’)ch 2=ch 2-‘a’+‘A’;if(ch 2!=‘A’&&ch 2!=‘S’&&ch 2!=‘D’&&ch 2!=‘W’){printf(‘これは誤った命令");counter=0;return;}if (ch2 == ‘A’) { moveA(headX, headY); }; if (ch2 == ‘S’) { moveS(headX, headY); }; if (ch2 == ‘D’) { moveD(headX, headY); }; if (ch2 == ‘W’) { moveW(headX, headY); };//判断方向}
void output() { int i; for (i = 0; i < 12;++ i) printf(“%s”, map[i]); }//新しいシーンを印刷
void gameover(){printf("ゲーム終了");}//ゲーム終了のヒント
void put_Money(//地図上でランダムに食べ物を生み出すwhile(1){fx=rand()%10;fy=rand()%10;if(map[fx][fy]='){//蛇が占有する位置map[fx][fy]=SNAKE_FOOD;break;}}
int shifousiwang() { if (snakeX[snakeLength - 1] == 0 || snakeX[snakeLength - 1] == 11 || snakeY[snakeLength - 1] == 0 || snakeY[snakeLength - 1] == 11) { gameover(); return 1; } for (i = 0; i < snakeLength - 2;++ i) { if ( snakeX[snakeLength - 1] == snakeX[i] && snakeY[snakeLength - 1] == snakeY[i]) { gameover(); return 1; } } return 0; }//蛇が死ぬかどうかを判断する
void foodChange() { if (snakeX[snakeLength - 1] == fx && snakeY[snakeLength - 1] == fy) { map[weibaX][weibaY] = SNAKE_BOOY; ++ snakeLength; for (i = snakeLength - 1; i >= 1; – i) { snakeX[i] = snakeX[i - 1]; snakeY[i] = snakeY[i - 1]; } snakeX[0] = weibaX; snakeY[0] = weibaY; put_Money(); } }//食べ物の更新