2012-04-29 2 views
-4

안녕하세요 누군가 나를 도와주세요 알레그로 (우분투에서)이 코드를 작성 관리하지만, 작동하지 않습니다 그리고 내가 그것을 컴파일 할 때 문제를 찾을 것 같다 괜찮을 것 같습니다하지만 난 메모리 문제 (메모리 맵)의 몇 가지 유형을 실행 나타나고 i가 연속으로 여러 번 실행할 때 다음 아무 일도 발생하지 않을 때 그것은 시작하지만, 잠시 내가 발견 이후알레그로와 함께 뱀 게임

#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

스택 오버플로에 오신 것을 환영합니다! 검사를 통해 코드의 오류를 찾아내는 낯선 사람에게 생산적이지는 않습니다. 디버거 나 print 문을 사용하여 문제를 확인 (또는 적어도 격리) 한 다음보다 구체적인 질문으로 돌아 가야합니다 (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)

그러므로 당신은 정수로 받아 game_over을 작동하는 기능 movescore을 int로 포인터를 전달합니다.

대신 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); 
     } 
    } 

whilesnake->next != NULL를 검사하지만 본문에 업데이트되지 않는다, 따라서 이것은 무한 반복된다.

또한 디버거에서 충돌 할 때 x의 이상한 음수 값을 보여줍니다.

제안 : 직접 추적 해주십시오.

+1

@KhaledHoues - 이것을 확장하면'-Wall'을 사용하여 경고를 컴파일하고 코드를 수정하여 모든 문제가 해결되거나 각각의 경우에 문제가 없는지를 정확히 알 수 있습니다. – Edmund

+0

사실 알레그로와 우분투를 사용하는 것은 이번이 처음입니다. 경험 많은 개발자 (어제는 링크드리스트를 발견했습니다)가 아니므로 도움을 주시면 감사하겠습니다. 설명해 주시면 매우 감사하겠습니다. 나도이 부분 "을 검사하는 동안 뱀 -> 다음! = NULL하지만 본문에서는 업데이트되지 않습니다. 따라서 무한 루프입니다 또한 디버거는 충돌시 x의 이상한 음수 값을 보여줍니다. –

+0

안녕하세요 친구가이 오류가있어 그것이 무엇을 의미하는지, 언제 발생하는지 알지 못합니다. *** glibc가 감지되었습니다. *** ./prog : malloc() = 메모리 손상 (빠름) : 0x09e4db48 *** –

관련 문제