AVIOANE

Busuioc Radu 333CB

Play

 

DESPRE JOC

Jocul “Avioane” este un joc cunoscut in copilarie. El se joaca intre doi adversari, care au fiecare cate doua “radare”. In primul radar, jucatorul isi pozitioneaza cele 2 avioane, iar in al doilea incearca sa loveasca avioanele adversarului. Cele 2 radare sunt 2 matrice 10x10.

Un avion este distrus daca este lovit in cap sau este ciuruit total.

Loviturile se dau alternativ, sub forma de coordonate.

Câstiga cel care reuseste sa distruga cele doua avioane ale adversarului.

IMPLEMENTARE

Jocul l-am implementat in Java sub forma de applet.

Mai intai jucatorul alege dificultatea intr-o fereastra pop-up.

In partea centrala a appletului avem cele doua “radare”. Cel din stanga este cel pe care jucatorul isi pozitioneaza avionele, iar pe cel din dreapta da loviturile.

In coltul din stanga-jos, este afisat nivelul de dificultate, iar in dreapta, scorul curent (numarul de avioane nedoborate).

In radarul din stanga apar si loviturile date de calculator. In radarul din dreapta apar loviturile date de jucator. Ele sunt codificate astfel: galben – lovitura data si esuata, rosu – lovitura reusita in capul avionului, roz – lovitura reusita.

Pentru fiecare jucator (Jucatorul si Computerul), am cate 2 matrici: radarJucator1[][] si radarJucator2[][], respectiv radarComputer1[][] si radarComputer2[][].

In radarul 1, fiecare isi are harta propriilor avioane, cu codificarea: 1 pentru corpul avionului si 2 pentru cap.

In radarul 2, fiecare are harta loviturilor date, cu codificarea: 3 ratare, 2 lovit avion inamic, 1 lovit in cap avionul inamic, 0 nu am lovit acolo inca.

Pentru jucatorul uman, folosesc aceasta harta la afisare. Am creeat corespondenta: 0 alb, 1 rosu, 2 roz, 3 galben.

In prima faza jucatorul trebuie sa aleaga pozitia avioanelor sale in primul radar. Alege locul unde va fi capul avionului printr-un click apoi pozitia corpului avionului fata de cap.

 

ALGORITM

Am diferite strategii in functie de nivelul selectat.

Nivelul: Usor

Calculatorul da lovituri random pe radar, avand totusi grija sa nu repete vreo lovitura. Generez lovitura si verific cu functia verificaRadar() daca nu cumva am mai dat acea lovitura. In cazul in care se repeta lovitura, generez alta lovitura. Calculatorul nu va da lovituri in toate patratelele radarului. Se observa ca nu se poate ca un avion inamic sa se afle cu capul in colt, si nu numai patratica din colt, ci chiar 4 patratele din colt.

	public void compUsor()
{
int k = 100;
hi = k/10;
hj = k%10;
while ((k == 100)||(!verificaRadar()))
{
k = (int)(Math.random()*100);
switch (k)
{
case 0: case 1: case 8: case 9: case 10: case 11: case 18: case 19:
case 80: case 81: case 88: case 89: case 90: case 91: case 98: case 99: k = 100; break;
}
hi = k/10;
hj = k%10;
}
loveste();
}
  

Functia loveste() marcheaza, in functie de efect (lovitura aiurea, in corpul avionului sau in cap cu codificarea respectiva 3, 2, respectiv 1), lovitura pe radarul 2 si preda “turn”-ul celuilalt jucator. Acest lucru il realizez cu o variabila intreaga turn care e 0 (e randul jucatorului) sau 1 (randul calculatorului).

 

Nivelul: Greu

In nivelul Greu am aplicat un mic backtracking. Pana la prima lovitura buna, se foloseste algoritmul de generare de la nivelul Usor.

Dupa ce am o lovitura reusita, prelucrez acel nod. Daca are vecin in jos (e o lovitura buna), bag nodul intr-o stiva lovituri si nodul curent de prelucrat este vecinul de jos. Urmatorul vecin prelucrat este cel de deasupra. Daca e deja in stiva, trec la stanga. Ultima prelucrare este la dreapta.

Daca nodul curent este prelucrat in totalitate, extrag din stiva nodul anterior, dar neprelucrat in totalitate.

Din calcule, rezulta ca in cazul cel mai nefavorabil, dupa o lovitura reusita, se nimereste capul din maxim 24 de lovituri. Deci cea mai buna strategie pentru jucatorul uman este sa-si orienteze avioanele spre stanga.

  public void compGreu() {
 	int k = 100;
 	hi = k / 10;
 	hj = k % 10;
 	if (lastGoodHit == 100) {
 		while ((k == 100)||(!verificaRadar())) {
 				k = (int)(Math.random()*100);
 				switch (k) {
						 case 0: case 1: case 8: case 9: case 10: case 11: case 18: case 19: 
						 case 80: case 81: case 88: case 89: case 90: case 91: case 98: case 99: k    = 100; break;
 					}
			 hi = k/10;
			 hj = k%10;
 		}
 loveste();
 if (radarComputer2[hi][hj] != 3) lastGoodHit = k;
 if (radarComputer2[hi][hj] == 1) lastGoodHit = 100;
 } else do {
 		 k = lastGoodHit+1; //in jos
		 hi = k / 10;
		 hj = k % 10;
		 if ((k >= 0)&&(k < 100))
		 if (verificaRadar()) {
				 loveste();
				 if (radarComputer2[hi][hj] != 3) {
							 lovituri.push(new Integer(lastGoodHit));
							 lastGoodHit = k;
 							}
				 if (radarComputer2[hi][hj] == 1) {
							 lastGoodHit = 100;
							 golesteStiva();
							 }
				 return;
 			}
		 k = lastGoodHit - 1; // in sus
		 hi = k / 10;
		 hj = k % 10;
		 if ((k >= 0)&&(k < 100))
		 if (verificaRadar()) {
				 loveste();
				 if (radarComputer2[hi][hj] != 3) {
							 lovituri.push(new Integer(lastGoodHit));
							 lastGoodHit = k;
 						}
				 if (radarComputer2[hi][hj] == 1) {
							 lastGoodHit = 100;
							 golesteStiva();
						 }
				 return;
 				}
	 k = lastGoodHit - 10; // in stanga
	 hi = k / 10;
	 hj = k % 10;
	 if ((k >= 0)&&(k < 100))
			 if (verificaRadar()) {
						 loveste();
						 if (radarComputer2[hi][hj] != 3) {
									 lovituri.push(new Integer(lastGoodHit));
									 lastGoodHit = k; 
									 }
					 if (radarComputer2[hi][hj] == 1) {
									 lastGoodHit = 100;
									 golesteStiva();
									 }
				 return;
 				}
		 k = lastGoodHit + 10; // in dreapta
		 hi = k / 10;
		 hj = k % 10;
		 if ((k >= 0)&&(k < 100))
		 if (verificaRadar()) {
					 loveste();
					 if (radarComputer2[hi][hj] != 3) {
									 lovituri.push(new Integer(lastGoodHit));
									 lastGoodHit = k; 
								 }
					 if (radarComputer2[hi][hj] == 1) {
									 lastGoodHit = 100;
									 golesteStiva();
								 }
					 return;
					 } else lastGoodHit = (Integer)lovituri.pop()).intValue();
			 } while (true);
	 }
  

Play