2016-02-29 3 views
-1

Я кодирую игру для нашего финального проекта в нашем главном, используя Allegro, но у меня возникают проблемы с столкновением. Моя игра в основном - это линкоры, а то, что я сделал, после экрана загрузки появится экран, в котором вы можете выбрать координаты своих кораблей с помощью клавиш со стрелками и заблокировать его пробелом. И если выбранные вами координаты уже заняты, пробел не работает.Проверка на столкновение

Моя проблема в том, что я не могу проверить длину и ширину корабля для столкновения перед размещением. Длина и ширина корабля учитываются только тогда, когда вы уже разместили корабль, а следующее судно может пересекаться с другими кораблями. Я пробовал все, но у меня есть некоторые проблемы. И не только это, но и какая-то часть сетки не может быть выбрана, даже если она пуста.

void shipplacement(){ 

//something like a cursor for ship placement 
shipx = 0; 
shipy = 0; 

while(!placed) 
{ 
ALLEGRO_EVENT ev; 
al_wait_for_event(prepqueue, &ev); 

    if(ev.type == ALLEGRO_EVENT_KEY_DOWN) { 
    switch(ev.keyboard.keycode) { 
     case ALLEGRO_KEY_UP: 
      key[KEY_UP] = true; 
      break; 

     case ALLEGRO_KEY_DOWN: 
      key[KEY_DOWN] = true; 
      break; 

     case ALLEGRO_KEY_LEFT: 
      key[KEY_LEFT] = true; 
      break; 

     case ALLEGRO_KEY_RIGHT: 
      key[KEY_RIGHT] = true; 
      break; 

     case ALLEGRO_KEY_SPACE: 
     xcheck(); // checks the coordinates of the ship controlled 
     tst();  // checks for collision and if space bar should work 
      break; 
    } 
    } 

    else if(ev.type == ALLEGRO_EVENT_KEY_UP) { 
    switch(ev.keyboard.keycode) { 
     case ALLEGRO_KEY_UP: 
      key[KEY_UP] = false; 
      break; 

     case ALLEGRO_KEY_DOWN: 
      key[KEY_DOWN] = false; 
      break; 

     case ALLEGRO_KEY_LEFT: 
      key[KEY_LEFT] = false; 
      break; 

     case ALLEGRO_KEY_RIGHT: 
      key[KEY_RIGHT] = false; 
      break; 
      } 
      } 

if(redraw && al_is_event_queue_empty(prepqueue)){ 
     if (shippl[1]){ 
     //redraw the background and draw the "selector" 
     } 
     else if (shippl[2]){ 
     //redraw the background and draw the new "selector" and the placed ship. 
     } 
     else if (shippl[3]){ 
     //redraw the background and draw the new "selector" and the placed ships. 
     } 
     else if (shippl[4]){ 
     //redraw the background and draw the new "selector" and the placed ships. 
     } 
     else if (shippl[5]){ 
     //redraw the background and draw the new "selector" and the placed ships. 
     } 
redraw = false; 
al_flip_display();} 
    } 
}  

void tst(){ 
     if(logic == 0){ 
              makeittrue(); 
              shippl[count] = false; 
              shipfx[count] = shipx; 
              shipfy[count] = shipy; 
              count++; 
              logic++; 
              shipx = 0; 
              shipy = 0; 
              } 

     else if(logic == 1){ 
        if(!s1[xholder][yholder] && !s1[xholder][y2] && !s1[xholder][y3] && !s1[xholder][y4]){ 
               makeittrue(); 
              shippl[count] = false; 
              shipfx[count] = shipx; 
              shipfy[count] = shipy; 
              count++; 
              logic++; 
              shipx = 0; 
              shipy = 0; 
              } 
        } 
     else if(logic == 2){ 
        if(!s2[xholder][yholder] && !s2[xholder][y2] && !s2[xholder][y3] && !s1[xholder][yholder] && !s1[xholder][y2] && !s1[xholder][y3] && !s1[xholder][y4]){ 
               makeittrue(); 
              shippl[count] = false; 
              shipfx[count] = shipx; 
              shipfy[count] = shipy; 
              count++; 
              logic++; 
              shipx = 0; 
              shipy = 0; 
              } 
        } 
     else if(logic == 3){ 
        if(!s3[xholder][yholder] && !s3[x2][yholder] && !s3[x3][yholder] && !s2[xholder][yholder] && !s2[xholder][y2] && !s2[xholder][y3] && !s1[xholder][yholder] && !s1[xholder][y2] && !s1[xholder][y3] && !s1[xholder][y4]){ 
               makeittrue(); 
              shippl[count] = false; 
              shipfx[count] = shipx; 
              shipfy[count] = shipy; 
              count++; 
              logic++; 
              shipx = 0; 
              shipy = 0; 
              } 
        } 
     else if(logic == 4){ 
        if(!s4[xholder][yholder] && !s4[xholder][y2] && !s3[xholder][yholder] && !s3[x2][yholder] && !s3[x3][yholder] && !s2[xholder][yholder] && !s2[xholder][y2] && !s2[xholder][y3] && !s1[xholder][yholder] && !s1[xholder][y2] && !s1[xholder][y3] && !s1[xholder][y4]){ 
               makeittrue(); 
              shippl[count] = false; 
              shipfx[count] = shipx; 
              shipfy[count] = shipy; 
              count++; 
              logic++; 
              shipx = 0; 
              shipy = 0; 
              } 
        } 
     } 


void makeittrue(){ 
     // s1 is ship1 with length of 4 blocks 
     // s2 is ship2 with length of 3 blocks 
     // s3 is ship3 with width of 3 blocks 
     // s4 is ship4 with length of 2 blocks 
     // s5 is ship5 with width of 2 blocks 
     if(count == 1){ 
       y2 = yholder + 1; 
       y3 = yholder + 2; 
       y4 = yholder + 3; 
     s1[xholder][yholder] = true; 
     s1[xholder][y2] = true; 
     s1[xholder][y3] = true; 
     s1[xholder][y4] = true; 
     placeflag[xholder][yholder] = true; 
     placeflag[xholder][y2] = true; 
     placeflag[xholder][y3] = true; 
     placeflag[xholder][y4] = true; 
     } 

     else if(count == 2){ 
       y2 = yholder + 1; 
       y3 = yholder + 2; 
     s2[xholder][yholder] = true; 
     s2[xholder][y2] = true; 
     s2[xholder][y3] = true; 
     placeflag[xholder][yholder] = true; 
     placeflag[xholder][y2] = true; 
     placeflag[xholder][y3] = true; 
     } 

     else if(count == 3){ 
       x2 = xholder + 1; 
       x3 = xholder + 2; 
     s3[xholder][yholder] = true; 
     s3[x2][yholder] = true; 
     s3[x3][yholder] = true; 
     placeflag[xholder][yholder] = true; 
     placeflag[x2][yholder] = true; 
     placeflag[x3][yholder] = true; 
     } 

     else if(count == 4){ 
       y2 = yholder + 1; 
     s4[xholder][yholder] = true; 
     s4[xholder][y2] = true; 
     placeflag[xholder][yholder] = true; 
     placeflag[xholder][y2] = true; 
     } 

     else if(count == 5){ 
       x2 = xholder + 1; 
     s5[xholder][yholder] = true; 
     s5[x2][yholder] = true; 
     placeflag[xholder][yholder] = true; 
     placeflag[x2][yholder] = true; 
     }  
    } 

Пожалуйста, помогите мне. У меня нет идей.

EDIT

Забыл упомянуть сетка 10х10.

Sample of what happens

Примечание: используется спрайтов корабль FF, потому что я не закончил создание мой собственный.

+0

У вас здесь много кода, и похоже, что у вас несколько ошибок. Я бы порекомендовал вам разбить этот вопрос на два или три более конкретных вопроса только с секцией кода, которая имеет отношение к каждой проблеме. – pzp

+1

Извините. Я обрезал код. И удалили ненужные. Спасибо, что указали это. –

+0

Я хотел бы увидеть [MCVE] (http://stackoverflow.com/help/mcve), поэтому было бы легче проанализировать проблему. – TobiMcNamobi

ответ

0

Похоже, мне просто нужно было отдохнуть от кодирования. Мне удалось исправить это, сделав отдельные переменные для каждого корабля, чтобы я мог точно проверить каждую его часть и избежать перегрузки переменной.