实现这个小游戏我们可以分为以下几步:
1.把蛇要走的地图打印出来;
2.把蛇和食物打印出来;
3.让蛇动起来,控制方向;
4.判断蛇目前所处状态。
//.C文件
#include"Snack.h"
void SetPos(int x,int y)
{
COORD pos = {0};
HANDLE handle = NULL;
handle = GetStdHandle(STD_OUTPUT_HANDLE);
pos.X = x;
pos.Y = y;
SetConsoleCursorPosition(handle,pos);
}void WelcomeToGame()
{
system("mode con cols=100 lines=30");
SetPos(35,14);
printf("欢迎来到贪吃蛇小游戏\n");
system("pause");
system("cls");
SetPos(30,14);
printf("用↑、↓、←、→来控制蛇的移动,F1为加速,F2为减速\n");
system("pause");
system("cls");
SetPos(40,14);
printf("加速分数更高\n");
system("pause");
system("cls");
}
pSnakeNode BuyNode()
{
pSnakeNode pRet = (pSnakeNode)malloc(sizeof(SnakeNode));
if(pRet == NULL)
{
exit(-1);
}
pRet->x = 0;
pRet->y = 0;
pRet->next = NULL;
return pRet;
}
void InitSnake(pSnake ps)
{
int i = 1;
pSnakeNode first = BuyNode();
pSnakeNode cur;
first->x = INIT_X;
first->y = INIT_Y;
for(i = 1;i <= 4;i++)
{
cur = BuyNode();
cur->x = first->x+2;
cur->y = first->y;
cur->next = first;
first = cur;
}
while(cur)
{
SetPos(cur->x,cur->y);
printf(FOOD);
cur = cur->next;
}
ps->_pSnake = first;
}
void CreateMap()
{
int i = 0;
for(i = 0;i <= 58;i+=2)
{
SetPos(i,0);
printf(WALL);
}
for(i = 0;i <= 58;i+=2)
{
SetPos(i,27);
printf(WALL);
}
for(i = 1;i <= 26;i++)
{
SetPos(0,i);
printf(WALL);
}
for(i = 1;i <= 26;i++)
{
SetPos(58,i);
printf(WALL);
}
}
void CreateFood(pSnake ps)
{
pSnakeNode pFood = BuyNode();
pSnakeNode cur = ps->_pSnake;
pFood->y = rand()%26 + 1;
do
{
pFood->x = rand() % 55 + 2;
}while(pFood->x % 2 != 0);
while(cur)
{
if(cur->x == pFood->x && cur->y == pFood->y)
{
CreateFood(ps);
return;
}
cur = cur->next;
}
ps->_pFood = pFood;
SetPos(pFood->x,pFood->y);
printf(FOOD);
}void GameStart(pSnake ps)
{
//打印游戏界面1
WelcomeToGame();
//创建地图
CreateMap();
//初始化蛇
InitSnake(ps);
//初始化食物
CreateFood(ps);
ps->_AddScore = 10;
ps->_TotalScore = 0;
ps->_Dir = RIGHT;
ps->_SleepTime = 200;
ps->_Status = OK;
}
void Pause()
{
while(1)
{
Sleep(100);
if(GetAsyncKeyState(VK_SPACE))
{
break;
}
}
}
int NextHasFood(pSnakeNode pn,pSnakeNode pf)
{
return ((pn->x == pf->x) && (pf->y == pn->y));
}
void EatFood(pSnake ps,pSnakeNode pn)
{
pn->next = ps->_pSnake;
ps->_pSnake = pn;
SetPos(ps->_pSnake->x,ps->_pSnake->y);
printf(FOOD);
ps->_TotalScore += ps->_AddScore;
CreateFood(ps);
}
void NotFood(pSnake ps,pSnakeNode pn)
{
pSnakeNode cur = NULL;
pn->next = ps->_pSnake;
ps->_pSnake = pn;
SetPos(ps->_pSnake->x,ps->_pSnake->y);
printf(FOOD);
cur = ps->_pSnake;
while(cur->next->next)
{
cur = cur->next;
}
SetPos(cur->next->x,cur->next->y);
printf(" ");
free(cur->next);
cur->next = NULL;
}
void SnakeMove(pSnake ps)
{
pSnakeNode pNextNode = BuyNode();
switch(ps->_Dir)
{
case UP:
{
pNextNode->x = ps->_pSnake->x;
pNextNode->y = ps->_pSnake->y-1;
if(NextHasFood(pNextNode,ps->_pFood))
{
//下一个结点是食物
EatFood(ps,pNextNode);
}
else
{
NotFood(ps,pNextNode);
}
}break;
case DOWN:
{
pNextNode->x = ps->_pSnake->x;
pNextNode->y = ps->_pSnake->y+1;
if(NextHasFood(pNextNode,ps->_pFood))
{
//下一个结点是食物
EatFood(ps,pNextNode);
}
else
{
NotFood(ps,pNextNode);
}
}break;
case LEFT:
{
pNextNode->x = ps->_pSnake->x-2;
pNextNode->y = ps->_pSnake->y;
if(NextHasFood(pNextNode,ps->_pFood))
{
//下一个结点是食物
EatFood(ps,pNextNode);
}
else
{
NotFood(ps,pNextNode);
}
}break;
case RIGHT:
{
pNextNode->x = ps->_pSnake->x+2;
pNextNode->y = ps->_pSnake->y;
if(NextHasFood(pNextNode,ps->_pFood))
{
//下一个结点是食物
EatFood(ps,pNextNode);
}
else
{
NotFood(ps,pNextNode);
}
}break;
}
}
void KillByWall(pSnake ps)
{
if((0 == ps->_pSnake->x) || (ps->_pSnake->x == 58) || (ps->_pSnake->y == 0) || (ps->_pSnake->y == 27))
{
ps->_Status = KILL_BY_WALL;
}
}
void KillBySelf(pSnake ps)
{
pSnakeNode pnext = ps->_pSnake->next;
while(pnext)
{
if((pnext->x == ps->_pSnake->x) && (pnext->y == ps->_pSnake->y))
{
ps->_Status = KILL_BY_SELF;
return;
}
pnext = pnext->next;
}
}
void PrintHelpInfo(pSnake ps)
{
SetPos(62,12);
printf("用↑、↓、←、→来控制蛇的移动");
SetPos(70,13);
printf("F1为加速,F2为减速");
SetPos(70,14);
printf("按ESC退出游戏");
SetPos(65,8);
printf("总分:%d",ps->_TotalScore);
SetPos(65,9);
printf("每个食物的分数:%d",ps->_AddScore);
printf(" ");
}
void GameRun(pSnake ps)
{
do
{
PrintHelpInfo(ps);
//确定方向
if((GetAsyncKeyState(VK_UP)) && (ps->_Dir != DOWN))
{
ps->_Dir = UP;
}
else if((GetAsyncKeyState(VK_DOWN)) && (ps->_Dir != UP))
{
ps->_Dir = DOWN;
}
else if((GetAsyncKeyState(VK_LEFT)) && (ps->_Dir != RIGHT))
{
ps->_Dir = LEFT;
}
else if((GetAsyncKeyState(VK_RIGHT)) && (ps->_Dir != LEFT))
{
ps->_Dir = RIGHT;
}else if(GetAsyncKeyState(VK_SPACE))
{
//暂停
Pause();
}
else if(GetAsyncKeyState(VK_ESCAPE))
{
//结束
ps->_Status = NORMAL_END;
break;
}
else if(GetAsyncKeyState(VK_F1))
{
//加速
if(ps->_SleepTime >= 40)
{
ps->_SleepTime -= 20;
ps->_AddScore += 2;
}
}
else if(GetAsyncKeyState(VK_F2))
{
//减速
if(ps->_SleepTime <= 300)
{
ps->_SleepTime += 30;
ps->_AddScore -= 2;
}
if(ps->_SleepTime >= 300)
{
ps->_AddScore = 2;
}
}
Sleep(ps->_SleepTime);
SnakeMove(ps);
KillByWall(ps);
KillBySelf(ps);
}while(ps->_Status == OK);
}
void GameEnd(pSnake ps)
{
pSnakeNode cur = ps->_pSnake;
SetPos(25,14);
if(ps->_Status == NORMAL_END)
{
printf("正常结束游戏\n");
}
else if(ps->_Status == KILL_BY_WALL)
{
printf("撞墙死掉\n");
}
else if(ps->_Status == KILL_BY_SELF)
{
printf("撞上自己死掉\n");
}while(cur)
{
pSnakeNode del = cur;
cur = cur->next;
free(del);
del = NULL;
}
ps->_pSnake = NULL;
ps->_pFood = NULL;
}//.h头文件
#ifndef __SNAKE_H__
#define __SNAKE_H__
#include<Windows.h>
#include<stdio.h>
#include<malloc.h>
#include<stdlib.h>
#include<time.h>
#define WALL "★"
#define FOOD "■"
#define INIT_X 20
#define INIT_Y 10
typedef struct SnakeNode
{
int x;
int y;
struct SnakeNode* next;
}SnakeNode,*pSnakeNode;enum Direction
{
UP = 1,
DOWN,
LEFT,
RIGHT
};
enum GameStatus
{
OK,
NORMAL_END,
KILL_BY_WALL,
KILL_BY_SELF
};
typedef struct Snake
{
pSnakeNode _pSnake;//维护蛇身的指针
pSnakeNode _pFood;
int _TotalScore;
int _AddScore;
int _SleepTime;//休眠时间
enum Direction _Dir;
enum GameStatus _Status;
}Snake,*pSnake;
pSnakeNode BuyNode();
void CreateFood(pSnake ps);
void GameRun(pSnake ps);
void WelcomeToGame();
void CreateMap();
void GameStart(pSnake ps);
void InitSnake(pSnake ps);
void Pause();
int NextHasFood(pSnakeNode pn,pSnakeNode pf);
void SnakeMove(pSnake ps);
void GameRun(pSnake ps);
void EatFood(pSnake ps,pSnakeNode pn);
void NotFood(pSnake ps,pSnakeNode pn);
void KillByWall(pSnake ps);
void KillBySelf(pSnake ps);
void PrintHelpInfo();
void GameEnd(pSnake ps);
#endif //__SNACK_H__
//.C测试文件#include"Snack.h"
void test()
{
Snake snake = {0};//创建贪吃蛇
srand ((unsigned int)time(NULL));
GameStart(&snake);
GameRun(&snake);
GameEnd(&snake);
system("pause");
}
int main()
{
test();
return 0;
}