分享一个纯自己思路的贪吃蛇程序,有一个问题大家分析下,程序运行内存占用越来越多,是哪里代码的问题,求点出。
程序代码:#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);
}
源码和可执行文件在附件中





~