C語言開發實現貪吃蛇小遊戲
阿新 • • 發佈:2020-10-13
小時候相信大家都玩過貪吃蛇,但是自從學了程式設計以後我都想自己實現一下,苦於沒有契機。
首先看一下游戲效果把:
接下來我們先分析一下貪吃蛇的需求有哪些:
- 用合適的資料結構表示蛇、食物
- 地圖的初始化
- 蛇的移動、食物的隨機生成
- 蛇的顯示、食物的顯示
- 貪吃蛇的規則確定(碰到食物邊長、碰到邊界和自己死亡等……)
主要功能需求就是上面這些,接下來我直接上C語言程式碼,這個遊戲相信沒做過的人看完之後會覺得非常簡單,因為其中沒什麼技術點可言,最重要的就是下面這幾句程式碼,用於控制游標的位置。
#include<Windows.h> COORD cor; cor.X = 0; cor.Y =2; //游標位置更新到(0,2) SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor);
原始碼:
#include<stdio.h> #include<stdlib.h> #include<time.h> #include<Windows.h> #include<conio.h> #define WIDE 60 # define HIGH 20 //1設定地圖邊界 //2初始化蛇的初始座標、以及事務 //3、將蛇和食物顯示 //4 蛇的移動(WASD) /* 規則: 蛇碰到強死掉 蛇碰到自己死掉 蛇碰到食物,身體增長,增加分數 */ //5.蛇死掉顯示分數 //儲存蛇的每一節的座標 typedef struct _body { int x; int y; }BODY; typedef struct _snake { //儲存蛇的身體 BODY list[WIDE * HIGH];//身體的每一節座標 int size;//記錄身體長度 BODY food;//食物的位置 int dx;//x移動方向 int dy;//y移動方向 //記錄設尾位置 int lastx; int lasty; }SNAKE; //初始化食物座標 void initFood(SNAKE* s) { srand(time(NULL)); s->food.x = rand() % WIDE; s->food.y = rand() % HIGH; } //初始化蛇 void initSnake(SNAKE* s) { //頭部 s->list[0].x = WIDE / 2; s->list[0].y = HIGH / 2; //第一節 s->list[1].x = WIDE / 2-1; s->list[1].y = HIGH / 2; //記錄身體大小 s->size = 2; //初始化食物的座標 initFood(s); //預設向右移動 s->dx = 1; s->dy = 0; } //顯示蛇 void showUi(SNAKE* s) { /* 每次顯示都要設定游標的位置 */ //顯示蛇 COORD cor; for (int i = 0; i < s->size; ++i) { //設定游標的位置 cor.X = s->list[i].x; cor.Y = s->list[i].y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor); //蛇頭 if (i == 0) { printf("@"); continue; } printf("*"); } //顯示食物 cor.X = s->food.x; cor.Y = s->food.y; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor); printf("#"); //清除掉蛇尾 cor.X = s->lastx; cor.Y = s->lasty; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor); printf(" "); } //更新的蛇的座標 void moveSnake(SNAKE* s) { //記錄下蛇尾的位置 s->lastx = s->list[s->size - 1].x; s->lasty = s->list[s->size - 1].y; for (int i = s->size-1; i >0; --i) { s->list[i].x = s->list[i - 1].x; s->list[i].y = s->list[i - 1].y; } s->list[0].x += s->dx; s->list[0].y += s->dy; } void controlSnake(SNAKE* s) { char key=0; //判斷按鍵 while (_kbhit()) { key = _getch(); } switch (key) { case 'a': s->dx = -1; s->dy = 0; break; case 's': s->dx = 0; s->dy = 1; break; case 'd': s->dx = 1; s->dy = 0; break; case 'w': s->dx = 0; s->dy = -1; break; default: break; } } //遊戲結束 void gameEnd(SNAKE* s) { COORD cor; cor.X = 0; cor.Y = HIGH + 1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor); printf("遊戲結束,最終得分為%d\n",(s->size - 2) * 10); //直接退出程式 exit(0); } //蛇吃到自己 void snakeEatSelf(SNAKE* s) { for (int i = 1; i < s->size; ++i) { if (s->list[0].x == s->list[i].x && s->list[0].y == s->list[i].y) { gameEnd(s); } } } //吃到食物 void snakeEatFood(SNAKE* s) { if (s->list[0].x == s->food.x && s->list[0].y == s->food.y) { //食物重置 initFood(s); //蛇加長 s->size++;//增加後的座標在移動的時候會自己進行加長 } } //開始遊戲 void startGame(SNAKE* s) { //每次對蛇頭是否碰牆進行判斷 while (s->list[0].x<WIDE&&s->list[0].x>=0&&s->list[0].y<HIGH&&s->list[0].y>0) { //控制方向 controlSnake(s); //更新蛇的座標 moveSnake(s); //system("cls");//清屏 //蛇移動 showUi(s); //判斷蛇是否碰到自己 snakeEatSelf(s); //吃到食物 snakeEatFood(s); //蛇的速度可以通過睡眠時間進行調整 Sleep(200); } gameEnd(s); } //初始化邊界 void initWall() { COORD cor; for (int i = 0; i <= WIDE; ++i) { for (int j = 0; j <= HIGH; ++j) { if (i == 0 || i == WIDE||j==0||j==HIGH) { COORD cor; cor.X = i; cor.Y = j; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor); printf("+"); } } } } //隱藏游標 void hideCursor() { CONSOLE_CURSOR_INFO cursor; cursor.bVisible = FALSE; cursor.dwSize = sizeof(cursor); HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorInfo(handle,&cursor); } int main() { //隱藏游標 hideCursor(); //初始化地圖 initWall(); //蛇型別定義 SNAKE* snake = (SNAKE*)malloc(sizeof(SNAKE)); //初始化蛇和食物 initSnake(snake); //顯示蛇 showUi(snake); //開始遊戲 startGame(snake); free(snake); //程式在HIGH+1行後面輸出 COORD cor; cor.X = 0; cor.Y =HIGH+2; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),cor); return 0; }
更多有趣的經典小遊戲實現專題,分享給大家:
C++經典小遊戲彙總
python經典小遊戲彙總
python俄羅斯方塊遊戲集合
JavaScript經典遊戲 玩不停
java經典小遊戲彙總
javascript經典小遊戲彙總
以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。