贪吃蛇游戏设计C语言
///////////game . h文件
#ifndef?_蛇_H_H_H
#定义?_蛇_H_H_H
//调整游戏界面的大小,这里设置为15*15。
int?const?科尔?=?15;?/* *常量?修改后的值是不可变的* */
int?const?划?=?15;
//蛇形节点
typedef?struct?结节
{
int?x;
int?y;
struct?节点?* pre
struct?节点?*下一个;
}节点,?* pNODE
//食物
typedef?struct?食物
{
int?x;
int?y;
夏尔?c;
}食物,?* pFOOD
//初始化以创建蛇的第一部分。
pNODE?init snake(void);
//初始化食物成员
食物?init food(void);
//蛇形运动功能
int?MoveSnake(pNODE?pHead?夏尔?c);
//检查键盘按键
夏尔?KbHit(char?东方);
//蛇吃的食物处理功能
pNODE?SnakeEatFood(pNODE?pHead?pFOOD?pFood);
//打印游戏界面函数
作废?打印(pNODE?pHead?食物?食物);
//游戏结束,释放记忆功能。
作废?FreeMemory(pNODE?* PP head);
#endif
///////main.c文件
#包含?& ltstdio.h & gt
#包含?& ltstdlib.h & gt
#包含?& lttime.h & gt
#包含?& ltconio.h & gt
#包含?& ltWindows.h & gt
#包含“game.h”
//主函数
int?主要(无效)
{
夏尔?orien?=?一个',?get _ char
int?游戏_结束?=?0;
食物?食物?=?init food();/* *初始化食物* */
pNODE?头?=?init snake();?/* *初始化头节点*/
什么时候?(1)
{
头?=?蛇食(头,& amp食物);
get_char?=?kb hit(orien);
如果?(27?==?get_char)
{
游戏_结束?=?1;
打破;
}
其他
orien?=?get _ char
游戏_结束?=?MoveSnake(头,orien);
如果?(游戏结束)
打破;
系统(“cls”);
打印(头,?食物);
睡眠(200);?//ms级别,刷屏间隔。
}
如果?(游戏结束)
{
Printf("游戏结束!\ n ");
自由内存(& amp头);
如果?(NULL?==?头)
Printf("内存释放成功!\ n ");
其他
Printf("内存释放失败!\ n ");
}
getch();
回归?0;
}
//初始化以创建蛇的第一部分。
pNODE?InitSnake(void)
{
pNODE?pHead?=?(pNODE)malloc(sizeof(NODE));
srand((无符号)(time(NULL)+1));
如果?(NULL?==?pHead)
{
Printf("内存分配失败!\ n ");
退出(-1);
}
pHead-& gt;x?=?兰德()?%?排;
pHead-& gt;y?=?兰德()?%?COL
pHead-& gt;下一个?=?NULL
pHead-& gt;pre?=?NULL
回归?pHead
}
//初始化食物成员
食物?InitFood(void)
{
食物?食物;
srand((无符号)时间(空));
food.x?=?兰德()?%?排;
食物. y?=?兰德()?%?COL
food.c?=?65?+?rand()% 26;
回归?食物;
}
//蛇吃的食物处理功能
pNODE?SnakeEatFood(pNODE?pHead?pFOOD?pFood)
{
pNODE?p_add?=?NULL,?pt?=?NULL,?后方?=?NULL
如果?(pFood-& gt;x?==?pHead-& gt;x?& amp& amp?pFood-& gt;y?==?pHead-& gt;y)
{
p_add?=?(pNODE)malloc(sizeof(NODE));
如果?(NULL?==?p_add)
{
Printf("内存分配失败!\ n ");
退出(-1);
}
pt?=?pHead
什么时候?(pt-& gt;下一个?!=?空)
{
pt?=?pt-& gt;接下来;
}
p _ add-& gt;pre?=?pt;
p _ add-& gt;下一个?=?NULL
pt-& gt;下一个?=?p _ add
*pFood?=?init food();
//不要让食物出现在蛇的位置。
pt?=?pHead
什么时候?(pt?!=?空)
{
如果?(pFood-& gt;x?==?pHead-& gt;x?& amp& amp?pFood-& gt;y?==?pHead-& gt;y)
{
*pFood?=?init food();
打破;
}
pt?=?pt-& gt;接下来;
}
}
回归?pHead
}
//检查键盘按键
夏尔?KbHit(char?东方)
{
夏尔?c;
如果?(kbhit())
{
c?=?getch();
如果?(东方?!=?d '吗?& amp& amp?c?==?a’)
{
东方?=?c;
}
不然呢?如果?(东方?!=?一个吗?& amp& amp?c?==?d’)
{
东方?=?c;
}
不然呢?如果?(东方?!=?什么?& amp& amp?c?==?s’)
{
东方?=?c;
}
不然呢?如果?(东方?!=?是吗?& amp& amp?c?==?w’)
{
东方?=?c;
}
不然呢?如果?(27?==?c)
{
东方?=?c;
}
}
回归?东方;
}
//蛇形运动功能
int?MoveSnake(pNODE?pHead?夏尔?c)
{
INT?游戏_结束?=?0;
pNODE?pt?=?pHead
//让pt指向蛇的尾巴
什么时候?(pt-& gt;下一个?!=?空)
{
pt?=?pt-& gt;接下来;
}
//从蛇尾到蛇头。
而(pt?!=?pHead)
{
pt-& gt;x?=?pt-& gt;pre->;x;
pt-& gt;y?=?pt-& gt;pre->;y;
pt?=?pt-& gt;pre
}
如果?(' d '?==?c)
{
pHead-& gt;x?+=?1;
如果?(pHead-& gt;x?& gt=?行)
{
pHead-& gt;x?-=?排;
}
}
如果?(' a '?==?c)
{
pHead-& gt;x?-=?1;
如果?(pHead-& gt;x?& lt?0)
{
pHead-& gt;x?+=?排;
}
}
如果?(' s '?==?c)
{
pHead-& gt;y?+=?1;
如果?(pHead-& gt;y?& gt=?COL)
{
pHead-& gt;y?-=?COL
}
}
如果?(‘w’?==?c)
{
pHead-& gt;y?-=?1;
如果?(pHead-& gt;y?& lt?0)
{
pHead-& gt;y?+=?COL
}
}
//当蛇头接触到蛇身时,游戏结束。
pt?=?pHead-& gt;接下来;
什么时候?(pt?!=?空)
{
如果?(pt-& gt;x?==?pHead-& gt;x?& amp& amp?pt-& gt;y?==?pHead-& gt;y)
{
游戏_结束?=?1;
}
pt?=?pt-& gt;接下来;
}
回归?游戏结束;
}
//打印游戏界面函数
作废?打印(pNODE?pHead?食物?食物)
{
int?划?=?0,?科尔?=?0,?旗帜?=?0;
pNODE?pt?=?NULL
Printf("方向控制-第一部分:W?下一个:s?左:a?右:d(Esc退出)\ n ");
为了什么?(row = 0;?row & lt排;?row++)
{
printf(“—”);
}
putchar(' \ n ');
为了什么?(col = 0;?col & ltCOL?col++)
{
printf("?|");
为了什么?(row = 0;?row & lt排;?row++)
{
pt?=?pHead
旗帜?=?0;
//打印出蛇
什么时候?(pt?!=?空)
{
如果?(排?==?pt-& gt;x?& amp& amp?科尔?==?pt-& gt;y)
{
如果?(pt?==?pHead)
printf("■");
其他
printf("□");
旗帜?=?1;
打破;
}
pt?=?pt-& gt;接下来;
}
//打印出食物或者两个空格。
如果?(0?==?旗帜)
{
如果?(排?==?food.x?& amp& amp?科尔?==?food.y)
{
putchar(food . c);
putchar(food . c);
继续;
}
printf(" ");
}
}
printf(" | ");
putchar(' \ n ');
}
printf(" ");
为了什么?(row = 0;?row & lt排;?row++)
{
printf(“—”);
}
putchar(' \ n ');
}
//释放记忆功能
作废?FreeMemory(pNODE?*ppHead)
{
pNODE?p _删除?=?NULL,?pt?=?NULL
什么时候?(*ppHead?!=?空)
{
pt?=?(* ppHead)-& gt;接下来;
如果?(pt?!=?空)
{
pt-& gt;pre?=?NULL
}
p _删除?=?* ppHead
免费(p _ delete);
p _删除?=?NULL
*ppHead?=?pt;
}
}