Foros del Web » Programando para Internet » PHP »

Crucigrama

Estas en el tema de Crucigrama en el foro de PHP en Foros del Web. Hola Me A Llamado La Atencion Sobre La Idea De Hacer Un Crucigrama Utilizando Php Y Mysql Pero No Se Como Empezar Me Pueden Dar ...
  #1 (permalink)  
Antiguo 02/10/2006, 08:29
 
Fecha de Ingreso: agosto-2006
Mensajes: 10
Antigüedad: 20 años, 2 meses
Puntos: 0
Crucigrama

Hola Me A Llamado La Atencion Sobre La Idea De Hacer Un Crucigrama Utilizando Php Y Mysql Pero No Se Como Empezar Me Pueden Dar Una Idea, La Ideas Es Hacer Preguntas Y Que El Usuario La Responda Segun La Cantidad De Cuadritos Que Se Le Den Y El Sistema Valide Si Es Cierto O No
  #2 (permalink)  
Antiguo 02/10/2006, 11:02
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 20 años, 2 meses
Puntos: 0
Yo hice una aplicacion que genera automaticamente los crucigramas cojiendo las palabras de una base de datos.
Se responde por medio de sms, pero eso puede cambiar.

El generador de crucigrama lo saque de un concurso en php de este tema mismo.
  #3 (permalink)  
Antiguo 02/10/2006, 11:12
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 24 años, 9 meses
Puntos: 129
Cita:
Iniciado por seyacat Ver Mensaje
Yo hice una aplicacion que genera automaticamente los crucigramas cojiendo las palabras de una base de datos.
Se responde por medio de sms, pero eso puede cambiar.

El generador de crucigrama lo saque de un concurso en php de este tema mismo.
Está bien que nos comentes lo que has hecho .. pero sería mejor si compartes el código en público (deja un link donde puedan verlo). Sino, .. mejor abstenerse de comentarios así que inducirán a "me lo puedes pasar" y comentarios similares. Si tú sólo lo vas a "proporcionar" en forma privada, avisa el médio de contacto para tal fin.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #4 (permalink)  
Antiguo 02/10/2006, 11:29
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 20 años, 2 meses
Puntos: 0
A si disculpa no te enojes lo que pasa es que lo estaba buscando.....
  #5 (permalink)  
Antiguo 02/10/2006, 11:33
O_O
 
Fecha de Ingreso: enero-2002
Ubicación: Santiago - Chile
Mensajes: 34.417
Antigüedad: 24 años, 9 meses
Puntos: 129
Cita:
Iniciado por seyacat Ver Mensaje
A si disculpa no te enojes lo que pasa es que lo estaba buscando.....
Ni mucho menos me "enojo" .. Sólo soy previsor por qué ese tipo de situaciones ya las he visto. Sólo las intento evitar.

Un saludo,
__________________
Por motivos personales ya no puedo estar con Uds. Fue grato haber compartido todos estos años. Igualmente los seguiré leyendo.
  #6 (permalink)  
Antiguo 02/10/2006, 11:36
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 20 años, 2 meses
Puntos: 0
Aqui el codigo, el resultado es una linea de texto que tiene el modelo no resuelto y las palabras y la ubiciacion me parece, la verdad seria de darle seguimiento si vas a implementarlo por que hay cosas que al parecer no funcionan por conexion y esas cosas, como pueden ver el codigo original del generador no es mio, nunca le quito esas cosas, me parece bien asi :)

Código PHP:
<?php

/*
Crossing Words for
Codewalkers PHP Coding Contest of July 2002
(http://{$_SERVER['SERVER_NAME']}/php-contest.php)

Author Àngel Fenoy from Arenys de Mar, Barcelona.
*/

set_time_limit($time_limit = 10);
$t1 = time();

mt_srand((double)(microtime()*100000000));

$tama&#241;o = 10;

define('MAXW', 8);
define('MAXW1', MAXW + 1);

define('N20', $tama&#241;o);
define('N19', N20 - 1);
define('N21', N20 + 1);
define('N22', N20 + 2);
define('N2222', N22 * N22);
define('N2221', N2222 - 1);
define('N2200', N2222 - N22);

/*$file = "wordlist.txt";
if (! file_exists($file)) die("File <b>$file</b> inexistent. Matt's fault ;)</body></html>");
if (! is_readable($file)) die("File <b>$file</b> is not readable. Matt's fault ;)(</body></html>");
$arrfile = file($file);*/

include("connect.php");

$query = "SELECT COUNT(*) FROM crucigrama WHERE resuelto != 1";//alistar
        
$result = mysql_query($query);
        
$existe_cruci = mysql_result($result, 0);
        if(
$existe_cruci <= 2){
        


$query = "SELECT DISTINCT (palabra) from diccionario  ORDER BY RAND() limit 10";
$result = mysql_query($query);
$i= 0;
while (
$row = mysql_fetch_assoc($result)){
    
$arrfile[$i] = $row["palabra"];
    
$i++;
    }


$lens = array_pad(array(), 21, 0);
foreach(
$arrfile as $n => $wordn) {
   
$lens[strlen($arrfile[$n] = trim($wordn))] ++;
}

$sum = 0;
$base_words = array();

foreach(
$arrfile as $n => $wordn) {
   if (
strlen($t = trim($wordn)) > (MAXW1)) continue;
   
$base_words[$n] = $t;
  
}

$base_puzzle = str_repeat('0', N22) . str_repeat('0' . str_repeat('.', N20) . '0', N20) . str_repeat('0', N22);

$best_score = 0;
$best_puzzle = '';
$best_palabras = '';

$the_end = false;

while (! 
$the_end) {
   
   
$magics = array();
   for (
$n = 2; $n < N21; $n++) {   
      
$a = array();
      for (
$r = 2; $r < ($n + 2); $r++) {
         
$a[] = $r;
      }

      
uasort($a, 'cmp_magic');
      
$magics[$n] = $a;
   }
    
   
$arr_words = $base_words;
   
uasort($arr_words, 'cmp');
  
   
$words = ';' . implode(';', $arr_words) . ';';
   
   
$puzzle = $base_puzzle;
   
   
$row = mt_rand(3, 10);
   
$col = mt_rand(3, 10);
   
$pos = N22 * $row + $col;
   
   
$poss = array();
   
   
$palabras = '';
   
scan_pos($pos, 'h', true);
   
$n_words = 1;
   
   
   while (
$s = sizeof($poss)) {
      
      
$p = array_shift($poss);
        
      if (
scan_pos($p[0], $p[1], false)) {
         
$n_words++;
         
      }
      
      if (
time() - $t1 > $time_limit - 2) {
         
$the_end = true;
         break;
      }
   }
   
   
$n_connectors = $n_filleds = 0;
   
$puzzle00 = str_replace('.', '0', $puzzle);
   for (
$n = 0; $n < N2222; $n++) {
      if (
$puzzle00[$n]) {
         if ((
$puzzle00[$n - 1] or $puzzle00[$n + 1]) and
             (
$puzzle00[$n - N22] or $puzzle00[$n + N22])) {
            
$n_connectors++;
         } else {
            
$n_filleds++;
         }
      }
   }
   
   
$score = ($n_words * 5) + ($n_connectors * 3) + $n_filleds;
    
   if (
$score > $best_score) {
      
      
      
$bests = array('Words' => "$n_words * 5 = " . ($n_words * 5), 
                     
'Connectors' => "$n_connectors * 3 = " . ($n_connectors * 3),
                     
'Filled in spaces' => $n_filleds
                     
);
      
$best_score = $score;
      
$best_puzzle = $puzzle;
         
$best_palabras = $palabras;
   }
   
   if (
time() - $t1 > $time_limit - 2) break;
} 
//publicar

$best_palabras = strtoupper($best_palabras);
//echo '&palabras='.$best_palabras;
//echo strtoupper(disp_puzzle($best_puzzle));
$crucigrama=strtoupper(disp_puzzle($best_puzzle));

$query = "INSERT INTO `crucigrama` ( `id_crucigrama` , `crucigrama` , `palabras` , `resuelto` ) 
VALUES (
'', '$crucigrama', '$best_palabras', '0'
);
"
;
$result = mysql_query($query);
  
}
//fin alistar


include("disconnect.php");

function 
disp_puzzle($puzzle) {

   
$ret = "";
   for (
$n = 0;; $n ++) {
      if ((
$m = $n % N22) == 0 or $n < N22 ) {
         
$ret .= "-";
      } elseif (
$m == N21 ) {
         
$ret .= "-";
      } elseif (
$n > N2200) {
         
$ret .= "-";
      } elseif (
$puzzle[$n] == '0') {
         
$ret .= "-";
      } elseif (
$puzzle[$n] == '.') {
         
$ret .= "-";
      } else {
         if ((
$puzzle[$n - 1] > '0' or $puzzle[$n + 1] > '0') and
             (
$puzzle[$n - N22] > '0' or $puzzle[$n + N22] > '0')) {
            
$ret .= "$puzzle[$n]";
         } else {
            
$ret .= "$puzzle[$n]";
         }
            
      }

      if (
$n == N2221) {
         return  
"$ret";
      } elseif (
$m == N21) {
      }
   }
    return  
"$ret";
}



function 
scan_pos($pos, $dir, $val_blanc) {

   if (
$dir == 'h') {
      
$inc = 1;
      if (
$pos + $inc >= N2222) return false;
      
$oinc = N22;
      
$new_dir = 'v';
   } else { 
      
$inc = N22;
      if (
$pos + $inc >= N2222) return false;
      
$oinc = 1;
      
$new_dir = 'h';
   }
   
   global 
$puzzle;
   
   if (
$puzzle[$pos] < 'a' and (! $val_blanc)) return false;
   
   if ((
$puzzle[$pos -  $inc] > '0') or ($puzzle[$pos +  $inc] > '0')) {
      return 
false;
   }
   
   global 
$palabras;
   global 
$words;
   global 
$magics;
   global 
$poss;

   
$regex = $puzzle[$pos];
   
   
$left = $right = 0;
   for (
$limit_a = $pos - $inc; ($w = $puzzle[$limit_a]) !== '0'; $limit_a -= $inc) {  
      if (
$puzzle[$limit_a] == '.' and (($puzzle[$limit_a -  $oinc] > '0') or ($puzzle[$limit_a +  $oinc] > '0'))) {
         break;
      }
      if (++
$left == MAXW) {
         
$left --;
         break;
      }
      
$regex = $w . $regex;
   }

   for (
$limit_b = $pos + $inc; ($w = $puzzle[$limit_b]) !== '0'; $limit_b += $inc) {
      if (
$puzzle[$limit_b] == '.' and (($puzzle[$limit_b -  $oinc] > '0') or ($puzzle[$limit_b +  $oinc] > '0'))) {
         break;
      }
      if (++
$right == MAXW) {
         
$right--;
         break;
      }
      
$regex .= $w;
   }

   if ((
$len_regex = strlen($regex)) < 2) return false;

   foreach (
$magics[$len_regex] as $m => $lens) {
      
      
$ini = max(0, ($left + 1) - $lens);
      
$fin = $left;
      
      
$pos_p = max($limit_a + $inc, $pos - (($lens - 1 ) * $inc));

      for(
$pos_c = $ini; $pos_c <= $fin; $pos_c++, $pos_p += $inc) {
        
         if (
$puzzle[$pos_p - $inc] > '0') continue;
         
         
$r = '/;' . str_replace('.', '\w', substr($regex, $pos_c, $lens)) . ';/';
         if (! 
preg_match($r, $words, $arr)) continue;
         
         
$larr0 = $pos_p + ((strlen($arr[0]) - 2) * $inc);
         
         if (
$larr0 >= N2222) continue;

         if (
$puzzle[$larr0] > '0') continue;
         
         
$words = str_replace("$arr[0]", ';', $words);

         for (
$n = 1, $pp = $pos_p; $n < strlen($arr[0]) - 1; $n++, $pp += $inc) {
            
            
$puzzle[$pp] = $arr[0][$n];
            if (
$pp == $pos) continue;
            
            
            
$poss[] = array($pp, $new_dir, ord($puzzle[$pp]));
         }
         
$puzzle[$pos_p - $inc] = '0';
         
$puzzle[$pp] = '0';
         
         
$palabras .=$pos_p."-".$dir."-0-".substr($arr[0],1);    
        
         return 
true;
      }
   }
   
   return 
false;
}   
    
?><?php

function cmp($a, $b) {
   return 
strlen($b) - strlen($a);
}

function 
cmp_magic($a, $b) {
   return (
strlen($a) + mt_rand(0, 3)) - (strlen($b) - mt_rand(0, 1));
}

?>

Última edición por seyacat; 02/10/2006 a las 11:54
  #7 (permalink)  
Antiguo 02/10/2006, 11:43
Avatar de seyacat  
Fecha de Ingreso: agosto-2006
Mensajes: 382
Antigüedad: 20 años, 2 meses
Puntos: 0
Continuo estas son las tablas.
Funcionaba con un front end en flash, en crucigrama se almacena los crucigramas generados y como avanzaban las respuestas, simpre generaba un crucigrama automaticamente de reserva, asi siempre tenia nuevos y nuevos y nuevos, no cre que sea tu caso

En diccionario estan las palabras, nunca separe por categorias, Jugador era para almacenar el puntaje y juego para separar sesiones de puntaje. La verdad esas tablas no creo que te sirvan

CREATE TABLE `crucigrama` (
`id_crucigrama` bigint(20) NOT NULL auto_increment,
`crucigrama` text NOT NULL,
`palabras` text NOT NULL,
`resuelto` binary(1) NOT NULL default '0',
PRIMARY KEY (`id_crucigrama`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=9578 ;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `diccionario`
--

CREATE TABLE `diccionario` (
`id_palabra` bigint(20) NOT NULL auto_increment,
`palabra` varchar(20) NOT NULL default '',
`descripcion` varchar(150) NOT NULL default '',
`categoria` varchar(20) NOT NULL default '',
PRIMARY KEY (`id_palabra`),
UNIQUE KEY `palabra` (`palabra`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=483 ;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `juego`
--

CREATE TABLE `juego` (
`id` int(10) NOT NULL default '0'
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

-- --------------------------------------------------------

--
-- Estructura de tabla para la tabla `jugador`
--

CREATE TABLE `jugador` (
`id_jugador` bigint(20) NOT NULL auto_increment,
`id_juego` bigint(20) NOT NULL default '0',
`numero` varchar(20) NOT NULL default '',
`nick` varchar(20) NOT NULL default '',
`puntos` bigint(20) NOT NULL default '0',
PRIMARY KEY (`id_jugador`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=691 ;

-- --------------------------------------------------------

aqui el codigo de interactividad

Código PHP:
$numero = $_GET['numero'];
$mensaje = $_GET['mensaje'];
$short_num = $_GET['short_num'];
$operator = $_GET['operator'];
$idmsg = $_GET['idmsg'];
$db = 'sin_shortnum';
$mensaje = strtolower($mensaje);
$mensaje = implode("",explode("\"",$mensaje));
$programa = "";
$estado = "";

$query = "SELECT id FROM juego LIMIT 1";
    
$result = mysql_query($query);
    
$juego = mysql_result($result,0);
    
    
$query ="SELECT COUNT(*) FROM jugador WHERE numero = $numero AND id_juego = $juego" ;
    
$result = mysql_query($query);
    
$row = mysql_result($result, 0);
    if(
$row==0){
        
$query ="INSERT INTO `jugador` ( `id_jugador` , `id_juego` , `numero` , `nick` , `puntos`  ) 
        VALUES (
        '', '$juego', '$numero', '', '0'
        )
        "
;
        
$result = mysql_query($query);
        }
//end insert if
        
    
$query = "SELECT palabras FROM crucigrama WHERE resuelto != 1 LIMIT 1;";
    
$result = mysql_query($query);
    
$row = mysql_result($result,0);
    
$mensaje = strtoupper($mensaje);
    
$msg = explode(" ",$mensaje);
    
$nuevas = 0;
    
$viejas = 0;
    
$erradas = 0;
    
$palabras_out = $row;
    foreach(
$msg as $mss){
        
$palabras = explode(";",$palabras_out);
        
$palabras_out = "";
        
$completado=1;
        foreach(
$palabras as $palabra){
            if(
$palabra != ""){
                
$palabra = explode("-",$palabra);
                if(
$palabra[3]==$mss)
                    {
                    if(
$palabra[2]=="1"){
                        
$viejas++;
                        }
                    else{
                        
$palabra[2]=1;
                        
$nuevas++;
                        }
//end elseif
                    
}//end if
                
else{
                    
                    }
                if(
$palabra[2]!="1"){$completado=0;}//revisa si se ha completado
                
$palabra = implode("-",$palabra);
                
$palabras_out .= $palabra.";";
                }
            }
//end foreach
        //$palabras = $palabras_out;
        
}//end foreach mensaje
    
$nummsg = count($msg);
    
$erradas = $nummsg - $nuevas - $viejas;
    
$resp = "";
    if(
$nuevas > 0){$resp .= "$nuevas palabra(s) acertada(s),";}
    if(
$viejas > 0){$resp .= " $viejas palabra(s) ya resuelta(s),";}
    if(
$erradas > 0){$resp .= " $erradas palabra(s) errada(s),";}
    
$resp .= " de $nummsg palabra(s) enviada(s).";
    if(
$nuevas > 0){
        
$query = "UPDATE `crucigrama`
            SET `palabras` = '$palabras_out;' 
            WHERE resuelto != 1 LIMIT 1"
;
            
mysql_query($query);
            
            
$query = "UPDATE `jugador` SET puntos = puntos+$nuevas WHERE numero = $numero AND id_juego = $juego";
            
mysql_query($query);//query de goolll
        
}
    
    if(
$completado == 1){
        
$query = "UPDATE `crucigrama` SET `resuelto` = '1' WHERE resuelto != 1 LIMIT 1";
        
mysql_query($query);
        }
    
$query = "SELECT puntos FROM `jugador`  WHERE id_juego = (SELECT MAX(id_juego) FROM jugador) AND numero = $numero";
    
$result = mysql_query($query);
    
$puntos  = mysql_result($result, 0);
    
$respuesta = "<entel>$resp  Puntaje:$puntos</entel>";
    echo 
$respuesta;
    
    
$query = "SELECT COUNT(*) FROM crucigrama WHERE resuelto = '0'";
    
$result = mysql_query($query);
    
$existe_cruci = mysql_result($result, 0);
    if(
$existe_cruci <= 2){
        
//include("gencruci.php");
        
} 
Y eso es todo, lo unico que te faltaria es el frontend....

Última edición por seyacat; 02/10/2006 a las 11:54
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 06:52.