我写的贪食蛇--Dos环境下

来源:互联网 发布:广东省大数据局 编辑:程序博客网 时间:2024/05/11 18:06
//此代码初始全部用最简单的语法---擦除、打印、擦除、打印···········但发现擦除会引起闪屏,//于是网上找到了另外一个打印方法替代printf(),具体表现在printimage()。因为新方法可以//定位,所以原本使用的数组可以简略,但只为实践性时间关系就不理了,所以目前是实 //现打印看起来是用了两种方法而且可以舍一(用数组打印或定位打印)// //#include#include #include#include//#include#include #include           #define FIRSTLOC_X 5//蛇尾初始位置#define FIRSTLOC_Y 5#define CHANG 20//格子长宽#define KUAN 10//#define TIME_DELAY 100char area[KUAN+2][CHANG+2];char direction;/*全局变量方向!!初始向右*/char pre_dir;//之前方向,用以防止反方向撞向自身int food_x, food_y;//食物坐标int hasfood;int iscrash;int mark;int count;//选项的计数int time_delay;//延时量,,初始为空可以编译通过?int ismenoirs;//是否穿墙typedef struct QNode {//队列(蛇)单元节点int x;int y;struct QNode *next;}QNode, * QueuePtr;typedef struct QSnake {//定义队列(蛇)结构?QueuePtr front;//头指针(头是尾,尾是头)QueuePtr rear;//尾指针}QSnake;QSnake snake;void InitQueue(){//构造初始蛇QueuePtr p;//指针2int i;snake.front = snake.rear = (QueuePtr)malloc(sizeof(QNode));//snake.front->next = NULL;for(i=0;i<5;++i) p="(QueuePtr)malloc(sizeof(QNode));" p-="">x = FIRSTLOC_X+i;p->y = FIRSTLOC_Y;p->next = NULL;snake.rear->next = p;//连接节点snake.rear = p;//尾指针转移到尾部}}//InitQueuevoid checkkb()//改名控制/*延时、读取按钮*///!!!这里待加入重新开始按钮{char press_dir;//time_t begin = clock();/*time.h*///while (clock()-beginx==1) {if(ismenoirs==0) iscrash=1;else p->x = CHANG;//穿墙(CHANG-1+1,,有边框情况)}else  p->x = snake.rear->x-1;p->y = snake.rear->y;pre_dir = 'l';}if(direction == 'r'){if(snake.rear->x==CHANG)  {if(ismenoirs==0) iscrash=1;else p->x = 1;}else p->x = snake.rear->x+1;p->y = snake.rear->y;pre_dir = 'r';}if(direction == 'u'){if(snake.rear->y==1)  {if(ismenoirs==0) iscrash=1;else p->y = KUAN;}else p->y = snake.rear->y-1; p->x = snake.rear->x;pre_dir = 'u';}if(direction == 'd'){if(snake.rear->y==KUAN)  {if(ismenoirs==0) iscrash=1;else p->y = 1;}else p->y = snake.rear->y+1;p->x = snake.rear->x;pre_dir = 'd';}//赋值结束;转移rear:p->next = NULL;snake.rear->next = p;snake.rear = p;//p重新被front赋值,更新front位置://需加入有食物的情况if(snake.rear->x==food_x+1 && snake.rear->y==food_y+1){++mark;hasfood=0;}else{p = snake.front->next;snake.front->next = p->next;free(p);}}//movenext()void createfood(){QueuePtr p;p=snake.front;//p用来扫描蛇身判断是否重叠srand(time(NULL));food_x=rand()%(CHANG-1);food_y=rand()%(KUAN-1);do{//防止重叠食物与蛇身重叠```p=p->next;if((food_x+1)==p->x && (food_y+1)==p->y)//(+1是边框情况){srand(time(NULL));food_x=rand()%(CHANG-1);food_y=rand()%(KUAN-1);p=snake.front;}}while(!(p==snake.rear));}//createfood()void checkcrash(){QueuePtr p;p=snake.front->next;while(!(p==snake.rear)){if(snake.rear->x==p->x && snake.rear->y==p->y){iscrash=1;break;}else p=p->next;}}//checkcrash()void getlocation(x,y){       COORD pos = {x,y};       HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE);       SetConsoleCursorPosition(hOut,pos);     }//getlocation(x,y)void drawframe()               //画外框和空格//忘记对area付值就点阵打印,导致之后打印蛇时无法忽略空格(因根本没赋值空格)。 {    int x,y;    char *i;    for(i=area[0];inext;!(j==snake.rear->next);j=j->next)//蛇身填入area{area[j->y][j->x]='*';//printf("%d %d  ",j->y,j->x);}for(x=0;x<(kuan+2);++x) for="" if="" continue="" else="" if="" area="" getlocation="" putchar="" for="">next;!(j==snake.rear->next);j=j->next)//打印后蛇身清空 {area[j->y][j->x]='@';//printf("%d %d  ",j->y,j->x);}}//printimage()int selhit(int sum)//选择按钮触动~~~注意count不能等于0.,  0代表回车键确认count值{char ch;if(_kbhit()){ch=_getch();if(ch=='s') {if(count==sum) count=1;else ++count;}if(ch=='w') {if(count==1) count=sum;else --count;}if(ch==13) return 0;}return count;}//selhit()void speedchoice(){char point[]="--->";char title[]="Welcome! what speed will you wheel?    (press \"w\" or\"s\" button to up & down)";int getreturn=1;int prereturn=0;// prereturn用来初步防止闪屏的暂时方法count=1;while(!getreturn==0)////!!!!!!!!有逻辑错误!!{getreturn=selhit(4);//获取键盘输入if(getreturn==1 && !(prereturn==1)) {system("cls");printf("%s\n",title);printf("%s\tslow.\n\tmedium.\n\tfast.\n\tyou can't play with this.",point);//printf("\n%d,%d",getreturn,prereturn);//测试prereturn=1;time_delay=300;}if(getreturn==2 && !(prereturn==2))  {////!!!!!!!!!!!!有逻辑错误!!!!!!深夜头脑不清醒system("cls");printf("%s\n",title);printf("\tslow.\n%s\tmedium.\n\tfast.\n\tyou can't play with this.",point);//printf("%d,%d",getreturn,prereturn);//测试prereturn=2;time_delay=100;}if(getreturn==3 && !(prereturn==3)) {system("cls");printf("%s\n",title);printf("\tslow.\n\tmedium.\n%s\tfast.\n\tyou can't play with this.",point);prereturn=3;time_delay=50;}if(getreturn==4 && !(prereturn==4)) {system("cls");printf("%s\n",title);printf("\tslow.\n\tmedium.\n\tfast.\n%s\tyou can't play with this.",point);prereturn=4;time_delay=20;}}}//speedchoice()void menoirschoice()//是否穿墙设定 //名字起错了 {count=1;int getreturn=1;int prereturn=0;char point[]="--->";char title[]="do you want to across the wall?  ";while(!getreturn==0){getreturn=selhit(2);if(getreturn==1 && !(prereturn==1)) {system("cls");printf("%s\n",title);printf("%s\tno.\n\tyes.",point);prereturn=1;}if(getreturn==2 && !(prereturn==2)) {system("cls");printf("%s\n",title);printf("\tno.\n%s\tyes.",point);prereturn=2;}ismenoirs=prereturn-1;//0为不能穿墙,1为可以穿墙}}//menoirschoice()int main(){direction = 'r';/*全局变量方向!!初始向右*/pre_dir = 'r';hasfood=0;iscrash=0;mark=0;speedchoice();menoirschoice();InitQueue();system("cls");printf("mark:%d\tspeed:%d\t\tcontrol:left:A right:D up:W down:S\n",mark,1000/time_delay);drawframe();while(!iscrash)     {if(!hasfood) {createfood();hasfood=1;}//system("cls");printimage();sleep(time_delay);checkkb();//检查键盘 movenext();checkcrash();getlocation(5,0);//更新分数 printf("%d",mark);}//end while//printf("mark:%d\tspeed:%d",mark,1000/TIME_DELAY);getlocation(1,13);printf("holy crap`````you're finished````\n\t\t\t\t\tPress \"Backspace\" To Restart...");//delaytime(1000);//printf("%c",direction); while(!(getch()==8)) {} main();//重来要初始全部状态    }
原创粉丝点击