C語言貪吃蛇經(jī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語言)
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)識地圖大小
#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; //每步得分
//定義游戲中用到的符號
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("* ->開始游戲請按 enter鍵 *\n");
printf("* ->退出游戲請按 esc鍵 *\n");
printf("* ->暫停游戲請按 space鍵 *\n");
printf("* ->通過上下左右鍵來控制蛇的移動 *\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() //蛇移動一次
{
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語言項(xiàng)目,用來練手,僅供參考哦!!
謝謝閱讀,如有問題,歡迎提出。
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持我們。
上一篇:OpenCV實(shí)現(xiàn)馬賽克和毛玻璃濾鏡效果
欄 目:C語言
下一篇:Opencv使用Stitcher類圖像拼接生成全景圖像
本文標(biāo)題:C語言貪吃蛇經(jīng)典小游戲
本文地址:http://www.jygsgssxh.com/a1/Cyuyan/924.html
您可能感興趣的文章
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用函數(shù)刪除字符
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)式函數(shù)庫
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對數(shù)怎么表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段函數(shù)
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排序法函數(shù)
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段函數(shù)
- 04-02C語言中怎么打出三角函數(shù) c語言中怎么打出三角函數(shù)的值
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求階乘


閱讀排行
本欄相關(guān)
- 04-02c語言函數(shù)調(diào)用后清空內(nèi)存 c語言調(diào)用
- 04-02func函數(shù)+在C語言 func函數(shù)在c語言中
- 04-02c語言的正則匹配函數(shù) c語言正則表達(dá)
- 04-02c語言用函數(shù)寫分段 用c語言表示分段
- 04-02c語言中對數(shù)函數(shù)的表達(dá)式 c語言中對
- 04-02c語言編寫函數(shù)冒泡排序 c語言冒泡排
- 04-02c語言沒有round函數(shù) round c語言
- 04-02c語言分段函數(shù)怎么求 用c語言求分段
- 04-02C語言中怎么打出三角函數(shù) c語言中怎
- 04-02c語言調(diào)用函數(shù)求fibo C語言調(diào)用函數(shù)求
隨機(jī)閱讀
- 08-05dedecms(織夢)副欄目數(shù)量限制代碼修改
- 01-10SublimeText編譯C開發(fā)環(huán)境設(shè)置
- 04-02jquery與jsp,用jquery
- 08-05DEDE織夢data目錄下的sessions文件夾有什
- 01-10使用C語言求解撲克牌的順子及n個(gè)骰子
- 01-10delphi制作wav文件的方法
- 01-11Mac OSX 打開原生自帶讀寫NTFS功能(圖文
- 08-05織夢dedecms什么時(shí)候用欄目交叉功能?
- 01-10C#中split用法實(shí)例總結(jié)
- 01-11ajax實(shí)現(xiàn)頁面的局部加載


