分享一个纯自己思路的贪吃蛇程序,有一个问题大家分析下,程序运行内存占用越来越多,是哪里代码的问题,求点出。
程序代码:
#include <conio.h> #include <stdlib.h> #include <stdio.h> #include <windows.h> #include <string.h> #include <pthread.h> #include <unistd.h> long speed=125000;//运动速度 int result=4;//记录当前方向 typedef struct node {//记录key(蛇身) int x; int y; struct node *next; } slink; void gotoxy(int x,int y); /*定义gotoxy函数*/ void run();//程序运行函数 int *move(int i,int x,int y,int xv,int yv);//移动笑脸 int achieve_key_value();//获取用户操作指令 void display(int i,int x,int y);//显示图像 void welcome();//欢迎使用函数 void bye();//游戏结束函数 void draw_border();//画边框函数 slink *record_key(slink *h,int i,int j);//插入一个节点 int read_key(slink *h,int i,int j,int k);//判断是否为链表本身 void Initialization_data();//初始化data.txt文件 void history(int i,int j,int k);//记录历史操作 slink *clear_end(slink *h);//清除链表尾部 int produce_num(int i);//生成合规随机数 int *produce_good(slink *h,int j);//生产食物函数 int sleep_order();//程序休眠时间 void printf_value(int i);//显示分数 void main(){ run(); //程序运行函数 } void run(){ struct point{ int x, y;/*该点的位置,包括x坐标和y坐标*/ int xv, yv;/*该点在x轴,y轴的速度*/ }man; int i,*key,*good,goods[2]; slink *h,*q; long j=1,k=0;//记录链表的长度 man.x=30;//初始化图像位置 man.y=15;//初始化图像位置 man.xv=2;//该表情每移动一次至少占一个光标的位置 man.yv=1;//表情每移动一次至少占一行光标的位置 welcome(); //欢迎使用函数 draw_border();//画边框函数 h=(slink *)malloc(sizeof(slink));//记录链表头 h->x=20; h->y=20; q=h; Initialization_data(); //初始化data.txt文件 while(1){ pthread_t t1,t2; pthread_create(&t1,NULL,achieve_key_value,NULL); pthread_create(&t1,NULL,sleep_order,NULL); if(!pthread_join(t1,NULL)){ i=result; if(i){ key=move(i,man.x,man.y,man.xv,man.yv);//移动笑脸 man.x=key[0]; man.y=key[1]; if(read_key(h,man.x,man.y,j)){//判断是否撞到自己 q=record_key(q,man.x,man.y);//插入一个节点 history(man.x,man.y,j); //记录历史操作 display(1,man.x,man.y);//显示图像 if(k>3){ if(k==4){//第一次生成食物 good=produce_good(h,j);//生成食物坐标 goods[0]=good[0]; goods[1]=good[1]; display(2,goods[0],goods[1]);//显示食物图像 printf_value(0); } if(man.x!=goods[0]||man.y!=goods[1]){//判断是否做清除尾部的操作,即吃到食物 h=clear_end(h);//执行链表尾部清除操作,不是吃到食物 j--;//链表长度减1 } else{//吃到食物,重新生成食物 good=produce_good(h,j);//生成食物坐标 goods[0]=good[0]; goods[1]=good[1]; speed=speed-750; display(2,goods[0],goods[1]);//显示食物图像 printf_value(j-4); } } j++;//链表长度加1 k++;//用户操作次数加1 } else{ bye(1);//游戏结束函数 break; } } else{ bye(2);//游戏结束函数 break; } } } } void gotoxy(int x,int y){ /*定义gotoxy函数*/ COORD c; c.X=x-1; c.Y=y-1; SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c); } int *move(int i,int x,int y,int xv,int yv){ int key[2]; switch(i){ case 1:y-=yv; break; case 2:y+=yv; break; case 3:x-=xv; break; case 4:x+=xv; break; default:break; } //光标超范围回复 if(x<2){ x=2; } if(y<2){ y=2; } if(x>58){ x=58; } if(y>28){ y=28; } key[0]=x; key[1]=y; return key; } int achieve_key_value(){ int ch,i=result; switch(ch=getch()){//获取用户按下的按键 case 0xE0:switch(ch=getch()){//分析按键 case 72:i=1; break; case 80:i=2; break; case 75:i=3; break; case 77:i=4; break; default:break; } break; default:break; } if(result==1&&i==2){i=1;}//不回头检测 if(result==2&&i==1){i=2;}//不回头检测 if(result==3&&i==4){i=3;}//不回头检测 if(result==4&&i==3){i=4;}//不回头检测 result=i; } void display(int i,int x,int y){ gotoxy(x,y);/*把光标移到指定的坐标*/ if(i){ if(i==2){ printf("☆"); } else{ printf("■");/*输出ASCII码值为2的"笑脸"字符*/ } } else{ printf(" ");/*输出一个空格,把先前的字符擦去*/ } } void welcome(){ system("cls"); printf("欢迎使用这个小游戏!\n"); printf("按方向键即可!\n"); system("pause"); system("cls"); } void bye(int i){ system("cls"); if(i==1){ printf("撞到了 -> game end!\n");//游戏结束 } if(i==2){ printf("游戏结束 -> game end!\n");//游戏结束 } system("pause"); system("cls"); printf("感谢您的使用!\n"); system("pause"); system("cls"); } void draw_border(){ int i; for(i=1;i<=30;i++){ gotoxy(i,1); printf("-"); gotoxy(i,30); printf("-"); gotoxy(1,i); printf("|"); gotoxy(60,i); printf("|"); } for(i=30;i<60;i++){ gotoxy(i,1); printf("-"); gotoxy(i,30); printf("-"); } } slink *record_key(slink *q,int i,int j){//插入一个节点 slink *s; s=(slink *)malloc(sizeof(slink)); s->x=i; s->y=j; q->next=s; return s; } int read_key(slink *h,int i,int j,int k){//判断是否撞倒 slink *q; q=h; int l; for(l=0;l<k;l++){ if(i==q->x&&j==q->y){ return 0; } q=q->next; } return 1; } void history(int i,int j,int k){ FILE *fp; fp = fopen("data.txt","a"); fprintf(fp,"%5.0d --> x:%2.0d | y:%2.0d\n",k,i,j); fclose(fp); } void Initialization_data(){ FILE *fp; fp = fopen("data.txt","w"); fclose(fp); } slink *clear_end(slink *h){ slink *q; q=h->next;//将指针移动至尾部第二个节点 display(0,h->x,h->y); //清除图像 free(h);//释放内存孔径 h=NULL; return q; } int produce_num(int j){ int i=-1; srand(rand()*time(NULL)); if(j){ while(i%2!=0||i<2){ i=rand()%58; } } else{ while(i<2){ i=rand()%28; } } return i; } int *produce_good(slink *h,int j){ int good[2]; good[0]=produce_num(1); good[1]=produce_num(0); while(!read_key(h,good[0],good[1],j)){//判断是否在链表上 good[0]=produce_num(1); good[1]=produce_num(0); } return good; } int sleep_order(){ usleep(speed); } void printf_value(int i){ gotoxy(70,10); printf("分数:%d",i); } 源码和可执行文件在附件中
retro_snaker.rar
(51.71 KB)