新手上路可能比较嫩,写的代码不简洁也不太好看,敬请谅解。以后学习中有什么不会的都会做好笔记的。。这个还是一位学长做的 转载一下他的。
源代码如下:
#include<stdio.h>
#include<stdlib.h>
#include<windows.h>
#include<time.h>
//函数声明区
void welcome();//欢迎界面
void Pos(int x,int y); //光标位置设定
void creatMap(); //打印地图
void initSnake(); //初始化蛇身
void creatFood();//创建食物
char reDirection();//用来识别方向
int snakeMove();//蛇的移动
int crossWall();//不能穿墙
int eatSelf();//不能吃自己
void cf();//函数初始化
int start();//主函数的开始
void pause();//游戏中途暂停
int color(int c); //更改文字颜色
void headtoright();//链表的逆置
typedef struct Snake //相当于蛇的一个节点
{
int x;//横坐标
int y; //纵坐标
struct Snake *next; //指针域next(下一个结点的指针),数据域x,y
}snake;
int firsttime=0;//初始化定义
snake *head;//头指针
snake *p; //用来遍历
snake *food1; //用来标记的
char status='H';//初始方向的状态
int score=0; //分数
int add=10; //一个食物的分
int leap=0;//用来标记是否结束 ,0是没有,1代表蛇死了代表结束了
int endleap=0;//结束标志 1就是结束
int sleepTime=500;
char m='y'; //初始化声明一个值,让其进入循环
void headtoright()
{
snake*p,*q,*r;
p=head;
q=r=NULL;
while(p)
{
q=p->next;
p->next=r;
r=p;
p=q;
}
head=r;
}
void initSnake()//蛇身初始化,给定一个长度 ,用结构体表示是蛇的骨架,真正要显示出来的是打印■
{
endleap=0;
leap=0;
int i;
snake *tail;//尾指针
tail=(snake*)malloc(sizeof(snake)); //第一个节点(头结点)
tail->x=30; //2的倍数,因为方块的长是两个单位
tail->y=10; //1个单位
tail->next=NULL;
for(i=1;i<=4;i++) //实现尾插法
{
head=(snake*)malloc(sizeof(snake));//申请一个节点
head->next=tail;//连接成链
head->x=30-2*i;//下一个节点的位置
head->y=10;
tail=head;
}
// 遍历打印出来 打印5个节点
while(tail!=NULL)
{
Pos(tail->x,tail->y);
printf("■");
tail=tail->next;
}
}
void pause()
{
while(1)
{
Sleep(300);
if(GetAsyncKeyState(VK_SPACE))
{
break;
}
reDirection();
}
}
char reDirection()//识别用户按下的键值 保留方向值
{
if(GetAsyncKeyState(VK_F8))
{
if(sleepTime>300)//最多减到300
{
sleepTime-=50;//每次减50
add++;//每次食物加一分
}
}
if(GetAsyncKeyState(VK_F9))
{