Home > Uncategorized > Un poco de programación Geek

Un poco de programación Geek

February 9th, 2010 Leave a comment Go to comments
Todo empezó un día que estaba menos ocupado que hoy… de la nada me clavé pensando en el juego del Gato, también llamado tres en raya o en inglés Tic Tac Toe…. y se me ocurrió hacer un programa que me diera las posibles jugadas para cualquier situación y así tal vez saber los mejores comienzos que me dieran mas posibilidades de ganar…

Hace días que quería postear algo a este blog olvidado por Dios, pero no fue hasta ayer mientras volvía a copiar a mi disco duro mi información respaldada (causa) fue cuando vi el script del gato y entonces decidí publicarlo aquí antes de que terminara oxidado dentro de un disco duro viejo…

El código del script nombrado:

#!/usr/bin/php
<?php
	mysql_connect("localhost","root","");
	mysql_select_db("tictactoe");
	set_time_limit(60000);
	// 1 - O wins
	// 2 - X wins
	// 3 - Tie
	$start = time();
	function search_winner($game) {
		$winner = array(array(1,4,7),array(2,5,8),array(3,6,9),array(1,2,3),array(4,5,6),array(7,8,9),array(1,5,9),array(3,5,7));
		foreach($winner as $comb) {
			if(strpos($game,"o".$comb[0]) !== false && strpos($game,"o".$comb[1]) !== false && strpos($game,"o".$comb[2]) !== false) { return "1"; }
			if(strpos($game,"x".$comb[0]) !== false && strpos($game,"x".$comb[1]) !== false && strpos($game,"x".$comb[2]) !== false) { return "2"; }
		}
		return false;
	}
	function play($player,$game,$free) {
		$free2 = $free;
		$num = count($free);
		if(count($free)<1) { echo "$game\n"; mysql_query("insert into gato values(NULL,'$game',3)"); }
		$winner = search_winner($game);
		if($winner) { echo "$game Winner: $winner.\n"; $num = 0; mysql_query("insert into gato values(NULL,'$game',$winner)"); }
		for($i=0;$i<$num;$i++) {
			$temp = array_pop($free2);
			$libres = array();
			foreach($free as $libre) {
				if($libre != $temp) $libres[] = $libre; 
			}
			if($player == "o") $playern = "x";
			else $playern = "o";
			play($playern,$game.$player.$temp,$libres);
		}
	}
	play("o","",array(1,2,3,4,5,6,7,8,9));
	$end = time();
	$duration = $end - $start;
	echo "\n\nTardo: $duration segundos.\n\n";
?>

El programa necesita una tabla MySQL:

CREATE TABLE IF NOT EXISTS `gato` (
  `id` INT(10) UNSIGNED NOT NULL AUTO_INCREMENT,
  `game` VARCHAR(100) NOT NULL,
  `winner` INT(11) NOT NULL,
  PRIMARY KEY (`id`)
)

Al correrlo y ver resultados, se ven interesantes puntos:

mysql> select winner,count(*) from gato group by winner;
+--------+----------+
| winner | count(*) |
+--------+----------+
|      1 |   131184 |
|      2 |    77904 |
|      3 |   127872 |
+--------+----------+
3 rows in set (0.20 sec)

Hay que denotar que en realidad los numeros deberian ser en realidad una cuarta parte de lo que son, ya que en el programa, si se toma en cuenta la posicion vertical hacia arriba, sin embargo volteando el gato serían los mismos movimientos 3 veces diferentes…

La observación obvia al ver los resultados es que el circulo O tiene gran ventaja, ya que tiene 1.68 veces de posibles victorias con respecto a la equis X debido a que la primera empieza con el primer movimiento.

Para la próxima dejemos el algoritmo que elimina las jugadas repetidas debido a la rotacion del cuadrado… y ya con eso podremos analizar mas facilmente cuales son las jugadas clave a la hora de jugar al gato…. por ahora creo que la moraleja es, escoje el circulo para tener mas posibilidades jejeej :).

Si alguien se anima a darle seguimiento comente los resultados.

Mi laptop dell M1530 se tarda 175 segundos en procesar el script, cuanto tarda la tuya? Comenta!.

  • http://ivan.rico.org.mx 7th Sign

    que onda chavo, cómo andas?
    estoy aquí de olgazan en el jale, pues es viernes y anoche me desvele, así que ando de metiche en aquellos blogs que solía visitar, hace mucho que no entraba al tuyo, ya lo cambiaste y me parece mejor este que aquel que se parecia al fotolog 😀 en fin
    ejecute tú codigo y no le entendí a la salida (o1x2o3x4o5x9o6x8o7 Winner: 1. <<< WTF? :S ) pero tardo 40 segundos en correr :) mira, te muestro las últimas líneas:

    o1x2o3x4o5x9o6x8o7 Winner: 1.
    o1x2o3x4o5x9o6x7o8
    o1x2o3x4o5x8o9 Winner: 1.
    o1x2o3x4o5x8o7 Winner: 1.
    o1x2o3x4o5x8o6x9o7
    o1x2o3x4o5x8o6x9o7 Winner: 1.
    o1x2o3x4o5x8o6x7o9
    o1x2o3x4o5x8o6x7o9 Winner: 1.
    o1x2o3x4o5x7o9 Winner: 1.
    o1x2o3x4o5x7o8x9o6
    o1x2o3x4o5x7o8x6o9
    o1x2o3x4o5x7o8x6o9 Winner: 1.
    o1x2o3x4o5x7o6x9o8
    o1x2o3x4o5x7o6x8o9
    o1x2o3x4o5x7o6x8o9 Winner: 1.
    o1x2o3x4o5x6o9 Winner: 1.
    o1x2o3x4o5x6o8x9o7
    o1x2o3x4o5x6o8x9o7 Winner: 1.
    o1x2o3x4o5x6o8x7o9
    o1x2o3x4o5x6o8x7o9 Winner: 1.
    o1x2o3x4o5x6o7 Winner: 1.

    Tardo: 40 segundos.

    real 0m39.915s
    user 0m16.577s
    sys 0m3.042s
    rafael@desarrollo ~/personal/scripts $

    bueno, creo que ya regreso a trabajar, estamos hablando.

    saludos

  • kEpEx

    Pues como dice en los comentarios jejeje

    checa:

    // 1 - O wins
    // 2 - X wins
    // 3 - Tie

    Aunque no se por que lo maneje entero ahí 😛