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....