欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

C語(yǔ)言貪吃蛇經(jīng)典小游戲

 更新時(shí)間:2020年04月22日 16:24:37   作者:XHfight  
這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言貪吃蛇經(jīng)典小游戲,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

一、貪吃蛇小游戲簡(jiǎn)介:

用上下左右控制蛇的方向,尋找吃的東西,每吃一口就能得到一定的積分,而且蛇的身子會(huì)越吃越長(zhǎng),身子越長(zhǎng)玩的難度就越大,不能碰墻,也不能咬到自己的身體,等到了一定的分?jǐn)?shù),就能過(guò)關(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)體,利用單鏈表來(lái)表示蛇,每個(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í)間,用來(lái)控制速度 
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)輸出句柄來(lái)控制光標(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("* ->通過(guò)上下左右鍵來(lái)控制蛇的移動(dòng) *\n"); 
 printf("* ->通過(guò)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(" "); //打印空格來(lái)覆蓋頻幕上的蛇尾 
 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)目,用來(lái)練手,僅供參考哦!!

謝謝閱讀,如有問(wèn)題,歡迎提出。

更多有趣的經(jīng)典小游戲?qū)崿F(xiàn)專題,分享給大家:

C++經(jīng)典小游戲匯總

python經(jīng)典小游戲匯總

python俄羅斯方塊游戲集合

JavaScript經(jīng)典游戲 玩不停

java經(jīng)典小游戲匯總

javascript經(jīng)典小游戲匯總

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg進(jìn)階教程之給視頻添加文字水印

    FFmpeg是一套可以用來(lái)記錄、轉(zhuǎn)換數(shù)字音頻、視頻,并能將其轉(zhuǎn)化為流的開源計(jì)算機(jī)程序,下面這篇文章主要給大家介紹了關(guān)于FFmpeg進(jìn)階教程之給視頻添加文字水印的相關(guān)資料,需要的朋友可以參考下
    2022-11-11
  • C語(yǔ)言實(shí)現(xiàn)運(yùn)籌學(xué)中的馬氏決策算法實(shí)例

    C語(yǔ)言實(shí)現(xiàn)運(yùn)籌學(xué)中的馬氏決策算法實(shí)例

    這篇文章主要介紹了C語(yǔ)言實(shí)現(xiàn)運(yùn)籌學(xué)中的馬氏決策算法,簡(jiǎn)單介紹了馬氏決策的概念,并結(jié)合實(shí)例形式分析了C語(yǔ)言實(shí)現(xiàn)馬氏決策算法的具體實(shí)現(xiàn)技巧,需要的朋友可以參考下
    2017-09-09
  • 詳解C++中的四種類型轉(zhuǎn)換運(yùn)算符

    詳解C++中的四種類型轉(zhuǎn)換運(yùn)算符

    隱式類型轉(zhuǎn)換是安全的,顯式類型轉(zhuǎn)換是有風(fēng)險(xiǎn)的,C語(yǔ)言之所以增加強(qiáng)制類型轉(zhuǎn)換的語(yǔ)法,就是為了強(qiáng)調(diào)風(fēng)險(xiǎn),讓程序員意識(shí)到自己在做什么,本文將給大家詳細(xì)介紹一下C++中的四種類型轉(zhuǎn)換運(yùn)算符,需要的朋友可以參考下
    2023-09-09
  • 二分圖匹配實(shí)例代碼及整理

    二分圖匹配實(shí)例代碼及整理

    這篇文章主要介紹了二分圖匹配實(shí)例代碼及整理的相關(guān)資料,這里提供了三種方法包括匈牙利算法,KM算法,多重匹配,需要的朋友可以參考下
    2017-07-07
  • 純C語(yǔ)言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼分享

    純C語(yǔ)言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼分享

    這篇文章主要介紹了純C語(yǔ)言:遞歸二進(jìn)制轉(zhuǎn)十進(jìn)制源碼,有需要的朋友可以參考一下
    2014-01-01
  • C語(yǔ)言的分支和循環(huán)語(yǔ)句你真的了解嗎

    C語(yǔ)言的分支和循環(huán)語(yǔ)句你真的了解嗎

    這篇文章主要為大家詳細(xì)介紹了C語(yǔ)言的分支和循環(huán)語(yǔ)句,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下,希望能夠給你帶來(lái)幫助
    2022-02-02
  • C++ 程序員為什么看不起php程序員

    C++ 程序員為什么看不起php程序員

    由于當(dāng)今市場(chǎng)狀況,各種培訓(xùn)班飛起,PHPer越來(lái)越多,學(xué)習(xí)成本很低。導(dǎo)致了很多人對(duì)PHP的誤解。其實(shí)PHP學(xué)到深入的時(shí)候,所需知識(shí)很多,并不是表面看到的那樣。另外,PHP確實(shí)嚴(yán)謹(jǐn)性不高,這個(gè)跟C++,java確實(shí)都沒(méi)法比。但是,PHP在web開發(fā)中的效率,是其他語(yǔ)言所不能比的
    2017-02-02
  • C語(yǔ)言中的內(nèi)存泄露 怎樣避免與檢測(cè)

    C語(yǔ)言中的內(nèi)存泄露 怎樣避免與檢測(cè)

    堆經(jīng)常會(huì)出現(xiàn)兩種類型的問(wèn)題:1.釋放或改寫仍在使用的內(nèi)存(稱為:“內(nèi)存損壞”)。2.未釋放不再使用的內(nèi)存(稱為:“內(nèi)存泄露”)。這是最難被調(diào)試發(fā)現(xiàn)的問(wèn)題之一
    2013-09-09
  • 基于C語(yǔ)言中野指針的深入解析

    基于C語(yǔ)言中野指針的深入解析

    “野指針”不是NULL指針,是指向“垃圾”內(nèi)存的指針。人們一般不會(huì)錯(cuò)用NULL指針,因?yàn)橛胕f語(yǔ)句很容易判斷。但是“野指針”是很危險(xiǎn)的,if語(yǔ)句對(duì)它不起作用
    2013-07-07
  • C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

    C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式

    這篇文章主要為大家詳細(xì)介紹了C++實(shí)現(xiàn)中綴表達(dá)式轉(zhuǎn)后綴表達(dá)式,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2020-04-04

最新評(píng)論