30/09/2018, 17:03

Cần giúp đỡ giải quyết lỗi trên game 2048

Em đang học C và có tập tành ứng dụng đồ họa graphics cơ bản vào để viết game 2048. Game chạy khá ổn lúc đầu nhưng cứ đến khoảng 5000 - 6000 điểm thì lại bị đơ, em đã thử không sử dụng màn hình đồ họa và chỉ chạy cho hiển thị trên console thì thấy vẫn bình thường. Vậy mong mọi người giúp đỡ xem lỗi ở đâu và khắc phục thế nào. Liệu có phải là tràn bộ nhớ gây ra không (em cũng gà nên đoán vậy thôi)
Xin cảm ơn đã đọc!
Đây là khi nó bình thường

còn đây là khi bị lỗi


    #include <graphics.h>
    #include <conio.h>
    #include <stdio.h>
    #include <time.h>
    int arr[4][4] = {0};
    int diem = 0;
    
    //ve khung chuong trinh
    void vekhung(){
        int i,j;
        initwindow(1000,600);
        setbkcolor(15);
        cleardevice();
        setfillstyle(1,8);
        for (i=0;i<599;i+=146) bar(0,i,599,i+16);   //tao ra cac o trong
        for (i=0;i<599;i+=146) bar(i,0,i+16,599);
        setcolor(0);
        settextstyle(1,0,7);        //cho ghi diem vao
        outtextxy(610,20,"Score:");
    
    }
    
    //ham lay gia tọa do cua 1 o so, ung voi chi so trong mang co gia tri tuong ung
    int getpx(int i){  
        switch (i){
        case 0:
            return 16;
            break;
        case 1:
            return 162;
            break;
        case 2:
            return 308;
            break;
        case 3:
            return 454;
            break;
        }
    }
    //ham tra ve gia tri cong them de co duoc toa do cua chu
    int getpxtext(int giatri){  
        if (giatri<10) return 50;
            else if (giatri<100) return 30;
                else return 10;
    }
    
    //ham tra ve mau tuong ung voi gia tri cua o
    int getcl(int x){
        switch (x){
        case 0:     //mau cua o co so 0 se trung mau nen
            return 15;
            break;
        case 2:
            return 11;
            break;
        case 4:
            return 3;
            break;
        case 8:
            return 9;
            break;
        case 16:
            return 1;
            break;
        case 32:
            return 6;
            break;
        case 64:
            return 10;
            break;
        case 128:
            return 2;
            break;
        case 256:
            return 13;
            break;
        case 512:
            return 5;
            break;
        case 1024:
            return 12;
            break;
        case 2048:
            return 14;
            break;
        case 4096:
            return 4;
            break;
        case 8192:
            return 7;
            break;
        }
    }
    
    
    //hien thi len man hinh o so co toa do hang,cot va gia tri cua o do
    void hienthi(int hang,int cot,int giatri){
        setfillstyle(1,getcl(giatri));
        int i = getpx(cot), j= getpx(hang); //lay toa do cua o can phai to mau
        char str1[6],str2[8];
        bar(i,j,i+130,j+130);      //to mau cac o voi mau da duoc dinh nghia o tren
                                    //neu la o co gia trị 0 thi mau se trung mau nen
        setcolor(0);
        if (giatri) {
            //o co gia tri >0 se duoc hien thi gia trj
            sprintf(str1,"%d",giatri);
            if (giatri<1000 && giatri>0) {
                settextstyle(4,0,5);    //in ra gia tri cua o
                outtextxy(i+getpxtext(giatri),j+50,str1);
            }
            else { //so lon hon 1000 dat size 4 cho vua o
                settextstyle(4,0,4);
                outtextxy(i+getpxtext(giatri),j+50,str1);
            }
    
        }
        setcolor(5);
        sprintf(str2,"%d",diem);    //hien thi ra diem choi
        settextstyle(4,0,7);
        outtextxy(700,100,str2);
    
    }
    
    //tao so random 2 or 4, 4 chiem 5%
    int taoso(){
        srand(time(0));
        int i = rand()%20;
        if (i) return 2;
            else return 4;
    }
    //tao ra 1 so ngau nhien trong mang khi con cho trong
    
    void random(){
        int hang,cot,otrong=0;
        srand(time(0));
        for (hang=0;hang<4;hang++)
            for (cot=0;cot<4;cot++)
                if (arr[hang][cot] ==0){
                    otrong = 1;
                    break;
                }
        if (otrong){
            do{
                hang = rand()%4;
                cot = rand()%4;
            }while(arr[hang][cot]);
            arr[hang][cot] = taoso();
        }
    }
    
    
    //xu ly di khi bam di chuyen xuong
    void down(){
       int hang,cot,hang_,check;
       check = 0;
       for (cot=0;cot<4;cot++)      //cho nay se sap xep cac so don ve mot phia
            for(int hang=3;hang>0;hang--)
                for(hang_=3;hang_>0;hang_--)
                    if ((arr[hang_][cot]==0) && (arr[hang_-1][cot]!=0)){ //dk de don la phai co o trong va truoc o trong co so khac 0
                    arr[hang_][cot]=arr[hang_-1][cot];
                    arr[hang_-1][cot]=0;
                    check =1;
                    }
        for (cot=0;cot<4;cot++)
            for (hang=3;hang>0;hang--)
    			if (arr[hang][cot]==arr[hang-1][cot] && arr[hang][cot]!=0){    //cong don cac o lien nhau co cung gia tri
    				arr[hang][cot]+=arr[hang][cot];     //dk cong don la 2 o co gia tri bang nhau va khac 0
    				arr[hang-1][cot]=0;
    				diem+=arr[hang][cot];
                    check = 1;
                    }
        for (cot=0;cot<4;cot++)     //sau khi cong don kiem tra laj xem co the don tiep duoc khong
            for(int hang=3;hang>0;hang--)   //khi cong don (co the) se xuat hien cac so = 0 o giua
                for(hang_=3;hang_>0;hang_--)
                    if(arr[hang_][cot]==0){
                    arr[hang_][cot]=arr[hang_-1][cot];
                    arr[hang_-1][cot]=0;
                    }
    	if (check) random();    //chi tao so moi khi co the di chuyen hoac cong don
    }
    //xu ly di khi bam di chuyen len
    void up(){
       int hang,cot,hang_,check;
       check = 0;
       for (cot=0;cot<4;cot++)
            for(int hang=0;hang<3;hang++)
                for(hang_=0;hang_<3;hang_++)
    			if((arr[hang_][cot]==0) && (arr[hang_+1][cot]!=0)){
                    arr[hang_][cot]=arr[hang_+1][cot];
                    arr[hang_+1][cot]=0;
                    check = 1;
                    }
    	for (cot=0;cot<4;cot++)
            for (hang=0;hang<3;hang++)
    			if (arr[hang][cot]==arr[hang+1][cot] && arr[hang][cot]!=0){    //cong don cac o lien nhau co cung gia tri
    				arr[hang][cot]+=arr[hang][cot];
    				arr[hang+1][cot]=0;
    				diem+=arr[hang][cot];
    				check = 1;
                    }
    	for (cot=0;cot<4;cot++)
            for(int hang=0;hang<3;hang++)
                for(hang_=0;hang_<3;hang_++)
    			if(arr[hang_][cot]==0){
                    arr[hang_][cot]=arr[hang_+1][cot];
                    arr[hang_+1][cot]=0;
                    }
        if (check) random();
    }
    //xu ly di khi bam di chuyen sang trai
    void left(){
        int hang,cot,cot_,check;
        check = 0;
        for (hang=0;hang<4;hang++)
            for(cot=0;cot<3;cot++)
    		    for(cot_=0;cot_ <3;cot_++)
    			if ((arr[hang][cot_] == 0) && (arr[hang][cot_+1]!=0)){
                    arr[hang][cot_] = arr[hang][cot_+1];
                    arr[hang][cot_+1] = 0;
                    check = 1;
                    }
        for (hang=0;hang<4;hang++)
            for (cot=0;cot<3;cot++)
    			if (arr[hang][cot] == arr[hang][cot+1] && arr[hang][cot]!=0){  //cong don cac o lien nhau co cung gia tri
    				arr[hang][cot] += arr[hang][cot];
    				arr[hang][cot+1] = 0;
    				diem += arr[hang][cot];
                    check = 1;
                    }
         for (hang=0;hang<4;hang++)
            for(cot=0;cot<3;cot++)
    		    for(cot_=0;cot_ <3;cot_++)
    			if(arr[hang][cot_] == 0){
                    arr[hang][cot_] = arr[hang][cot_+1];
                    arr[hang][cot_+1] = 0;
                    }
        if (check) random();
    }
    
    //xu ly khi bam sang phai
    void right(){
        int hang,cot,cot_,check;
        check = 0;
        for (hang=0;hang<4;hang++)
            for(cot=3;cot>0;cot--)
                for(cot_=3;cot_>0;cot_--)
                    if ((arr[hang][cot_] == 0) && (arr[hang][cot_-1]!=0)){
                        arr[hang][cot_] = arr[hang][cot_-1];
                        arr[hang][cot_-1] = 0;
                        check = 1;
                    }
    
    	for (hang=0;hang<4;hang++)
            for (cot=3;cot>0;cot--)
    			if (arr[hang][cot] == arr[hang][cot-1] && arr[hang][cot]!=0){  //cong don cac o lien nhau co cung gia tri
    				arr[hang][cot] += arr[hang][cot];
    				arr[hang][cot-1] = 0;
    				diem+=arr[hang][cot];
                    check = 1;
                    }
        for (hang=0;hang<4;hang++)
            for(cot=3;cot>0;cot--)
                for(cot_=3;cot_>0;cot_--)
                    if(arr[hang][cot_] == 0){
                        arr[hang][cot_] = arr[hang][cot_-1];
                        arr[hang][cot_-1] = 0;
                    }
        if (check) random();
    }
    
    //kiem tra game du dieu kien ket thuc chua
    int endgame(){
        int hang,cot,otrong=0,cong=0;
        for (hang=0;hang<4;hang++)
            for (cot=0;cot<4;cot++)
                if (arr[hang][cot] ==0) otrong = 1;
        for (hang=0;hang<3;hang++)
            for (cot=0;cot<3;cot++)
            if ((arr[hang][cot]==arr[hang+1][cot]) || (arr[hang][cot]==arr[hang][cot+1]))
                cong = 1;
    
        if ((otrong==0)&&(cong==0)) return 1;  //dieu kien end game la khong con o nao trong va khong con o nao có the cong don
                else return 0;
    }
    
    void inmang(int arr[4][4]){
        for (int hang=0;hang<4;hang++){
            for (int cot=0;cot<4;cot++){
                if (arr[hang][cot]) printf("%d	",arr[hang][cot]);
                    else printf(" 	");
                }
                printf("
");
        }
    
    }
    
    
    void huongdan(){
        printf("CAM ON BAN DA CHOI GAME CUA TOI!


");
        delay(1000);
        printf("Huong dan choi Game:
");
        delay(1000);
        printf("
Vui long tat trinh go tieng Viet de co the choi.");
        printf("
Hay su  dung cac phim bam de di chuyen:");
        printf("
	+Phim 'a':sang trai");
        printf("
	+Phim 'd':sang phai");
        printf("
	+Phim 'w':sang len tren");
        printf("
	+Phim 's':sang xuong duoi");
        printf("
Hay co gang dat duoc nhieu diem nhat co the va lay duoc 2048!");
        delay(10000);
        printf("
Bay gio hay bat dau choi");
        delay(2000);
    
    }
    
    void xuly(){
        random();
        random();   //tao ra 2 so dau tien
        char ch;
        for (int hang=0;hang<4;hang++)
            for (int cot=0;cot<4;cot++)
                hienthi(hang,cot,arr[hang][cot]);
    
        while(!endgame()){
            system("cls");      //in tren console
            inmang(arr);
            printf("
Diem = %d",diem);
            for (int hang=0;hang<4;hang++)
                for (int cot=0;cot<4;cot++)
                    hienthi(hang,cot,arr[hang][cot]);
            ch = getch();
            //int x= int (ch);
            switch (ch){
            case 'w':
                up();
                break;
            case 's':
                down();
                break;
            case 'a':
                left();
                break;
            case 'd':
                right();
                break;
    
            }
    
        }
    
        setcolor(4);
        settextstyle(4,0,7);
        outtextxy(200,200,"GAME OVER!");
    }
    
    main(){
        huongdan();
        vekhung();
        inmang(arr);
        xuly();
        getch();
        system("cls");
        printf("
Diem so = %d",diem);
        printf("Ban da thua cuoc, hay khoi dong lai de choi tiep!");
        getch();
        return 0;
    
    }

Đào Hiệp viết 19:16 ngày 30/09/2018

help me! mọi người ơi giúp với

Thành Phạm viết 19:19 ngày 30/09/2018

Có thể là chưa đủ thông tin để mọi người trợ giúp cho bạn, bạn cố gắng miêu tả thật chi tiết tất cả những thứ liên quan,cả những tiên đoán/nghi ngờ của bạn để mọi người dễ nghiên cứu nhá
Có thể là thêm ít ảnh chụp màn hình nữa, bạn dùng IDE gì,… càng chi tiết càng tốt nhá .

Đào Hiệp viết 19:03 ngày 30/09/2018

cảm ơn bạn đã góp ý, mình sẽ sửa

Bài liên quan
0