貪喫蛇的遊戲設計和算法

字符版本貪喫蛇遊戲設計及算法

一·所需功能:
1.地圖的邊界及更新
2.蛇的初始化
3.蛇往四個方向的移動(用鍵盤實現)
4.蛇撞到身體、障礙(邊界或你在地圖中定義) 遊戲結束
5.蛇喫到食物,蛇就長一節
6.隨機放置食物,不可在蛇上或者超出邊界
7.得分的顯示和增加
二·遊戲的流程圖:
這裏寫圖片描述
三·遊戲的基本僞代碼:
輸出字符矩陣

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] = {“**”,
XXXXH “,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
“* *”,
**”,}; //初始化地圖
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(“按空格進入遊戲\n”); //打印進入遊戲界面的提示語
char ch1 = getch(); //獲取第一個命令
if (ch1 == ’ ‘) { //如果輸入正確進入遊戲
put_Money(); //放置食物
output(); //打印初始地圖
for (; 1; ) {
snakeMove(snakeX[snakeLength - 1], snakeY[snakeLength - 1]); //移動蛇
if (shifousiwang())
break; //判斷蛇是否死亡
foodChange(); //判斷食物是否需要更新
if (counter == 0)
continue; //判斷命令是否正確,如果錯誤重新循環
output();
}
} //進入遊戲
else
printf(“這是一個錯誤的指令\n”); //提示鍵入錯誤指令
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 ch2 = getch();
if (‘a’ <= ch2 && ch2 <= ‘z’)
ch2 = ch2 - ‘a’ + ‘A’;
if (ch2 != ‘A’ && ch2 != ‘S’ && ch2 != ‘D’ && ch2 != ‘W’) {
printf(“這是一個錯誤的指令\n”);
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\n”, 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();
}
} //食物的更新

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章