2012-04-29 57 views
-4

嗨可以有人請幫助我即時嘗試代碼與allegro蛇遊戲(在Ubuntu中)我設法寫這段代碼,但它不工作,我似乎無法找到問題,當我編譯它似乎是正常的,但是當我執行某種類型的內存問題(記憶)出現,然後當我連續執行多次沒有任何反應就開始崩潰,但片刻之後與allegro蛇遊戲

#include <allegro.h> 
#include <stdlib.h> 
#include <stdio.h> 

struct snake_node 
    { 
    int dir; 
    int x; 
    int y; 
    struct snake_node * next; 
    }snake_node; 
    typedef struct snake_node * snake; 

snake ajout_debut(snake snake,int x, int y); 
void game_over(BITMAP * buffer,int score); 
void draw_map(BITMAP * buffer); 
void draw_menu(BITMAP * buffer); 
void generate_new_apple(BITMAP * buffer,int x,int); 
void move(BITMAP* buffer,snake snake,int *score); 

int main() 
{ 
BITMAP* sprite1 ; 
int score=0; 
snake snake; 
allegro_init(); 
install_keyboard(); 
set_color_depth(16); 
if(set_gfx_mode(GFX_AUTODETECT,1366,768,0,0)!=0) 
    { 
    set_gfx_mode(GFX_TEXT,0,0,0,0); 
    allegro_message("impossible %s \n",allegro_error); 
    return -1; 
    } 
sprite1 = load_bitmap("sprite.bmp", NULL) ; 
if(!sprite1) 
    { 
    set_gfx_mode(GFX_TEXT, 0, 0, 0, 0); 
    allegro_message("Erreur ! Impossible de lire le fichier image !"); 
    return 1; 
    } 

BITMAP * buffer=create_bitmap(1366,768); 
draw_sprite(buffer, sprite1,0,0); 
blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H); 

sleep(1); 



while(!key[KEY_ESC]) 
    { 
    clear_bitmap(buffer); 
    draw_menu(buffer); 
     if(key[KEY_ENTER]) 
     { 
     clear_bitmap(buffer); 
     ajout_debut(snake,500,250); 
     while(!key[KEY_ESC]) 
      {  
      draw_map(buffer); 
      move(buffer,snake,&score); 
      blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H);   
      } 
     }   
    } 
destroy_bitmap(buffer); 
allegro_exit(); 
return 0; 

} 
END_OF_MAIN() 

void draw_menu(BITMAP * buffer) 
{ 
    textprintf(buffer,font,600,220,makecol(255,255,0),"  ******  "); 
    textprintf(buffer,font,600,250,makecol(255,255,0),"*** START GAME ***"); 
    textprintf(buffer,font,600,270,makecol(255,100,0)," (press ENTER) "); 
    textprintf(buffer,font,600,300,makecol(255,255,0),"***  HELP  ***"); 
    textprintf(buffer,font,600,320,makecol(255,100,0),"  (press H)  "); 
    textprintf(buffer,font,600,350,makecol(255,255,0),"*** QUIT GAME ***"); 
    textprintf(buffer,font,600,370,makecol(255,100,0)," (press ESC)  "); 
    textprintf(buffer,font,600,400,makecol(255,255,0),"  ******  "); 
    //blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H); 
} 

void draw_map(BITMAP * buffer) 
{ 
    rectfill(buffer,0,0,1366,10,makecol(255,0,0)); 
    rectfill(buffer,1366,0,1356,768,makecol(255,0,0)); 
    rectfill(buffer,1366,768,0,758,makecol(255,0,0)); 
    rectfill(buffer,0,0,10,768,makecol(255,0,0)); 
    //blit(buffer,screen,0,0,0,0,SCREEN_W,SCREEN_H); 
} 
void generate_new_apple(BITMAP * buffer,int x,int y) 
{ 
rectfill(buffer,x,y,x+10,y+10,makecol(255,255,0)); 
} 

void game_over(BITMAP * buffer,int score) 
{ 
clear_bitmap(buffer); 
textprintf(buffer,font,SCREEN_W/2,SCREEN_H/2,makecol(255,255,0), "*** GAME OVER ***"); 
textprintf(buffer,font,SCREEN_W/2,SCREEN_H/2+30,makecol(255,255,0),"*** SCORE :%d ***",score); 
} 

snake ajout_debut(snake s,int x, int y) 
{ 
    snake nouv; 
    nouv=(snake)malloc(sizeof(snake)); 
    nouv->x=x+10; 
    nouv->y=y+10; 
    nouv->next=s; 
    s=nouv; 
return s; 

} 
void move(BITMAP* buffer,snake snake,int *score) 
{ 
int applex = (int)(rand()%1336+10); 
int appley = (int)(rand()%738+10); 
generate_new_apple(buffer,applex,appley); 
clear_keybuf(); 

    if (key[KEY_LEFT]) 
     { 
     while(snake->next!=NULL) 
     { 
     if(snake->x > 10) 
     snake->x=snake->x-1; 
     else 
     game_over(buffer,score); 
     } 
    } 
    if(key[KEY_RIGHT]) 
    { 
     while(snake->next!=NULL) 
     { 
     if(snake->x < 1356) 
     snake->x=snake->x+1; 
     else 
     game_over(buffer,score); 
     } 
    } 
    if(key[KEY_UP]) 
    { 
     while(snake->next!=NULL) 
     { 
     if(snake->y > 10) 
     snake->y=snake->y-1; 
     else 
     snake->y=snake->y+1; 
     } 
    } 
    if(key[KEY_DOWN]) 
    { 
     while(snake->next!=NULL) 
     { 
     if(snake->y < 758) 
     snake->y=snake->y+1; 
     else 
     game_over(buffer,score); 
     } 
    } 
if(snake->x==applex && snake->y==appley) 
{ 
    rectfill(buffer,applex,appley,applex+10,appley+10,makecol(0,0,0)); 
    applex = (int)(rand()%1336+10); 
    appley = (int)(rand()%738+10); 
    generate_new_apple(buffer,applex,appley); 
    snake=ajout_debut(snake,snake->x,snake->y); 
    *score++; 
} 
} 
+6

歡迎來到Stack Overflow!要求陌生人通過檢查發現代碼中的錯誤並不是富有成效的。您應該使用調試器或打印語句來識別(或至少隔離)問題,然後回來一個更具體的問題(一旦您將其縮小到10行[測試用例](http:///sscce.org))。 –

回答

2

一個問題,我注意到。

退房編譯器警告

sanke.c:134:7: warning: passing argument 2 of ‘game_over’ makes integer from pointer without a cast [enabled by default]

你有功能

void game_over(BITMAP * buffer,int score);

你叫

game_over(buffer,score);

內部功能

void move(BITMAP* buffer,snake snake,int *score)

因此你將指針傳遞到int score在功能move起作用game_over它接受爲一個整數。

改爲撥打game_over (buffer, *score)

EDIT

一個片段:

if(key[KEY_RIGHT]) 
    { 
     while(snake->next!=NULL) 
     { 
     if(snake->x < 1356) 
     snake->x=snake->x+1; 
     else 
     game_over(buffer,*score); 
     } 
    } 

while檢查snake->next != NULL但它從未在體內更新,因此,這是一個無限循環。

調試器在崩潰時顯示一個奇怪的負值x

建議:請自行追蹤。

+1

@KhaledHoues - 擴展這個,你應該使用啓用'-Wall'的警告進行編譯,並嘗試修復代碼,以便所有代碼都得到解決,或者你確切地知道在每種情況下它都可以。 – Edmund

+0

這是我第一次使用allegro和Ubuntu作爲事實,它不像我是一個有經驗的開發人員(昨天我發現了鏈表),所以我非常感謝幫助,我將非常感激,如果你能解釋我的這一部分「,同時檢查snake-> next!= NULL,但它從未在主體中更新,因此這是一個無限循環。 調試器在崩潰時顯示一個奇怪的x負值。 –

+0

嗨朋友我得到了這個錯誤,我不知道它是什麼意思,它什麼時候發生:*** glibc檢測*** ./prog:malloc()=內存損壞(快):0x09e4db48 *** –