贪吃蛇游戏代码
#include <stdio.h>
#include <conio.h>
#include <stdlib.h>
#include <time.h>const int maxn = 100;
const int n = 20;struct node
{int x, y;
};int map[maxn][maxn]; // 0表示空格,1表示蛇身,2表示食物,3表示撞死的位置, 4表示蛇頭.
node food;
node squence[maxn]; // 蛇的身子的坐標.
int len; // 蛇的長度.
bool eat; // 判斷當前事物是否被吃了.
bool gameover; // 游戲是否失敗.
int direction; // 判斷當前蛇頭是朝哪個方向.void Output(void);
void Move(int direction);
void Move_up(void);
void Move_down(void);
void Move_left(void);
void Move_right(void);int main()
{int i, j;double start;int gamespeed; // 游戲速度自己調(diào)整.int timeover;int game_times = 1; // 游戲的次數(shù).char c = 'x';printf("請輸入游戲的級別(1到500,1最難,500最簡單):\n");scanf("%d", &gamespeed);gamespeed = gamespeed;// 對圖的初始化.for (i = 0; i <= n + 1; i++){for (j = 0; j <= n + 1; j++){map[i][j] = 0;}}// 對蛇的初始化.for (i = 1; i <= n; i++){squence[i].x = 0;squence[i].y = 0;}len = 1; // 蛇的長度為1.squence[len].x = 1;squence[len].y = 1; // 初始位置在點(1, 1).map[1][1] = 4;direction = 4; // 默認開始時蛇向右走.srand(time(0));while (game_times <= 20){eat = 0; // 食物還沒被吃.while (true){ // 隨機生出食物的坐標,注意不能與蛇身重合,否則就重新隨機產(chǎn)生.food.x = rand() % 20 + 1;food.y = rand() % 20 + 1;if (map[food.x][food.y] == 0){break;}}map[food.x][food.y] = 2; // 食物位置.system("cls");Output();// 以下這段半秒鐘不按鍵還取原方向繼續(xù)前行.while (!eat){start = clock();timeover=1;while(!kbhit()){ // 說明沒有按鍵.if (clock() - start <= gamespeed){ // 如果時間超過游戲時間.timeover = 1;}else{timeover = 0;break;}}if (timeover){ // 說明有按鍵.// 按一次鍵,可以連取兩個c = getch();c = getch();// 以下幾行告訴怎樣判斷用戶按的哪個方向鍵if(c==72) direction = 1; // printf("向上");if(c==80) direction = 2; // printf("向下");if(c==75) direction = 3; // printf("向左");if(c==77) direction = 4; // printf("向右");}Move(direction);system("cls");if (gameover){Output();printf("Game Over!!!\n");return 0;}Output();}game_times++; // 又成功吃到一次食物.}printf("You win!!!\n");return 0;
}void Move(int direction)
{switch (direction){case 1 : Move_up(); break;case 2 : Move_down(); break;case 3 : Move_left(); break;default : Move_right();}
}void Output(void)
{int i, j;for (j = 0; j <= n + 1; j++){printf("#");}printf("\n");for (i = 1; i <= n; i++){for (j = 0; j <= n + 1; j++){if (j == 0 || j == n + 1){if (map[i][j] == 3){printf("!");}else{printf("#");}}else{if (map[i][j] == 1){printf("*");}else if (map[i][j] == 2){printf("@");}else if (map[i][j] == 3){printf("!");}else if (map[i][j] == 4){switch (direction){case 1 : printf("%c", 30); break;case 2 : printf("%c", 31); break;case 3 : printf("%c", 17); break;default : printf("%c", 16);}}else{printf(" ");}}}printf("\n");}for (j = 0; j <= n + 1; j++){printf("#");}printf("\n");
}void Move_up(void)
{int i;int x, y;if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x + 1){ // 不能移動,則按原來的移動.direction = 2; // 按原來的向下移動.Move(direction);return ;}// 開始移動.x = squence[len].x - 1;y = squence[len].y;if (x == 0 || map[x][y] == 1){ // 撞到邊界或者自己撞到自己.map[x][y] = 3;gameover = 1;}if (map[x][y] == 2){ // 說明已經(jīng)吃到事物.map[squence[len].x][squence[len].y] = 1;len++;squence[len].x = x;squence[len].y = y;map[x][y] = 4;eat = 1;}else{map[squence[1].x][squence[1].y] = 0;for (i = 1; i <= len - 1; i++){squence[i].x = squence[i + 1].x;squence[i].y = squence[i + 1].y;map[squence[i + 1].x][squence[i + 1].y] = 1;}squence[len].x = squence[len].x - 1;if (gameover){map[squence[len].x][squence[len].y] = 3;}else{map[squence[len].x][squence[len].y] = 4;}}
}void Move_down(void)
{int i;int x, y;if (len > 1 && squence[len].y == squence[len - 1].y && squence[len].x == squence[len - 1].x - 1){ // 不能移動,則按原來的移動.direction = 1; // 按原來的向上移動.Move(direction);return ;}// 開始移動.x = squence[len].x + 1;y = squence[len].y;if (x == n + 1 || map[x][y] == 1){ // 撞到邊界或者自己撞到自己.map[x][y] = 3;gameover = 1;}if (map[x][y] == 2){ // 說明已經(jīng)吃到事物.map[squence[len].x][squence[len].y] = 1;len++;squence[len].x = x;squence[len].y = y;map[x][y] = 4;eat = 1;}else{map[squence[1].x][squence[1].y] = 0;for (i = 1; i <= len - 1; i++){squence[i].x = squence[i + 1].x;squence[i].y = squence[i + 1].y;map[squence[i + 1].x][squence[i + 1].y] = 1;}squence[len].x = squence[len].x + 1;if (gameover){map[squence[len].x][squence[len].y] = 3;}else{map[squence[len].x][squence[len].y] = 4;}}
}void Move_left(void)
{int i;int x, y;if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y + 1){ // 不能移動,則按原來的移動.direction = 4; // 按原來的向右移動.Move(direction);return ;}// 開始移動.x = squence[len].x;y = squence[len].y - 1;if (y == 0 || map[x][y] == 1){ // 撞到邊界或者自己撞到自己.map[x][y] = 3;gameover = 1;}if (map[x][y] == 2){ // 說明已經(jīng)吃到事物.map[squence[len].x][squence[len].y] = 1;len++;squence[len].x = x;squence[len].y = y;map[x][y] = 4;eat = 1;}else{map[squence[1].x][squence[1].y] = 0;for (i = 1; i <= len - 1; i++){squence[i].x = squence[i + 1].x;squence[i].y = squence[i + 1].y;map[squence[i + 1].x][squence[i + 1].y] = 1;}squence[len].y = squence[len].y - 1;if (gameover){map[squence[len].x][squence[len].y] = 3;}else{map[squence[len].x][squence[len].y] = 4;}}
}void Move_right(void)
{int i;int x, y;if (len > 1 && squence[len].x == squence[len - 1].x && squence[len].y == squence[len - 1].y - 1){ // 不能移動,則按原來的移動.direction = 3; // 按原來的向左移動.Move(direction);return ;}// 開始移動.x = squence[len].x;y = squence[len].y + 1;if (y == n + 1 || map[x][y] == 1){ // 撞到邊界或者自己撞到自己.map[x][y] = 3;gameover = 1;}if (map[x][y] == 2){ // 說明已經(jīng)吃到事物.map[squence[len].x][squence[len].y] = 1;len++;squence[len].x = x;squence[len].y = y;map[x][y] = 4;eat = 1;}else{map[squence[1].x][squence[1].y] = 0;for (i = 1; i <= len - 1; i++){squence[i].x = squence[i + 1].x;squence[i].y = squence[i + 1].y;map[squence[i + 1].x][squence[i + 1].y] = 1;}squence[len].y = squence[len].y + 1;if (gameover){map[squence[len].x][squence[len].y] = 3;}else{map[squence[len].x][squence[len].y] = 4;}}
}
總結(jié)
- 上一篇: 数塔问题和最长上升子序列问题
- 下一篇: 寒冷的高纬度——我的梦开始的地方