[ Foro de PHP ]

Imprimir ganador de Juego 3 en raya en PHP

24-May-2014 00:42
pedro martinez
1 Respuestas

buenas, necesito ayuda con la parte final de este tipico proyecto del famoso juego 3 en raya de usuario vs usuario donde quien logre colocar tres "X" o "O" ya sea diagonal u horizontal o vertical, gana... mi problema es que ya una vez montado practicamente todo el programa estoy teniendo, problemas con la logica del mismo, y es que no se de que forma imprimir el ganador, supongo que es con multiples condiciones if de manera anidada, pero la verdad necesito ayuda en este apartado de imprimir el ganador segun el turno y las filas columnas o diagonales con las que haya ganado, aqui dejo lo que llevo de codigo:

archivo interfaz.php:

 
<?php
session_start();
?>
<html>
<body>
<center>
<?php
 include "jugador.php";
 include "tablero.php";
 include "logica.php";
 
 
if($_REQUEST)
{
	$tablero = new Tablero;
	$logica = new Logica;
 
	if($_POST){
		//SE HA DADO INICIO AL JUEGO
		$jugador1 = new Jugador($_POST['n1'], $_POST['n2']);
 
		//Se inicializa el tablero
		$tablero->iniciar();	
		$turno = 1; // Comienza el jugador 1
	}else
	{
		//EL JUEGO YA HA INICIADO Y SE REALIZÓ UNA JUGADA
		$turno = $_GET['turno'];
		$tablero->cambiar($_GET['pos'], $turno);
		//SE VERIFICA SI HAY UN GANADOR
		$logica->verificar();
	}
 
	echo "<h2>".$_SESSION["jugador1"]." vs. ".$_SESSION["jugador2"]."</h2>";
	//MOSTRAR EL TABLERO DE JUEGO
	if($turno==2){
			echo "El turno es para: ".$_SESSION["jugador2"]."<br><br>";
			$turno = 1;
		}
		else 
		{
			echo "El turno es para: ".$_SESSION["jugador1"]."<br><br>";
			$turno = 2;
		}
	echo '
		<table border="1">
		<tr>
			<td>'.$tablero->mostrar(11, $turno).'</td>
			<td>'.$tablero->mostrar(12, $turno).'</td>
			<td>'.$tablero->mostrar(13, $turno).'</td>
		</tr>
		<tr>
			<td>'.$tablero->mostrar(21, $turno).'</td>
			<td>'.$tablero->mostrar(22, $turno).'</td>
			<td>'.$tablero->mostrar(23, $turno).'</td>
		</tr>
		<tr>
			<td>'.$tablero->mostrar(31, $turno).'</td>
			<td>'.$tablero->mostrar(32, $turno).'</td>
			<td>'.$tablero->mostrar(33, $turno).'</td>
		</tr>
	</table>';
 
	//Boton para terminar el juego y volver a comenzar
	echo '<br>
	<input type="submit" name="terminar" value="Terminar Juego" onClick="location.href=\'interfaz.php\'">
	<form name="empezar" action="interfaz.php" method="post">
	<input type="hidden" name="n1" value="'.$_SESSION["jugador1"].'">
	<input type="hidden" name="n2" value="'.$_SESSION["jugador2"].'">
	<input type="submit" name="empezar" value="Volver a empezar"></form>';
 
}
else
{
	//EL JUEGO AÚN NO HA INICIADO
	//MOSTRAMOS EL FORMULARIO PARA INICIAR
	$jugador1 = new Jugador("Jugador 1", "Jugador 2");
	echo "<h2>Bienvenido al juego 3 en raya</h2>
	Programar en PHP es como un juego<br><br>";
	echo '
	<form name="juego" action="interfaz.php" method="post">
	<table border="1">
	<tr>
		<td>'.$_SESSION["jugador1"].' juega con <img src="imagenes/x.gif"></td>
		<td>'.$_SESSION["jugador2"].' juega con <img src="imagenes/o.gif"></td>
	</tr>
	<tr>
		<td>Ingrese el nombre:<input type="text" name="n1" size="7"></td>
		<td>Ingrese el nombre:<input type="text" name="n2" size="7"></td>
	</tr>
	</table>
	<br>
	<input type="submit" value="COMENZAR JUEGO">
	</form>';
}
 
?>
 
<br><br>
 
</center>
</body>
</html>
 


archivo jugador.php:

 
<?php
class Jugador
{
	public $nombre;
	private $puntos;
	private $vidas;
 
	public function sumarPunto()
	{
		$this->puntos++;
	}
 
	public function restarPunto()
	{
		$this->puntos--;
	}
 
	public function __construct($nom1, $nom2)
	{
		if($nom1 == "") $nom1 = "Jugador 1";
		if($nom2 == "") $nom2 = "Jugador 2";
		$_SESSION["jugador1"] = $nom1;
		$_SESSION["jugador2"] = $nom2;
		$this->puntos = 0;
	}
 
	public function mostrarPuntos()
	{
		return $this->puntos;
	}
}
 
?>
 


archivo tablero.php:

 
<?php
 
class Tablero
{
	public function iniciar(){
		$_SESSION['pos11'] = 0;
		$_SESSION['pos12'] = 0;
		$_SESSION['pos13'] = 0;
		$_SESSION['pos21'] = 0;
		$_SESSION['pos22'] = 0;
		$_SESSION['pos23'] = 0;
		$_SESSION['pos31'] = 0;
		$_SESSION['pos32'] = 0;
		$_SESSION['pos33'] = 0;
	}
 
	public function mostrar($posicion, $turno){
		$valor = 0;
		switch ($posicion) {
			case 11:
				$valor = $_SESSION['pos11'];
				break;
			case '12':
				$valor = $_SESSION['pos12'];
				break;
			case '13':
				$valor = $_SESSION['pos13'];
				break;
			case '21':
				$valor = $_SESSION['pos21'];
				break;
			case '22':
				$valor = $_SESSION['pos22'];
				break;
			case '23':
				$valor = $_SESSION['pos23'];
				break;
			case '31':
				$valor = $_SESSION['pos31'];
				break;
			case '32':
				$valor = $_SESSION['pos32'];
				break;
			case '33':
				$valor = $_SESSION['pos33'];
				break;
			default:
				$valor = 0;
				break;
		}
 
		switch ($valor) {
			case 1:
				return "<img src=\"imagenes/o.gif\" />";
				break;
			case 2:
				return "<img src=\"imagenes/x.gif\" />";
				break;
			default:
				return "<a href=\"interfaz.php?pos=".$posicion."&turno=".$turno."\"><img src=\"imagenes/_.gif\" /></a>";
				break;
		}
	}
 
	public function cambiar($posicion, $jugador){
		switch ($posicion) {
			case '11':
				$_SESSION['pos11'] = $jugador;
				break;
			case '12':
				$_SESSION['pos12'] = $jugador;
				break;
			case '13':
				$_SESSION['pos13'] = $jugador;
				break;
			case '21':
				$_SESSION['pos21'] = $jugador;
				break;
			case '22':
				$_SESSION['pos22'] = $jugador;
				break;
			case '23':
				$_SESSION['pos23'] = $jugador;
				break;
			case '31':
				$_SESSION['pos31'] = $jugador;
				break;
			case '32':
				$_SESSION['pos32'] = $jugador;
				break;
			case '33':
				$_SESSION['pos33'] = $jugador;
				break;
			default:
				break;
		}
	}
}
 
?>
 


archivo logica.php

 
<?php
class Logica
{
	public function verificar()
	{
	aqui mi problema... como mostrar los ganadores a traves de las distintas formas que se puede ganar?
}
}
?>
 


 


25-May-2014 11:42
Nacho Cabanes (+32)

No hay tantas formas de ganar: sólo 8 (una de las tres filas pertenece a un jugador, o una de las 3 columnas, o una de las dos diagonales). Es código repetitivo pero simple: si la posicion 11 y la 12 y la 13 pertenecen al mismo jugador, ese jugador ha ganado.

Si hubieras planteado el tablero como un array de 2 dimensiones, se limitarían a un máximo de 4 comprobaciones (las 2 diagonales, un "for" para todas las filas y otro "for" para las columnas).






(No se puede continuar esta discusión porque tiene más de dos meses de antigüedad. Si tienes dudas parecidas, abre un nuevo hilo.)