Gra w statki w C, ruch komputera

0

Hej. Pisze sobie statki w C w konsoli. Wiekszosc napisalem juz, ale pojawia sie u mnie problem przy ruchu komputera.
Nie za bardzo wiem jak zaimplementowac 'inteligentne' strzelanie, czyli jak trafi w jakis statek, to zeby trafial blisko tego pola, a tym bardziej jak trafi juz dwa/trzy maszty. Wazne tez byloby zaznaczenie, kiedy statek bedzie juz zatopiony, aby wrocil do randomowego strzelania.

Szukalem po necie gotowych, by moc sie wzorowac, to znajdywalem tylko w innych jezykach[niestety, ale poki co mialem stycznosc tylko z C].

No i jezeli daloby sie przy okazji podsunac lepszy pomysl, w jaki moglby randomo strzelac[z czasem zajmuje to coraz dluzej, moze losowanie z pliku i usuwanie strzelonych?], to tez bym sie ucieszyl.

Wrzuce to, co juz sam zrobilem, tak bedzie chyba najlepiej.

http://przeklej.org/file/qmXDBU/BattleShips.v.1.0.rar

Uzywam MS Visual Studio 2010 jak cos. Dzieki z gory za kazda sugestie :)

0

Zagraj rundkę ze znajomym na papierze. Uważnie notuj swoje działania przy strzałach.
Dokładnie tak samo zachowa się komputer.

0

Na takim łopatologicznym poziomie to rozumie, ze jak trafi, to ma szukac nad/pod/obok. Jezeli trafi juz dwa/trzy maszty[i o ile nie jest zatopiony], to ma szukac wzdluz poziomu lub pionu az do zatopienia.

Jak pisalem, bardziej u mnie problem lezy w zaimplementowaniu tego, czyli jak stwierdzic, ze statek zostal juz zatopiony[wszystkim statkom przypisalem wartosc 1 w tablicy, aby uniknac warunkow sprawdzania przy strzelaniu] - chociaz przychodzi mi na mysl, ze moge zapisac gdzies te wspolrzedne i najwyzej je sprawdzac, albo w jaki sposob zapisac poprzedni/e strzaly i je sprawdzac - czyli ogolem na czym bazowac.
Troche tez boje sie miliona warunkow, ktore bedzie trzeba wprowadzic, wiec moze to po prostu to?

2

Co masz do dyspozycji? Planszę.

[?][?][?]
[?][?][?]
[?][?][?]

Co się stanie gdy strzelisz? Zaznaczasz to.

[*][?][?]
[?][?][?]
[?][?][?]

Jesteś informowany o trafieniu w statek.

[*][?][?]
[?][x][?]
[?][?][?]

Każdym trafieniu w statek...

[*][?][?]
[?][x][?]
[?][x][?]

Jesteś także informowany o tym, że takowy statek zatopiłeś.

[*][#][?]
[?][#][?]
[?][#][?]

Dokładnie to odwzoruj w pamięci.

0

Jezeli dobrze Cie zrozumialem, to Ty mnie zle zrozumiales ;p. Nie mam problemu ze strzalami gracza, ten problem obszedlem stosujac kolory konkretnych statkow[wiem, ze na tym gra nie polega, ale mi wystarczy poki co].

Komputer gdy trafi, musialby ta informacje gdzies zapisac[badz pozniej przeszukac tablice, ze tak sie stalo jezeli dobrze rozumiem]. No i jak napisalem, nie wiadomo czy statek zostal zatopiony, bo w tablicy sa zapisane jako 1, nie sa rozdzielane[moge to zrobic, ale znacznie utrudni to pozniej sprawdzanie czy trafiono - bo znowu rozdzielenie na 4].

0

Jezeli dobrze Cie zrozumialem, to Ty mnie zle zrozumiales ;p

Jak pisalem, bardziej u mnie problem lezy w zaimplementowaniu tego, czyli jak stwierdzic, ze statek zostal juz zatopiony[...]
ekhem :P

Rozważmy to inaczej - próbujemy zestrzelić statek na planszy 3x3

  a  b  c
1[?][?][?]
2[?][?][?]
3[?][?][?]

Oddajemy strzał - poszukujemy jakiegoś statku do zestrzelenia.

  a  b  c
1[?][?][?]
2[?][x][?]
3[?][?][?]

Oho, udało się! Jakiś kawałek statku był na pozycji b2! Możliwe pozycje kolejnych fragmentów statku to [b1, b3, a2, c2], czyli sąsiedzi punktu startowego b2
Próbujemy na powiedzmy... b1!

  a  b  c
1[?][*][?]
2[?][x][?]
3[?][?][?]

Niestety, pudło. Zostały nam następujące pozycje [b3, a2, c2]
Próbujemy na powiedzmy... b3!

  a  b  c
1[?][*][?]
2[?][x][?]
3[?][*][?]

Znowu pudło. Pozostałe pozycje to [a2, c2], niesprawdzeni sąsiedzi punktu startowego b2
Próbujemy na powiedzmy.. a2!

  a  b  c
1[?][*][?]
2[x][x][?]
3[?][*][?]

Udało się! Znamy już ułożenie statku - pionowe. w takim wypadku ostatnią możliwą pozycją jest [c2]

  a  b  c
1[?][*][?]
2[#][#][#]
3[?][*][?]

Zatopiony, czas na szampana.

0

Zaczalem robic to jakos i powoli cos wychodzi, ale mam problem przy sprawdzaniu czy jest cos zatopione, mecze sie z tym dobra godzinke. Fajnie by bylo, gdyby ktos rzucil okiem. Jezeli jakichs zmiennych nie zadeklarowalem w funkcji, to dalem je jako globalne - latwiej mi tak pracowac.
Jak sie program zachowuje? Gram sobie, komputer zestrzeli mi np. 4 masztowiec do konca, az w koncu nie ma gdzie trafiac[w okolo puste/trafione pola] - czyli tak jakby nie wywolywal funkcji czyZatopione[dalem sobie dzwiek z komputerka gdyby ta funkcja sie wywolala - cisza]. Na wszelki wypadek u siebie wklepalem ja przed kazdym rysowaniem[je mam na pewno dobrze]

Funkcja, ktora sprawdza czy sa trafione do konca masztowce, jezeli tak, to wklepuje w nich zatopienie

void czyZatopione(char statkiGracza[10][10])
{
if(cztero)
{
	if(F4==1) //F4, podobnie jak F3, F2 i F1 mowi o polozeniu pionowym/poziomym statku
	{
		if(statkiGracza[X4][Y4]=='T'&& statkiGracza[X4][++Y4]=='T')
		{
			if(statkiGracza[X4][++Y4]=='T')
			{
				if(statkiGracza[X4][++Y4]=='T')
				{
					Y4-=3;
					statkiGracza[X4][Y4]='Z';
					statkiGracza[X4][++Y4]='Z';
					statkiGracza[X4][++Y4]='Z';
					statkiGracza[X4][++Y4]='Z';
					cztero=0;
					traf=0;
					
				}
				else Y4-=3;
			}
			else Y4-=2;
		}
		else --Y4;
	}

	if(F4==0)
	{
		if(statkiGracza[X4][Y4]=='T'&& statkiGracza[++X4][Y4]=='T')
		{
			if(statkiGracza[++X4][Y4]=='T')
			{
				if(statkiGracza[++X4][Y4]=='T')
				{
					X4-=3;
					statkiGracza[X4][Y4]='Z';
					statkiGracza[++X4][Y4]='Z';
					statkiGracza[++X4][Y4]='Z';
					statkiGracza[++X4][Y4]='Z';
					cztero=0;
					traf=0;
				}
				else X4-=3;
			}
			else X4-=2;
		}
		else --X4;
	}
}

if(troj)
{
	if(F3==1)
	{
		if(statkiGracza[X3][Y3]=='T'&&statkiGracza[X3][++Y3]=='T')
		{
			if(statkiGracza[X3][++Y3]=='T')
			{
				Y3-=2;
				statkiGracza[X3][Y3]='Z';
				statkiGracza[X3][++Y3]='Z';
				statkiGracza[X3][++Y3]='Z';
				troj=0;
				traf=0;
			}
			else Y3-=2;
		}
		else --Y3;
	}

			if(F3==0)
			{
				if(statkiGracza[X3][Y3]=='T'&&statkiGracza[++X3][Y3]=='T')
				{
					if(statkiGracza[++X3][Y3]=='T')
					{
						X3-=2;
						statkiGracza[X3][Y3]='Z';
						statkiGracza[++X3][Y3]='Z';
						statkiGracza[++X3][Y3]='Z';
						troj=0;
						traf=0;
					}
					else X3-=2;
				}
				else --X3;
			}
}

if(dwu)
{
	if(F2==1)
	{
		if(statkiGracza[X2][Y2]=='T'&&statkiGracza[X2][++Y2]=='T')
		{
			Y2-=1;
			statkiGracza[X2][Y2]='Z';
			statkiGracza[X2][++Y2]='Z';
			dwu=0;
			traf=0;
		}
		else --Y2;
	}

	if(F2==0)
	{
		if(statkiGracza[X2][Y2]=='T'&&statkiGracza[++X2][Y2]=='T')
		{
			X2-=1;
			statkiGracza[X2][Y2]='Z';
			statkiGracza[++X2][Y2]='Z';
			dwu=0;
			traf=0;
		}
		else --X2;
	}
}



if(jedno)
{
	if(statkiGracza[X1][Y1]=='T')
	{
		statkiGracza[X1][Y1]='Z';
		jedno=0;
		traf=0;
	}
}

}
 

I na przykladzie wybierania 4romasztowca, gdzie dane sa zapisywane.

void wybieranie_4romasztowca(char statkiGracza[10][10])
{
int i=4, j=4, flaga=1;
char z='A' ;

	while(1)
{
	z=getch();
	if(z==strzalka_LEWO)//zdefiniowany jest kod strzalek
	{
		if(j==0)
			continue;
		j--;
		if(flaga==1)
			rysowanieplanszyPoziom( j, i, statkiGracza);//funkcja, ktora zawiera strukture COORD, rysuje plansze i nie ingeruje w j oraz i
		else if(flaga==0)
			rysowanieplanszyPion( j, i, statkiGracza);
	}
	if(z==strzalka_PRAWO)
	{
		
		if(flaga==1)
		{
			if(j==6)
				continue;
			j++;
			rysowanieplanszyPoziom( j, i, statkiGracza);
		}
		else if(flaga==0)
		{
			if(j==9)
				continue;
			j++;
			rysowanieplanszyPion(j, i, statkiGracza);
		}
	}
	if(z==strzalka_GORA)
	{
		if(i==0) 
			continue;
		i--;
		if(flaga==1)
			rysowanieplanszyPoziom( j, i, statkiGracza);
		else if(flaga==0)
			rysowanieplanszyPion( j, i, statkiGracza);
	}
	if(z==strzalka_DOL)
	{
		
		if(flaga==1)
		{
			if(i==9)
				continue;
			i++;
			rysowanieplanszyPoziom( j, i, statkiGracza);
		}
		else if(flaga==0)
		{
			if(i==6)
				continue;
			i++;
			rysowanieplanszyPion( j, i, statkiGracza);
		}
	}
	if(z==9)//klawisz tabulacji - ma zmieniac poziom na pion i odwrotnie
	{
		if(flaga==1)
		{
			if(i<7)
			{
				flaga=0;
				rysowanieplanszyPion(j, i, statkiGracza);
			}
		}
		else if(flaga==0)
		{
			if(j<7)
			{
				flaga=1;
				rysowanieplanszyPoziom(j, i, statkiGracza);
			}
		}
	}

	if(z==' ') //klawisz spacji
	{
			
		if(flaga==1)
		{
			X4=i;//zapisuje wartosci wspolrzednych glownego klocka oraz czy jest to poziom/pion
			Y4=j;
			F4=1;
			statkiGracza[i][j]=1;
			statkiGracza[i][++j]=1;
			statkiGracza[i][++j]=1;
			statkiGracza[i][++j]=1;
			break;
		}
		else if(flaga==0)
		{
			X4=i;
			Y4=j;
			F4=0;
			statkiGracza[i++][j]=1;
			statkiGracza[i++][j]=1;
			statkiGracza[i++][j]=1;
			statkiGracza[i][j]=1;
			break;
		}
	}
}

}

 

Moge dorzucic jeszcze kod gdzie strzela, ale nie chce robic balaganu poki co. Dzieki z gory :)

0

Nie, nikt nie rzuci okiem na to spaghetti. Jedynie debugger może ci pomóc.

0

nie wiem czy ktoś o tym wspomniał ale standardowy algorytm wygrywania w statki to strzelanie w co drugie pole (na przemian co drugą linię) - w ten sposób najszybciej trafisz wszystkie dwu-, trzy- i czteromasztowce. Na koniec zostaną tylko jednomasztowce do obstrzelenia ale tych pól zostanie mało bo statki nie mogą się stykać

1 użytkowników online, w tym zalogowanych: 0, gości: 1