C語(yǔ)言貪吃蛇經(jīng)典小游戲
一、貪吃蛇小游戲簡(jiǎn)介:
用上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會(huì)越吃越長(zhǎng),身子越長(zhǎng)玩的難度就越大,不能碰墻,也不能咬到自己的身體,等到了一定的分?jǐn)?shù),就能過關(guān)。
二、函數(shù)框架
三、數(shù)據(jù)結(jié)構(gòu)
typedef struct Snake { size_t x; //行 size_t y; //列 struct Snake* next; }Snake, *pSnake;
定義蛇的結(jié)構(gòu)體,利用單鏈表來表示蛇,每個(gè)結(jié)點(diǎn)為蛇身體的一部分。
四、代碼實(shí)現(xiàn)(vs2010 c語(yǔ)言)
1.Snake.h
#ifndef __SNAKE_H__ #define __SNAKE_H__ #include <stdio.h> #include <stdlib.h> #include <Windows.h> #include <time.h> #include <malloc.h> #include <assert.h> //標(biāo)識(shí)地圖大小 #define ROW_MAP 10 //地圖的行 #define COL_MAP 20 //地圖的列 #define SUCCESS_SCORE 10//通關(guān)分?jǐn)?shù) enum Direction //蛇行走的方向 { R, //右 L, //左 U, //上 D //下 }Direction; enum State { ERROR_SELF, //咬到自己 ERROR_WALL, //撞到墻 NORMAL, //正常狀態(tài) SUCCESS //通關(guān) }State; typedef struct Snake { size_t x; //行 size_t y; //列 struct Snake* next; }Snake, *pSnake; void StartGame(); void RunGame(); void EndGame(); #endif
2.Snake.c
#include "Snake.h" pSnake head = NULL; //定義蛇頭指針 pSnake Food = NULL; //定義食物指針 int sleeptime = 500;//間隔時(shí)間,用來控制速度 int Score = 0; //總分 int everyScore = 1; //每步得分 //定義游戲中用到的符號(hào) const char food = '#'; const char snake = '*'; void Pos(int x, int y) //控制輸出光標(biāo) { COORD pos; //pos為結(jié)構(gòu)體 pos.X = x; //控制列 pos.Y = y; //控制行 SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), pos);//讀取標(biāo)準(zhǔn)輸出句柄來控制光標(biāo)為pos } void Face() { system("color 0C"); printf("*******************************************************\n"); printf("* Welcome to Snake Game! *\n"); printf("* *\n"); printf("* ->開始游戲請(qǐng)按 enter鍵 *\n"); printf("* ->退出游戲請(qǐng)按 esc鍵 *\n"); printf("* ->暫停游戲請(qǐng)按 space鍵 *\n"); printf("* ->通過上下左右鍵來控制蛇的移動(dòng) *\n"); printf("* ->通過F1鍵減速 F2鍵加速 *\n"); printf("*******************************************************\n"); } void Map() //初始化地圖 { int i = 0; for(i = 0; i<COL_MAP; i+=2) //打印上下邊框(每個(gè)■占用兩列) { Pos(i, 0); printf("■"); Pos(i, ROW_MAP-1); printf("■"); } for(i = 0; i<ROW_MAP; i++) //打印左右邊框 { Pos(0, i); printf("■"); Pos(COL_MAP-2, i); printf("■"); } } void PrintSnake() //打印蛇 { pSnake cur = head; while(cur) { Pos(cur->y, cur->x); printf("%c", snake); cur = cur->next; } } void InitSnake() //初始化蛇身 { int initNum = 3; int i = 0; pSnake cur; head = (pSnake)malloc(sizeof(Snake)); head->x = 5; head->y = 10; head->next = NULL; cur = head; for(i = 1; i < initNum; i++) { pSnake newNode = (pSnake)malloc(sizeof(Snake)); newNode->x = 5+i; newNode->y = 10; newNode->next = NULL; cur->next = newNode; cur = cur->next; } PrintSnake(); } void CreateFood() //在地圖上隨機(jī)產(chǎn)生一個(gè)食物 { pSnake cur = head; Food = (pSnake)malloc(sizeof(Snake)); //產(chǎn)生x~y的隨機(jī)數(shù) k=rand()%(Y-X+1)+X; srand((unsigned)time(NULL)); Food->x = rand()%(ROW_MAP-2 - 1 + 1)+1; Food->y = rand()%(COL_MAP-3 - 2 + 1)+2; Food->next = NULL; while(cur) //檢查食物是否與蛇身重合 { if(cur->x == Food->x && cur->y == Food->y) { free(Food); Food = NULL; CreateFood(); return; } cur = cur->next; } Pos(Food->y, Food->x); printf("%c", food); } void StartGame() //游戲開始的所有設(shè)置 { Face(); system("pause"); if(GetAsyncKeyState(VK_RETURN)) { system("cls"); Pos(COL_MAP+5, 1); printf("當(dāng)前分?jǐn)?shù)/通關(guān)分?jǐn)?shù):"); Pos(COL_MAP+20, 1); printf("%d/%d", Score, SUCCESS_SCORE); Pos(COL_MAP+5, 2); printf("當(dāng)前分每步得分:"); Pos(COL_MAP+20, 2); printf("%d", everyScore); Pos(COL_MAP+5, 3); printf("\n"); Pos(COL_MAP+5, 4); printf("速度越快 得分越高哦!!\n"); Map(); InitSnake(); CreateFood(); } else if(GetAsyncKeyState(VK_ESCAPE)) { exit(0); } } int IsCrossWall() //判斷是否碰到墻 { if(head->x <= 0 || head->x >= ROW_MAP-1 ||head->y <= 1 || head->y >= COL_MAP-2) { State = ERROR_WALL; return 0; } return 1; } int IsEatSelf(pSnake newHead) //判斷是否咬到自己 { pSnake cur = head; assert(newHead); while(cur) { if(cur->x == newHead->x && cur->y == newHead->y) { State = ERROR_SELF; return 0; } cur = cur->next; } return 1; } int IsFood(pSnake pos) //判斷該位置是不是食物 { assert(pos); if(pos->x == Food->x && pos->y == Food->y) { return 1; } return 0; } void SnakeMove() //蛇移動(dòng)一次 { pSnake newHead = NULL; newHead = (pSnake)malloc(sizeof(Snake)); if(Direction == R) { newHead->x = head->x; newHead->y = head->y+1; newHead->next = head; } else if(Direction == L) { newHead->x = head->x; newHead->y = head->y-1; newHead->next = head; } else if(Direction == U) { newHead->x = head->x-1; newHead->y = head->y; newHead->next = head; } else if(Direction == D) { newHead->x = head->x+1; newHead->y = head->y; newHead->next = head; } if(IsFood(newHead)) { head = newHead; PrintSnake(); CreateFood(); Score += everyScore; Pos(COL_MAP+20, 1); printf("%d/%d", Score, SUCCESS_SCORE); if(Score >= SUCCESS_SCORE) { State = SUCCESS; } } else { if(IsCrossWall() && IsEatSelf(newHead)) { pSnake cur = NULL; head = newHead; cur = head; //刪除蛇尾并打印 while(cur->next->next != NULL) { Pos(cur->y, cur->x); printf("%c", snake); cur = cur->next; } Pos(cur->y, cur->x); printf("%c", snake); Pos(cur->next->y, cur->next->x); printf(" "); //打印空格來覆蓋頻幕上的蛇尾 free(cur->next); cur->next = NULL; } else { free(newHead); newHead = NULL; } } } void Pause() { while(1) { Sleep(sleeptime); if(GetAsyncKeyState(VK_SPACE)) { break; } } } void ControlSnake() //用鍵盤控制游戲 { if(GetAsyncKeyState(VK_UP) && Direction!=D) { Direction = U; } else if(GetAsyncKeyState(VK_DOWN) && Direction!=U) { Direction = D; } else if(GetAsyncKeyState(VK_LEFT) && Direction!=R) { Direction = L; } else if(GetAsyncKeyState(VK_RIGHT) && Direction!=L) { Direction = R; } else if(GetAsyncKeyState(VK_F1)) { if(sleeptime != 500) { sleeptime = 500; everyScore = 1; Pos(COL_MAP+20, 2); printf("%d", everyScore); } } else if(GetAsyncKeyState(VK_F2)) { if(sleeptime != 300) { sleeptime = 300; everyScore = 2; Pos(COL_MAP+20, 2); printf("%d", everyScore); } } else if(GetAsyncKeyState(VK_SPACE)) { Pause(); } else if(GetAsyncKeyState(VK_ESCAPE)) { exit(0); } } void StateGame() //判斷游戲失敗或成功 { if(State == ERROR_SELF) { system("cls"); printf("很遺憾,蛇咬到自己,游戲失??!\n"); } else if(State == ERROR_WALL) { system("cls"); printf("很遺憾,蛇碰到墻壁,游戲失??!\n"); } else if(State == SUCCESS) { system("cls"); printf("恭喜您,已通關(guān)?。?!\n"); } } void RunGame() { Direction = R; //蛇初始行走方向?yàn)橛? State = NORMAL;//游戲初始為正常狀態(tài) while(1) { ControlSnake(); SnakeMove(); if(State != NORMAL) { StateGame(); break; } Sleep(sleeptime); } } void EndGame() //釋放鏈表并恢復(fù)默認(rèn)值 { pSnake cur = head; while(cur) { pSnake del = cur; cur = cur->next; free(del); del = NULL; } head = NULL; if(Food != NULL) { free(Food); Food = NULL; } Score = 0; everyScore = 1; sleeptime = 500; }
3.Test.c
#include "Snake.h" int main() { while(1) { StartGame(); RunGame(); EndGame(); } system("pause"); return 0; }
五、運(yùn)行界面展示
1.歡迎界面
2.游戲界面
小小的c語(yǔ)言項(xiàng)目,用來練手,僅供參考哦!!
謝謝閱讀,如有問題,歡迎提出。
以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果
欄 目:C語(yǔ)言
下一篇:Opencv使用Stitcher類圖像拼接生成全景圖像
本文標(biāo)題:C語(yǔ)言貪吃蛇經(jīng)典小游戲
本文地址:http://mengdiqiu.com.cn/a1/Cyuyan/924.html
您可能感興趣的文章
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用函數(shù)刪除字符
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)式函數(shù)庫(kù)
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)數(shù)怎么表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段函數(shù)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排序法函數(shù)
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段函數(shù)
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎么打出三角函數(shù)的值
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求階乘


閱讀排行
- 1C語(yǔ)言 while語(yǔ)句的用法詳解
- 2java 實(shí)現(xiàn)簡(jiǎn)單圣誕樹的示例代碼(圣誕
- 3利用C語(yǔ)言實(shí)現(xiàn)“百馬百擔(dān)”問題方法
- 4C語(yǔ)言中計(jì)算正弦的相關(guān)函數(shù)總結(jié)
- 5c語(yǔ)言計(jì)算三角形面積代碼
- 6什么是 WSH(腳本宿主)的詳細(xì)解釋
- 7C++ 中隨機(jī)函數(shù)random函數(shù)的使用方法
- 8正則表達(dá)式匹配各種特殊字符
- 9C語(yǔ)言十進(jìn)制轉(zhuǎn)二進(jìn)制代碼實(shí)例
- 10C語(yǔ)言查找數(shù)組里數(shù)字重復(fù)次數(shù)的方法
本欄相關(guān)
- 04-02c語(yǔ)言函數(shù)調(diào)用后清空內(nèi)存 c語(yǔ)言調(diào)用
- 04-02func函數(shù)+在C語(yǔ)言 func函數(shù)在c語(yǔ)言中
- 04-02c語(yǔ)言的正則匹配函數(shù) c語(yǔ)言正則表達(dá)
- 04-02c語(yǔ)言用函數(shù)寫分段 用c語(yǔ)言表示分段
- 04-02c語(yǔ)言中對(duì)數(shù)函數(shù)的表達(dá)式 c語(yǔ)言中對(duì)
- 04-02c語(yǔ)言編寫函數(shù)冒泡排序 c語(yǔ)言冒泡排
- 04-02c語(yǔ)言沒有round函數(shù) round c語(yǔ)言
- 04-02c語(yǔ)言分段函數(shù)怎么求 用c語(yǔ)言求分段
- 04-02C語(yǔ)言中怎么打出三角函數(shù) c語(yǔ)言中怎
- 04-02c語(yǔ)言調(diào)用函數(shù)求fibo C語(yǔ)言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢(mèng))副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢(mèng)data目錄下的sessions文件夾有什
- 01-10使用C語(yǔ)言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢(mèng)dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁(yè)面的局部加載