c语言用vc编写的贪吃蛇怎么实现未点击按键时,按原来方向自动移动。
c语言用vc编写的贪吃蛇怎么实现未点击按键时,按原来方向自动移动。比如一开始按w向上移动,那么没有按其他按键之前自动向上移动怎么实现?...
c语言用vc编写的贪吃蛇怎么实现未点击按键时,按原来方向自动移动。比如一开始按w向上移动,那么没有按其他按键之前自动向上移动怎么实现?
展开
1个回答
2016-11-02
展开全部
# include<stdio.h>
# include<stdlib.h>
# include<time.h>
# include<Windows.h>
# include<conio.h>
//#define KEYCODE
//#define TESTSNAKE
#define maxx 23
#define maxy 38
typedef struct Snake //定义蛇结构体
{
int x;
int y;
struct Snake *next;
}snake;
snake *head = NULL; //初始化头尾指针
snake *tail = NULL;
snake *egg = NULL;
vx = 1;
vy = 0;
int speed=5;
void checkkey();
void Pos(); //设置光标函数
void Startgame(); //游戏开始
void Gamecircle(); //游戏循环
void Creatmap(); //创建地图
void Inisnake(); //初始化蛇身
void Printsnake(); //打印蛇
void Snakemove(); //蛇移动
void Deletetail(); //去头
void Dessnake();
int newegg();
void printegg();
int eategg();
void main()
{
#ifdef KEYCODE
checkkey();
#endif
Startgame();
Gamecircle();
Dessnake();
Pos(maxx+2,4);
system("pause");
}
void Pos(int y,int x) //设置控制台光标位置
{
HANDLE hOutput; //建立一个句柄
COORD pos; //定义光标位置
pos.X=x<<1;
pos.Y=y;
hOutput=GetStdHandle(STD_OUTPUT_HANDLE); //获取句柄
SetConsoleCursorPosition(hOutput,pos); //在显示器上显示光标地址
}
void Startgame()
{
srand(time(0));
Pos(5,3);
printf("欢迎来到贪吃蛇的世界!\n");
Pos(7,6);
printf("用↑ ↓ ← →分别控制蛇的移动, ");
Pos(8,6);
printf("Ctrl+↑为加速,Ctrl+↓为减速。\n\n\n");
system("pause");
system("cls");
Creatmap();
Inisnake();
newegg();
Printsnake();
}
void testsnake()
{ snake *t;
for(t= tail;t;t=t->next)
if(t==0xcdcdcdcd)
{
printf("\t\t数据完整性破坏\n\t\t系统将退出");t=0;
}
}
void Gamecircle()
{int ch,tick=1;
while(1)
{
Sleep(25);
if(kbhit()){
ch=getch();
if(ch==27) break; // ESC键退出
if(ch==224) ch=getch(); else continue;
switch(ch){
case 72 : {if(vy==0) vy = -1; vx = 0; break;} // ↑
case 80 : {if(vy==0) vy = 1; vx = 0; break;} // ↓
case 77 : {if(vx==0) vx = 1; vy = 0; break;} // ←
case 75 : {if(vx==0) vx = -1; vy = 0; break;} // →
case 141: {if(speed > 1 ) speed--; break;} // Ctrl+↑为加速,
case 145: {if(speed < 20) speed++; break;} // Ctrl+↓为减速
default : ;
}
}
if(!--tick){
if(!eategg()) // 如果不是吃掉了蛋就移动
{
Snakemove(); //蛇移动
Deletetail(); //去蛇尾
printegg();
}
tick=speed;
}
}
}
void Creatmap()
{
int i;
for(i=0;i<=maxy+1;i++) //打印上下边框(29个格子)
{
Pos(0,i);
printf("■");
Pos(maxx+1,i);
printf("■");
}
for (i=1;i<maxx+1;i++) //打印左右边框(25个格子,不算重叠)
{
Pos(i,0);
printf("■");
}
for (i=1;i<maxx+1;i++)
{
Pos(i,maxy+1);
printf("■");
}
}
void Inisnake() //初始化蛇身(尾添加)
{
int i;
snake *pTemp; //建立第一个节点
pTemp = (snake *)malloc(sizeof(snake));
pTemp->x = 12;
pTemp->y = 5;
if (NULL == head) //节点接入链表
{
head = pTemp;
tail = pTemp;
}
for (i =1;i<3;i++) //后面节点接入
{
pTemp = (snake *)malloc(sizeof(snake));
pTemp->x = 12+i;
pTemp->y = 5;
head->next = pTemp;
head = pTemp;
}
head->next = NULL; // 最后一个节点next置空
}
void Dessnake() //初始化蛇身(尾添加)
{ snake * t;
while(tail!=NULL) // 还有节点
{
t=tail->next;
free(tail);
tail =t;
}
if(egg) free(egg);
}
void Printsnake() //输出蛇
{
snake *pTempPrint = tail;
while(pTempPrint != NULL)
{
Pos(pTempPrint->x,pTempPrint->y);
printf("■");
pTempPrint = pTempPrint->next;
}
}
void Snakemove() //蛇前进(添新头去尾)
{
snake * Newhead;
int x = head->x, y = head->y;
int delt=0;
if( vx ){
y += vx;
if (y > maxy ) {
delt = y - maxy ;
y = maxy;
}
if ( y < 1 ) {
delt = 1-y ;
y = 1;
}
if (delt)
{
vx =abs(vx);
vy = ((x>maxx/2)? -vx:vx);
x += ((x>maxx/2)? -delt : delt);
vx = 0;
}
}
else{
x += vy;
if (x > maxx ) {
delt = x - maxx ;
x = maxx;
}
if ( x < 1 ) {
delt = 1-x ;
x = 1;
}
if (delt)
{
vy =abs(vy);
vx = ((y>maxy/2)? -vy:vy);
y += ((y>maxy/2)? -delt : delt);
vy = 0;
}
}
Newhead = (snake *)malloc(sizeof(snake)); //添加新尾
Newhead->x = x;
Newhead->y = y ;
Newhead->next = NULL;
head->next = Newhead; //先连后断
head = Newhead;
}
void printegg()
{
Pos(egg->x,egg->y);
printf("■");
}
int newegg()
{ snake * t; int i;
if(!(egg = (snake *)malloc(sizeof(snake))))
return 0;
for(i=0;i<10000;i++){
egg->x = rand()%maxx+1;
egg->y = rand()%maxy+1;
for(t=tail;t;t=t->next)
if(t->x == egg->x && t->y == egg->y)
break;
if(!t) break;
}
if(i>=10000)
return 0;
egg->next = NULL;
printegg();
return 1;
}
int eategg()
{
int x=head->x,y=head->y;
if((x+vy==egg->x) && (y+vx==egg->y))
{
head->next = egg;
head = egg;
newegg();
return 1;
}
else return 0;
}
void Deletetail() //去尾
{
snake *p,*p1,*p2;
p1 = tail; // p2 = NULL;
p2 = p1->next; //p2得到倒数第二节的地址
Pos(p1->x,p1->y);
printf(" "); //尾节点用空格代替
free(p1); //释放尾节点
tail = p2; //尾指针挪到倒数第二节
p = head; //输出蛇身
while(p2->next != NULL)
p2 = p2->next;
Pos(p2->x,p2->y);
printf("■");
}
void checkkey()
{
int ch;
printf("键盘键码测试,ESC退出...\n");
while(1)
{
if(kbhit()){
ch=getch();
if(ch==27) break; // ESC键退出
if(ch==224) {printf("%d",ch); ch=getch(); }else continue;
printf("\t%d\n",ch);
}
}
}
上面是一个部分实现的贪吃蛇,里面就通过延时等待,实现了自动的移动。主要在void Gamecircle()函数中。
如还有问题,请追问
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询