Я кодирую игру для нашего финального проекта в нашем главном, используя 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.
Примечание: используется спрайтов корабль FF, потому что я не закончил создание мой собственный.
У вас здесь много кода, и похоже, что у вас несколько ошибок. Я бы порекомендовал вам разбить этот вопрос на два или три более конкретных вопроса только с секцией кода, которая имеет отношение к каждой проблеме. – pzp
Извините. Я обрезал код. И удалили ненужные. Спасибо, что указали это. –
Я хотел бы увидеть [MCVE] (http://stackoverflow.com/help/mcve), поэтому было бы легче проанализировать проблему. – TobiMcNamobi