| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 2515 人关注过本帖, 1 人收藏
标题:分享一个纯自己思路的贪吃蛇程序,有一个问题大家分析下,程序运行内存占用 ...
只看楼主 加入收藏
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
结帖率:50%
收藏(1)
已结贴  问题点数:10 回复次数:9 
分享一个纯自己思路的贪吃蛇程序,有一个问题大家分析下,程序运行内存占用越来越多,是哪里代码的问题,求点出。
程序代码:
#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)
搜索更多相关主题的帖子: int void 函数 printf break 
2017-07-14 09:58
八画小子
Rank: 11Rank: 11Rank: 11Rank: 11
等 级:贵宾
威 望:37
帖 子:709
专家分:2063
注 册:2010-11-11
收藏
得分:4 
#include <windows.h>
#include <unistd.h>
真心不知道你这两句预编译是怎么通过的
2017-07-14 11:35
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:4 
论坛收藏贪吃蛇+1~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-14 11:36
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
还是回一下楼主的问题~是否检查没有释放空间?~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-14 12:01
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:0 
都有及时释放掉空间了。
刚刚想了一下,有没有可能是下面pthread_create(&t1,NULL,achieve_key_value,NULL);这个线程的问题。
pthread_create(&t1,NULL,achieve_key_value,NULL);
pthread_create(&t1,NULL,sleep_order,NULL);
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;
}
int sleep_order(){
    usleep(speed);
}

我是小白。。。。
2017-07-14 13:02
ehszt
Rank: 12Rank: 12Rank: 12
等 级:贵宾
威 望:40
帖 子:1745
专家分:3216
注 册:2015-12-2
收藏
得分:4 
<pthread.h> , <unistd.h>
头文件是不是在unix系统下用的?

[此贴子已经被作者于2017-7-14 13:26编辑过]

2017-07-14 13:25
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 5楼 a1017075043
你的意思是说没有及时关闭线程?~没有开电脑进行调试~如果我说得不到位还是另外想想怎么解决了~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-14 13:54
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:0 
是没有及时关闭线程,我想问一下,怎么将一个线程强制关闭掉呢?

我是小白。。。。
2017-07-14 16:45
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 8楼 a1017075043
这方面我没有接触过……具体实现指点不了~可以查查资料~

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2017-07-14 17:16
a1017075043
Rank: 2
来 自:广州
等 级:论坛游民
威 望:1
帖 子:50
专家分:63
注 册:2015-6-29
收藏
得分:0 
好的,感谢!

我是小白。。。。
2017-07-14 17:34
快速回复:分享一个纯自己思路的贪吃蛇程序,有一个问题大家分析下,程序运行内存 ...
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.050380 second(s), 10 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved