Batalla naval en PHP

De Cacauet Wiki
Salta a la navegació Salta a la cerca

Anem a fer un joc de batalla naval en PHP.

Requeriments

  1. El servidor tindrà una partida emmagatzemada (fixa o aleatòria)
  2. L'usuari anirà destapant els quadres. El servidor, depenent de l'entrada de l'usuari, hi pintarà:
    • si es troba una vaixell hi pintarà una "X"
    • si no n'hi ha, pintarà aigua "~"
  3. S'han d'acumular els quadres destapats.
  4. Cal de desactivar els quadres ja destapats perquè l'usuari no els torni a enviar.
  5. Cal comprovar el final de partida (tots els vaixells enfonsats) amb la funció final_de_partida()
  6. Donarem la puntuació a l'usuari (nombre d'intents totals realitzats).


Disseny

Contemplem dues estratègies:

  • Utiltizant sessions: és la única manera de poder fer una partida amb vaixells col·locats aleatòriament.
  • Sense sessions: només podrem fer una partida fixa, i podem arrossegar els valors de la partida amb un formulari amb checkboxes.


Implementació sense sessions i formulari gegant

Arxiu principal

<html>
<head>
<style>
	td {
		width: 2em;
		height: 2em;
		text-align: center;
	}
	.aigua {
		background-color: blue;
	}
	.tocat {
		background-color: red;
	}
</style>
</head>

<body>
<h1>Batalla naval sense sessions</h1>
<?php //if(isset($_POST["shootme"])) print_r($_POST["shootme"]); ?>
<form method="post">
<table>
<?php
	require('batalla_funcions.php');

	// vaixells predefinits o "hardcoded"
	$vaixells = array( "12", "13",		// 1 vaixell de 2 posicions
			   "35", "45", "55"	// 1 vaixell de 3 posicions
			 	);
	// pintem tauler i ens retorna el nº de vaixells tocats
	$tocats = pinta_tauler($vaixells);
?>
</table>
<input type="submit" />
</form>
<?php
	if( $tocats==count($vaixells) ) {
		echo "<p>FELICITATS! Has destruit tota la flota enemiga!</p>\n";
		echo "<p>Puntuació: ".puntuacio()."</p>\n";
	}
?>
</body>
</html>

Arxiu batalla_funcions.php

<?php

function pinta_tauler( $vaixells ) {
	$tocats = 0;
	// doble bucle per fer files (i) i columnes (j)
	for( $i=0; $i<=8; $i++ ) { 
		echo "<tr>\n";
		for( $j=0; $j<=8; $j++ ) {
			$estilcss = "";
			$contingut = "";
			$checked = "";
			$readonly = "";
			if( $i==0 )
				// pintem nº de columna
				$contingut = "$j";
			elseif( $j==0 )
				// pintem nº de fila
				$contingut = "$i";
			else {
				if( isset($_POST["shootme"]) ) {
					// revisem si la cel·la actual $i$j esta a l'array de vaixells
					if( in_array("$i$j",$vaixells) && in_array("$i$j",$_POST["shootme"]) ) {
						// tocat!!
						$estilcss = "tocat";
						$checked = "checked";
						// cal posar readonly (i no disabled) per bloquejar la casella
						$readonly = "readonly";
						$tocats++;
					}
					elseif( in_array("$i$j",$_POST["shootme"]) ) {
						// aigua!!
						$estilcss = "aigua";
						$checked = "checked";
						$readonly = "readonly";
					}
					// si no està a $_POST es que no hem disparat
				}
				// pintem formulari
				$contingut .= "<input type='checkbox' name='shootme[]' value='$i$j' $checked $readonly />";
			}
			echo "<td class='$estilcss'>$contingut</td>\n";
		}
		echo "</tr>\n";
	}	
	return $tocats;
}

function puntuacio() {
	if( !isset($_POST["shootme"]) )
		return 0;
	return count($_POST["shootme"]);
}

?>


Implementació amb sessions

...