Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приложение виснет или глючит,не могу найти почему, пожалуйста, помогите 
V
    Опции темы
powerfox
  Дата 14.6.2006, 19:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Приложение либо зависает, либо makefood() делает координаты, равные одной из частей snakeparts[], чего не должно быть, проверка, вроде бы, не должна глючить. Одно из возможных мест зависаний - строка 170 driver.cpp. А может быть ошибка, если таймер запускает функцию, выполняемую в данный момент(на большей скорости чаще виснет).
Вот ссылка на приложение: Архив

driver.cpp:
Код

#include<iostream>
#include"snake.h"
#include<vector>
#include<cstdlib>
#include<time.h>//for srand

SDL_TimerID move_timer_id;
SDL_TimerID clock_timer_id;
void* move_callback_param;
void* clock_callback_param;


Uint32 move(Uint32 interval, void *param); //is called by SDL timer 
Uint32 clock(Uint32 clock_interval, void *clock_param);

int one_second = 1000;
void check_for_reverce();
void gameover();



const int width = 50;         //width of the each segment of the snake


std::vector<Snake>snakeparts(3); /* {first...lost} */
int lost = 2;

Point food;

bool stop_move = false;
int speed = 100;
int scores = 0;

int screen_width = 800;
int screen_high = 600;

int main(int argc, char *argv[]){
 snakeparts[0] = Snake(150, 0, 1, 0,0);
 snakeparts[1] = Snake(100,0,1,0,0);
 snakeparts[2] = Snake(50,0, 1, 0,0);
 initsystem(); //inits sdl, draws background,starts sound,opens ttf

 SDL_TimerID move_timer_id = SDL_AddTimer(speed, move, move_callback_param);
 SDL_TimerID clock_timer_id= SDL_AddTimer(one_second,clock,clock_callback_param);
    
        
 for(;;);

 SDL_RemoveTimer(move_timer_id);
 Mix_CloseAudio();
 return 0;
  
}





void randomize_food(unsigned int num_of_tries=1){
 long int seconds;
 while( (seconds=clock() ) == 0 || (seconds=clock() ) == 1); //to increase bad randomize
 srand(seconds*num_of_tries);
 food.xpos = width*(rand()%(screen_width-150)/width);
 food.ypos = width*(rand()%screen_high/width);
}


void makefood(){
 stop_move=false;
 DrawPart(&snakeparts[lost]);
 randomize_food();
 int num_of_bad_randoms = 1;
 for(int i=0;i<=lost;i++)
  if(food.xpos==snakeparts[i].xpos && food.ypos == snakeparts[i].ypos){
    i=-1;
    randomize_food(num_of_bad_randoms++);
    }
 Draw_food(food.xpos,food.ypos);
 stop_move=false;
 }
 
void make_sound();

int check_for_food(){
 if(snakeparts[0].xpos==food.xpos && snakeparts[0].ypos==food.ypos){
  snakeparts.resize(snakeparts.size() + 1);
  snakeparts[lost+1] = snakeparts[lost];
  lost++;

  make_sound();
  scores +=10;
  print_ttf();
  return 1;
    }
 else return 0;

}


 
int game_stop = 0;
Uint32 move(Uint32 interval, void *param) {
 while(stop_move); //whaiting while makefood is working
 SDL_Event event;
 if(SDL_PollEvent(&event) != 0)
   switch(event.type){
   case SDL_QUIT:{
    gameover();
    break;}
   case SDL_KEYDOWN:{
     if ( event.key.keysym.sym == SDLK_ESCAPE ){
    gameover();
       }
     else  switch(event.key.keysym.sym) {
    case SDLK_SPACE:{
     SDL_Delay(20000);
     break;
    }

 
    case SDLK_UP:{
     if(snakeparts[0].y_direct != 1){
     snakeparts[0].y_direct = -1;
     snakeparts[0].x_direct = 0;
       }
     break;}
    case SDLK_DOWN:{
     if(snakeparts[0].y_direct != -1){
      snakeparts[0].y_direct = 1;
      snakeparts[0].x_direct = 0;
      }
    break;}
    case SDLK_LEFT:{
     if(snakeparts[0].x_direct != 1){
      snakeparts[0].x_direct = -1;
      snakeparts[0].y_direct = 0;
      }
    break;}
    case SDLK_RIGHT:{
     if(snakeparts[0].x_direct != -1){
      snakeparts[0].x_direct = 1;
      snakeparts[0].y_direct = 0;
      }
    break;}
        }

   break;} 
   }



 
 Snake tmp = snakeparts[0]; //back up old first cords to second part
 snakeparts[0].xpos += snakeparts[0].x_direct*width;
 snakeparts[0].ypos += snakeparts[0].y_direct*width;
 
 if(snakeparts[0].xpos>=(screen_width-100)/*100-width of ttf panel*/ ||snakeparts[0].xpos<0 || snakeparts[0].ypos>screen_high-width || snakeparts[0].ypos<0)
        gameover();
 for(int i=1;i<=lost;i++)
  if(snakeparts[0].xpos==snakeparts[i].xpos && snakeparts[0].ypos==snakeparts[i].ypos)
    gameover();

 DrawPart(&snakeparts[0]);
 CleanPart(&snakeparts[lost]);

 if(check_for_food() )
   makefood();
 
 //Lets give to all parts new cords(not for first & lost)
 for(int i = lost;i>1;i--)
    snakeparts[i] = snakeparts[i-1];
 snakeparts[1] = tmp;

 return speed;
}


void gameover()
{
 std::cout<<"GAME OVER\nYour scores = " << scores<<"\n";
 SDL_RemoveTimer(move_timer_id);
 SDL_RemoveTimer(clock_timer_id);
 CD_close();
 Mix_CloseAudio();
 TTF_Quit();
 exit(0); 
}


int m1=0;
int m2=0;
int s1=0;
int s2=0;

Uint32 clock(Uint32 clock_interval, void *clock_param){
 s2++;
 if(s2>9){
    s2=0;
    s1++;}
 if(s1>=6){
    s1=0;
    m2++;}
 if(m2>9){
    m2=0;
    m1++;}
 print_time();
 return one_second;
}


void make_sound()
{
 if(Mix_OpenAudio(MIX_DEFAULT_FREQUENCY, MIX_DEFAULT_FORMAT, 2, 1024)==-1) {
    printf("Mix_OpenAudio: %s\n", Mix_GetError());
    exit(2);
 }

 Mix_Chunk *food_music = Mix_LoadWAV("sounds/food.wav");
 
 if(!food_music)
    printf("Mix_LoadWAV: %s\n", Mix_GetError());
 
 if(Mix_VolumeChunk(food_music, MIX_MAX_VOLUME) == -1)
    printf("Error while configuring volume:Mix_PlayChannel: %s\n",Mix_GetError());
 
 if(Mix_PlayChannel(-1, food_music, 0)==-1)
    printf("Mix_PlayChannel: %s\n",Mix_GetError());
}




    

Это сообщение отредактировал(а) powerfox - 15.6.2006, 10:05


--------------------
user posted image
PM WWW   Вверх
pablo
Дата 15.6.2006, 09:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 320
Регистрация: 12.2.2005
Где: Вильнюс, Литва

Репутация: 4
Всего: 6



а что отладчик говорит ? 


--------------------
Первый блин всегда похож на сферу, иногда бывает и куб.
PM MAIL ICQ   Вверх
powerfox
Дата 15.6.2006, 10:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



С зависанием разобрался, зацикливалось в строке 73(зря скормил srand snakeparts[0].xpos, так как на краю поля там выходил 0). А вот проверка в 73-74строке не всегда работает, не понятно, почему. 


--------------------
user posted image
PM WWW   Вверх
powerfox
Дата 15.6.2006, 11:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


I wanna fork()
****


Профиль
Группа: Комодератор
Сообщений: 3990
Регистрация: 1.10.2005
Где: Санкт-Петербург

Репутация: 2
Всего: 97



Разобрался с глюком: цикл 170 должен стоять перед вызовом makefood(). 


--------------------
user posted image
PM WWW   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0937 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.