Witam,
Robię grę Statki i mam problem z rozstawianiem statków przez komputer tzn. komputer losuje jakieś współrzędne i wstawia krzyżyk w określone miejsce. Przy jednomasztowcach nie mam problemu, gdyż poprawnie się wstawiają. Mam problem jednak gdy statek ma być wielomasztowy tzn. składający się z kilku krzyżyków. Przykładowo mam 2-masztowce i wstawiam ich kilka to czasem pojawi się taki problem:
XX
X
albo
XXX
X
I są one traktowane przez program jako dwa 2-masztowce, lecz tak nie jest.
Mój kod dla jednomasztowców wygląda tak:
int i, j, x, y;
randomize();
for (i = 1; i < 11; i++) {
for (j = 1; j < 11; j++) {
Komputer->Cells[i][j]="";
}
}
for (int i = 0; i < 10; i++) {
Komputer->Cells[i+1][0]=i+1;
Komputer->Cells[0][i+1]=i+1;
Gracz->Cells[i+1][0]=i+1;
Gracz->Cells[0][i+1]=i+1;
}
// 5xjednomasztowce
i=0;
while (i != 5)
{
x=rand()%10+1;
y=rand()%10+1;
if (((x+1>1 && x+1<11)||(x-1>1 && x-1<11))&&((y+1>1 && y+1<11)||(y-1>1 && y-1<11)))
{
if ((Komputer->Cells[x][y]!="X")&&(Komputer->Cells[x+1][y]!="X")&&(Komputer->Cells[x][y+1]!="X")&&(Komputer->Cells[x][y-1]!="X")&&(Komputer->Cells[x-1][y]!="X"))
{
Komputer->Cells[x][y]="X";
i++;
}
}
}
Wiem, wiem pewnie da się to zrobić o wiele, wiele prościej, ale już nie mam pomysłów (trochę się już z tym męcze).
W przypadku wielomasztowców wymyśliłem, że najlepiej będzie jak komputer wylosuje sobie te współrzędne, a później będzie losować kierunek gdzie statek zostanie wstawiony np. 0-góra, 1-prawo, 2-dół, 3-lewo. Oto mój kod dla 2-masztowców:
i=0;
int kierunek;
while (i != 4)
{
x=rand()%10+1;
y=rand()%10+1;
kierunek=rand()%4;
ListBox1->Items->Add("x="+IntToStr(x)+" y="+IntToStr(y));
if (((x+1>1 && x+1<11)&&(x-1>1 && x-1<11))&&((y+1>1 && y+1<11)&&(y-1>1 && y-1<11)))
{
if (Komputer->Cells[x][y]!="X" || Komputer->Cells[x][y+1]!="X" || Komputer->Cells[x+1][y]!="X" || Komputer->Cells[x][y-1]!="X" || Komputer->Cells[x-1][y]!="X")
{
if (kierunek==0) {
Komputer->Cells[x][y]="X";
Komputer->Cells[x][y+1]="X";
}
else if (kierunek==1) {
Komputer->Cells[x][y]="X";
Komputer->Cells[x+1][y]="X";
}
else if (kierunek==2) {
Komputer->Cells[x][y]="X";
Komputer->Cells[x][y-1]="X";
}
else if (kierunek==3) {
Komputer->Cells[x][y]="X";
Komputer->Cells[x-1][y]="X";
}
i++;
}
}
}
Właściwie zauważyłem też, że warto tu napisać jakąś funkcję którą by się wywoływało z odpowiednimi paramentami, ale na razie chciałbym się uporać z tym problemem. Jeżeli jesteście w stanie mi pomóc to bardzo proszę.