751
技术社区[云栖]
贪吃蛇程序VS2012编译成功
// libin.cpp : 定义控制台应用程序的入口点。 // #include "stdafx.h" #include<stdio.h> #include<windows.h> #include<time.h> #include<stdlib.h> struct Body//定义蛇身结构体 { short x,y;//蛇身结点的坐标 struct Body *next;//指向下一个结点的指针 }; ////////////////////全局变量///////////////////////////////////// int len=sizeof(struct Body);//Body结构体所占字节数 int score;//玩家得分 int Food=0;//1-有食物,0-没食物 short food_x,food_y;//食物坐标 struct Body *body001;//蛇头指针 int dir=4;//蛇头方向1-up,2-down,3-left,4-right int sleeptime=220;//每次移动之后的停顿时间 ////////////////////////函数声明///////////////////////////////////// void Pos(short x,short y); void CreatMap(); void PrintSnake(); void CreatFood(); void SnakeMove(); //int TouchWall();//不可穿墙 void CrossWall();//可以穿墙 int TouchSelf(); void Init(); void GameCircle(); void Pause(); void StartImage(); void EndImage(); ////////////////////////函数定义///////////////////////////////////// void Pos(short x,short y)//设置光标位置函数 { COORD pos; pos.X=x; pos.Y=y; HANDLE hOutput=GetStdHandle(STD_OUTPUT_HANDLE); SetConsoleCursorPosition(hOutput,pos); return; }//Pos void CreatMap()//打印地图 { int i; for(i=0;i<57;i+=2)//打印上下边框 { Pos(i,0); printf("■"); Pos(i,24); printf("■"); } for(i=1;i<24;i++)//打印左右边框 { Pos(0,i); printf("■"); Pos(56,i); printf("■"); } return; }//CreatMap void PrintSnake()//打印蛇 { struct Body *p=body001; while(p!=NULL)//判断是否指向蛇尾 { Pos(p->x,p->y); printf("■"); p=p->next; }//从蛇头打印到蛇尾 return ; } void CreatFood()//创建新食物 { if(Food==0) { srand((int)time(0)); food_x=2+rand()%53;//x的取值范围[2,54] if(food_x%2==1) food_x--; food_y=1+rand()%23;//y的取值范围[1,23] Food=1;//1表明有食物,0表明没食物 } return; }//CreatFood void SnakeMove()//蛇身移动、刷新蛇身和食物及其坐标 { struct Body *p_food;//下一格有食物 struct Body *p_forward;//下一格没食物 struct Body *q;//蛇身移动一格时的临时指针 p_forward=(struct Body *)malloc(len); if(1==dir)//向上移动 { if(body001->x==food_x && body001->y-1==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Pos(62,3);printf("分数:%d",score); Food=0; CreatFood(); Pos(62,7);printf("食物坐标: "); Pos(62,7);printf("食物坐标:%u,%u",food_x,food_y); } else//下一格没有食物 { p_forward->x=body001->x;//横坐标不变 p_forward->y=body001->y-1;//纵坐标-1 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒数第二个结点 q=q->next; Pos((q->next)->x,(q->next)->y);//移动光标到蛇尾 printf(" ");//删除蛇尾 free(q->next); //释放蛇尾 q->next=NULL;//使倒数第二个结点成为新的蛇尾 }//else } if(2==dir)//向下移动 { if(body001->x==food_x && body001->y+1==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Pos(62,3);printf("分数:%d",score); Food=0; CreatFood(); Pos(62,7);printf("食物坐标: "); Pos(62,7);printf("食物坐标:%u,%u",food_x,food_y); } else//下一格没有食物 { p_forward->x=body001->x;//横坐标不变 p_forward->y=body001->y+1;//纵坐标+1 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒数第二个结点 q=q->next; Pos((q->next)->x,(q->next)->y);//移动光标到蛇尾 printf(" ");//删除蛇尾 free(q->next); //释放蛇尾 q->next=NULL;//使倒数第二个结点成为新的蛇尾 }//else } if(3==dir)//向左移动 { if(body001->x-2==food_x && body001->y==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Pos(62,3);printf("分数:%d",score); Food=0; CreatFood(); Pos(62,7);printf("食物坐标: "); Pos(62,7);printf("食物坐标:%u,%u",food_x,food_y); } else//下一格没有食物 { p_forward->x=body001->x-2;//横坐标-2 p_forward->y=body001->y;//纵坐标不变 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒数第二个结点 q=q->next; Pos((q->next)->x,(q->next)->y);//移动光标到蛇尾 printf(" ");//删除蛇尾 free(q->next); //释放蛇尾 q->next=NULL;//使倒数第二个结点成为新的蛇尾 }//else } if(4==dir)//向右移动 { if(body001->x+2==food_x && body001->y==food_y)//下一格有食物 { p_food=(struct Body *)malloc(len); p_food->x=food_x; p_food->y=food_y; p_food->next=body001; body001=p_food; score+=5; Food=0; Pos(62,3);printf("分数:%d",score); CreatFood(); Pos(62,7);printf("食物坐标: "); Pos(62,7);printf("食物坐标:%u,%u",food_x,food_y); } else//下一格没有食物 { p_forward->x=body001->x+2;//横坐标=2 p_forward->y=body001->y;//纵坐标不变 p_forward->next=body001; body001=p_forward; q=body001; while((q->next)->next!=NULL)//使q指向倒数第二个结点 q=q->next; Pos((q->next)->x,(q->next)->y);//移动光标到蛇尾 printf(" ");//删除蛇尾 free(q->next); //释放蛇尾 q->next=NULL;//使倒数第二个结点成为新的蛇尾 }//else } Pos(62,9);printf("蛇头坐标: "); Pos(62,9);printf("蛇头坐标:%u,%u",body001->x,body001->y);//打印蛇头坐标 Pos(food_x,food_y);printf("■");//打印食物 PrintSnake();//打印蛇 } /*int TouchWall()//不可穿墙 { if(body001->x==0 || body001->x==56 || body001->y==0 || body001->y==24) return 1; else return 0; }//TouchWall*/ void CrossWall()//可以穿墙 { if(0==body001->x)//左进右出 { body001->x=54; if(food_x==body001->x && food_y==body001->y) food_x-=2; } if(56==body001->x)//右进左出 { body001->x=2; if(food_x==body001->x && food_y==body001->y) food_x+=2; } if(0==body001->y)//上进下出 { body001->y=23; if(food_x==body001->x && food_y==body001->y) food_y--; } if(24==body001->y)//下进上出 { body001->y=1; if(food_x==body001->x && food_y==body001->y) food_y++; } return; } int TouchSelf()//判断是否咬到自己 { struct Body *p_tself; p_tself=body001; while(!p_tself->next==NULL) { p_tself=p_tself->next; if(p_tself->x==body001->x && p_tself->y==body001->y) return 1; } return 0; } void Init()//游戏初始化 { CreatMap();//打印地图 Pos(62,1);printf("作者:李斌"); Pos(62,3);printf("分数:%d",score); Pos(62,5);printf("速度: "); Pos(62,5);printf("速度:%d",20+300-sleeptime); Pos(62,13);printf("F1 加速"); Pos(62,15);printf("F2 减速"); Pos(62,17);printf("↑ ↓ ← →方向"); Pos(62,19);printf("SPACE 暂停/开始"); Pos(62,21);printf("ESC 退出"); Pos(62,23);printf("QQ:1010305129"); struct Body *body002,*body003,*body004;//定义四个指向蛇身的指针 body001=(struct Body *)malloc(len);//创建4个蛇身结构体 body002=(struct Body *)malloc(len); body003=(struct Body *)malloc(len); body004=(struct Body *)malloc(len); body001->next=body002;//把蛇身连接起来,形成链表 body002->next=body003; body003->next=body004; body004->next=NULL; Pos(body001->x=12,body001->y=8);printf("■");//设定并打印蛇身的初始位置 Pos(body002->x=10,body002->y=8);printf("■"); Pos(body003->x=8,body003->y=8);printf("■"); Pos(body004->x=6,body004->y=8);printf("■"); CreatFood();//打印食物 Pos(62,7);printf("食物坐标: "); Pos(62,7);printf("食物坐标:%u,%u",food_x,food_y); } void Pause() { while(1) { Sleep(600); if(GetAsyncKeyState(VK_SPACE)) break; } return; } void GameCircle()//游戏循环 { while(1) { // if (1== TouchWall() )//不可穿墙 // break;//撞墙Game Over CrossWall();//可以穿墙 if(1== TouchSelf() )//判断蛇是否咬到自己 break;//咬到自己Game Over //判断用户的按键输入 // int dir=4; if(GetAsyncKeyState(VK_UP) && dir!=2) dir=1; else if(GetAsyncKeyState(VK_DOWN) && dir!=1) dir=2; else if(GetAsyncKeyState(VK_LEFT) && dir!=4) dir=3; else if(GetAsyncKeyState(VK_RIGHT) && dir!=3) dir=4; else if(GetAsyncKeyState(VK_ESCAPE)) break; else if(GetAsyncKeyState(VK_SPACE)) Pause(); else if(GetAsyncKeyState(VK_F1))//加速 { if(sleeptime>=110) sleeptime-=10; Pos(62,5);printf("速度: "); Pos(62,5);printf("速度:%d",20+300-sleeptime); } else if(GetAsyncKeyState(VK_F2))//减速 { if(sleeptime<=290) sleeptime+=10; Pos(62,5);printf("速度: "); Pos(62,5);printf("速度:%d",20+300-sleeptime); } SnakeMove();//蛇移动一格 Sleep(sleeptime);//设定两次移动之间的时间间隔 } } void StartImage() { Pos(28,6); printf("李斌,邀请你玩贪吃蛇"); Pos(28,11); printf("贪吃蛇 作者:李斌"); Pos(21,23); printf("2013.12.27晚于西安文理学院二号公寓"); Pos(28,13); system("pause"); system("cls"); Pos(25,9); printf("-->终于编译成功啦<--"); Pos(21,23); printf("2013.12.27晚于西安文理学院二号公寓"); Pos(26,13); system("pause"); system("cls"); } void EndImage() { system("cls"); Pos(30,9);printf("游戏结束,欢迎再来!"); Pos(30,11);printf("你的得分:%d",score); Pos(30,16);printf("娃,你还得继续努力啊!"); Pos(20,23);printf("2013.12.27晚于西安文理学院二号公寓"); Pos(28,13); system("pause"); } /////////////////////////main函数//////////////////////////////////////// int main(void) { StartImage();//开始画面 Init();//界面初始化 GameCircle();//游戏循环 EndImage();//结束画面 return 0; }
演示效果:
最后更新:2017-04-03 12:53:59