贪吃蛇游戏设计C语言

有两个文件,一个是game.h的头文件,一个是main.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;

}

}