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ę.