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;
}
Bài liên quan
help me! mọi người ơi giúp với
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á .
cảm ơn bạn đã góp ý, mình sẽ sửa