Javascript overzetten naar PHP (crossword weaver)

Status
Niet open voor verdere reacties.

geertd

Gebruiker
Lid geworden
16 nov 2008
Berichten
340
Hallo allemaal,

Ik wil op mijn website graag een kruiswoordpuzzel toevoegen.
Een mooie weaver voor de puzzel heb ik ergens op internet gevonden:
Code:
// c. 2009 BigAtticHouse.com (Michael Johnson)
// MIT style license as long as you include these comment lines in your code... do with it as you will.
// Posted 11/19/2009 www.startup-something.com

var board = Array();
var wordlist = ['voco','audire','sum','potest','forehead','hip','humerus','jawbone','ligaments',
'marrow','metacarpal','metatarsal','patella','phalanges','radius','ribs','scapula','skeleton',
'sternum','tibia','ulna','vertebrae',


];
 
var board_width = 20;
var board_board = 20;

var Horizontal = Array();
var Vertical = Array();
 

function ClearBoard(){
   board = Array();
   for(x=0;x<board_width;x++){
       board.push(Array())
     for(y=0;y<board_width;y++){
       board[x].push(' ');    
     }
    }
}

 
function MatchedLetters(Word){
  var Locations = Array(); 
   for(x=0;x<board_width;x++){
     for(y=0;y<board_width;y++){
       var c = board[x][y].toUpperCase();
       if (Word.indexOf(c)>-1){
           Locations.push(Array(c,x,y));  //'M',1,2
       }
     } 
   }
  return Locations;
}

function BlankPrior(x,y,dx,dy,word){
  dx=dx*-1; dy=dy*-1;
  x=x+dx; y=y+dy;
  if(board[x]){
   if (board[x][y]==" "){ return true; } else {return false;}  
  }  
  return true; 
}


function BlankAfter(x,y,dx,dy,word){
  dx=dx*(word.length+1); dy=dy*(word.length+1);
  x=x+dx ; y=y+dy ;
  if(board[x]){
   if (board[x][y]==" "){ return true; } else {return false;}  
  }  
  return true; 
}


function ScorePath(x,y,dx,dy,word){
  var score = 0;
  var size = word.length;
  var blank = 0;

   px=x-dx; py=y-dy;
   //alert(board[-1][-1]);
    if(board[px]){
      if (board[px][py]!=" "){return -1;}
    }


  for(var i=0;i<size;i++){
   if(((x<board_width) && (y<board_board) && (x>-1) && (y>-1))){
     if(board[x][y]!=" "){
         if(board[x][y]==word[i]){ score+=1; } else {return -1;}
     } else blank+=1;

     if(board[x][y]!=word[i]){
       if(dx==1){
           var subscore = 0; 
           if(board[x][y-1]) {if(board[x][y-1]==" ")  subscore+=1} else  subscore+=1;
           if(board[x][y+1]) {if(board[x][y+1]==" ") subscore+=1} else  subscore+=1;
           if (subscore==2) {score+=1} else {return -1;}
         }
       if(dy==1){
           var subscore = 0; 
           if(board[x-1]) {if(board[x-1][y]==" ") subscore+=1} else  subscore+=1;
           if(board[x+1]) {if(board[x+1][y]==" ") subscore+=1} else  subscore+=1;
           if (subscore==2) {score+=1} else {return -1;}
         }
        }

   } else return -1;
    x=x+dx; y=y+dy;
  }
   
    if(board[x]){
      if (board[x][y]!=" "){return -1;}
    }

 
  if(blank==word.length) score=0;
  return score;
}


function CrossablePlaces(word){
  var Places = Array();
  var StartingPoints = MatchedLetters(word);
  var dx=0; var dy=0;
  var bestscore = 0;
  var bestdx = 0; var bestx=0;
  var bestdy = 0; var besty=0;
 
  for(x=0;x<board_width;x++){
     for(y=0;y<board_width;y++){
        Hscore = ScorePath(x,y,1,0,word);
        Vscore = ScorePath(x,y,0,1,word); 
       // document.write(word+" ("+x+","+y+") H="+Hscore+"  V="+Vscore+" <br>");
        if(Hscore> bestscore){ 
            bestscore = Hscore; bestx=x; besty=y; bestdx=1; bestdy=0;
        }
        if(Vscore> bestscore){ 
            bestscore = Vscore; bestx=x; besty=y; bestdx=0; bestdy=1;
        }
     }  
  }
  if(bestscore>0){
     // document.write(word+" - "+bestscore+"("+bestx+","+besty+")-("+bestdx+","+bestdy+")<br>");
      Places.push(Array(bestscore,bestx,besty,bestdx,bestdy));
   }
 
  return Places;
} 
 
function PlaceWord(x,y,dx,dy,word){
  var size = word.length;
  for(var i=0;i<size;i++){
   if(board[x]){
      board[x][y]= word[i];
    }
    x=x+dx; y=y+dy;
  }

  if(dx==1){Horizontal.push(Array(x,y,word));}
  if(dy==1){Vertical.push(Array(x,y,word));}
  
  return true;
}

function PathIsClear(x,y,dx,dy,word){
  var size = word.length;
  for(var i=0;i<size;i++){
   if(board[x]){
    if (board[x][y]!=" "){ return false; }
    if (ScorePath(x,y,dx,dy,word)<0) {return false;}
   } else return false;
    x=x+dx; y=y+dy;
  }
  return true;
}

function PlaceAtRandom(word){  
  var trynum=0; var keeptrying=true;
  while(keeptrying){
      var x=Math.floor(Math.random()*board_width);
      var y=Math.floor(Math.random()*board_width);
      var HorV = Math.floor(Math.random()*20);
      if(HorV % 2 == 0){ dx=0; dy=1;} else { dx=1; dy=0;}
      keeptrying = ((trynum<board_width*board_board) && (!PathIsClear(x,y,dx,dy,word)));
      trynum++;
  } //  document.write(word+":random("+(trynum+1)+")<br>");
  if (PathIsClear(x,y,dx,dy,word)){ 
    PlaceWord(x,y,dx,dy,word);
  }
}

function PlaceAtBestCrossing(places,word){
  var x=places[0][1];  var y=places[0][2];
  var dx=places[0][3];  var dy=places[0][4];
  PlaceWord(x,y,dx,dy,word);
}

//1. Loops 

function BuildCrossword(){
ClearBoard(); unconnected=0;
xwordlist = wordlist;  
var Retry = Array();
var Retry2 = Array();
while(xwordlist.length>0){
  var word = xwordlist.pop(); 
  var places = CrossablePlaces(word);
    if(places.length>0){  
   // document.write(word+":best("+places.length+" results)<br>");
     PlaceAtBestCrossing(places,word);  //so Mia could cross both Mike and Ann..
   } else {
     if(Retry.indexOf(word)==-1){ Retry.push(word); xwordlist.push(word); } else
     if(Retry2.indexOf(word)==-1){ Retry2.push(word); xwordlist.push(word); } else
       PlaceAtRandom(word); 
   }
}  
}


function ScreenDumpCrossword(){
       document.write("!<pre>");  
   for(x=0;x<board_width;x++){
     for(y=0;y<board_width;y++){
       var c = board[x][y];       
       document.write(c);
     }
      document.write(x+"\r\n");
    }
       document.write("</pre>");
 
 document.write('Down:<br>');
 for(var i=0;i<Vertical.length;i++){ document.write((i+1)+'. ('+Vertical[i]+')<br>'); }
 document.write('Across:<br>');
 for(var i=0;i<Horizontal.length;i++){ document.write((i+1)+'. ('+Horizontal[i]+')<br>'); }


}

function CrosswordTable(){
       document.write('<table border=1 cellspacing=0 cellpadding=2>');  
   for(x=0;x<board_width;x++){
       document.write("<tr>");  
     for(y=0;y<board_width;y++){
       var c = board[x][y]; 
       if(c==" "){document.write('<td style="background:#000">'); } else {  document.write("<td>");        }
       document.write(c);
       document.write("</td>");  
     }
       document.write("</tr>");  
    }
       document.write("</table>");
 
 document.write('Down:<br>');
 for(var i=0;i<Vertical.length;i++){ document.write((i+1)+'. ('+Vertical[i]+')<br>'); }
 document.write('Across:<br>');
 for(var i=0;i<Horizontal.length;i++){ document.write((i+1)+'. ('+Horizontal[i]+')<br>'); }


}




//**********************************************************
BuildCrossword();
CrosswordTable();

Deze werkt prima, maar hij is geschreven in Javascript. Ik wil hem graag door PHP laten gebruiken.
Ik heb geprobeerd om hem om te zetten naar PHP, maar ik krijg foutmeldingen...

De PHP code:
PHP:
define('BOARD_WIDTH', 20);
define('BOARD_BOARD', 20);

	$board = array();
$wordlist = array('voco','audire','sum','potest','forehead','hip','humerus','jawbone','ligaments','marrow','metacarpal','metatarsal','patella','phalanges','radius','ribs','scapula','skeleton','sternum','tibia','ulna','vertebrae');
 


$Horizontal = array();
$Vertical = array();
	





function ClearBoard(){
   global $board, $wordlist;
   $board = array();
   for($x=0;$x<BOARD_WIDTH;$x++){
       array_push($board, array());
     for($y=0;$y<BOARD_WIDTH;$y++){
       array_push($board[$x], ' ');
     }
    }
}

 
function MatchedLetters($Word){
  global $board, $wordlist;
  $Locations = array(); 
   for($x=0;$x<BOARD_WIDTH;$x++){
     for($y=0;$y<BOARD_WIDTH;$y++){
       $c = strtoupper($board[$x][$y]);
       if (strstr($Word, $c)) {
		   array_push($Locations, array($c, $x, $y)); //'M',1,2
       }
     } 
   }
  return $Locations;
}

function BlankPrior($x,$y,$dx,$dy,$word){
  global $board;
  $dx=$dx*-1; $dy=$dy*-1;
  $x=$x+$dx; $y=$y+$dy;
  if($board[$x]){
   if ($board[$x][$y]==" "){ return true; } else {return false;}  
  }  
  return true; 
}


function BlankAfter($x,$y,$dx,$dy,$word){
  global $board;
  $dx=$dx*(strlen($word)+1); $dy=$dy*(strlen($word)+1);
  $x=$x+$dx ; $y=$y+$dy ;
  if($board[$x]){
   if ($board[$x][$y]==" "){ return true; } else {return false;}  
  }  
  return true; 
}


function ScorePath($x,$y,$dx,$dy,$word){
  global $board;
  $score = 0;
  $size = strlen($word);
  $blank = 0;

   $px=$x-$dx; $py=$y-$dy;
    if(isset($board[$px])){
	  if ($board[$px][$py]!=" "){return -1;}
    }


  for($i=0;$i<$size;$i++){
   if((($x<BOARD_WIDTH) && ($y<BOARD_BOARD) && ($x>-1) && ($y>-1))){
     if($board[$x][$y]!=" "){
         if($board[$x][$y]==$word[$i]){ $score+=1; } else {return -1;}
     } else { $blank+=1; }

     if($board[$x][$y]!=$word[$i]){
       if($dx==1){
           $subscore = 0; 
           if(isset($board[$x][$y-1])) {if($board[$x][$y-1]==" ")  $subscore+=1;} else {  $subscore+=1; }
           if(isset($board[$x][$y+1])) {if($board[$x][$y+1]==" ") $subscore+=1;} else { $subscore+=1; }
           if ($subscore==2) {$score+=1;} else {return -1;}
         }
       if($dy==1){
           $subscore = 0; 
           if(isset($board[$x-1])) {if($board[$x-1][$y]==" ") $subscore+=1;} else  $subscore+=1;
           if(isset($board[$x+1])) {if($board[$x+1][$y]==" ") $subscore+=1;} else  $subscore+=1;
           if ($subscore==2) {$score+=1;} else {return -1;}
         }
        }

   } else return -1;
    $x=$x+$dx; $y=$y+$dy;
  }
   
    if(isset($board[$x])){
      if ($board[$x][$y]!=" "){return -1;}
    }

 
  if($blank==strlen($word)) $score=0;
  return $score;
}


function CrossablePlaces($word){
  $Places = array();
  $StartingPoints = MatchedLetters($word);
  
  $dx=0; $dy=0;
  $bestscore = 0;
  $bestdx = 0; $bestx=0;
  $bestdy = 0; $besty=0;
 
  for($x=0;$x<BOARD_WIDTH;$x++){
     for($y=0;$y<BOARD_WIDTH;$y++){

        $Hscore = ScorePath($x,$y,1,0,$word);
        $Vscore = ScorePath($x,$y,0,1,$word); 
       // print(word+" ("+x+","+y+") H="+Hscore+"  V="+Vscore+" <br>");
        if($Hscore> $bestscore){ 
            $bestscore = $Hscore; $bestx=$x; $besty=$y; $bestdx=1; $bestdy=0;
        }
        if($Vscore> $bestscore){ 
            $bestscore = $Vscore; $bestx=$x; $besty=$y; $bestdx=0; $bestdy=1;
        }
     }  
  }
  if($bestscore>0){
     // print(word+" - "+bestscore+"("+bestx+","+besty+")-("+bestdx+","+bestdy+")<br>");
      array_push($Places, array($bestscore,$bestx,$besty,$bestdx,$bestdy));
   }
 
  return $Places;
} 
 
function PlaceWord($x,$y,$dx,$dy,$word){
  global $board, $Horizontal, $Vertical;
  $size = strlen($word);
  for($i=0;$i<$size;$i++){
   if($board[$x]){
      $board[$x][$y]= $word[$i];
    }
    $x=$x+$dx; $y=$y+$dy;
  }

  if($dx==1){ array_push($Horizontal, array($x, $y, $word)); }
  if($dy==1){ array_push($Vertical, array($x,$y,$word));}
  
  return true;
}

function PathIsClear($x,$y,$dx,$dy,$word){
  global $board;
  $size = strlen($word);
  for($i=0;$i<$size;$i++){
   if(isset($board[$x])){
    if ($board[$x][$y]!=" "){ return false; }
    if (ScorePath($x,$y,$dx,$dy,$word)<0) {return false;}
   } else return false;
    $x=$x+$dx; $y=$y+$dy;
  }
  return true;
}

function PlaceAtRandom($word){  
  $trynum=0; $keeptrying=true;
  while($keeptrying){
      $x=floor(rand()*BOARD_WIDTH);
      $y=floor(rand()*BOARD_WIDTH);
      $HorV = floor(rand()*20);
      if($HorV % 2 == 0){ $dx=0; $dy=1;} else { $dx=1; $dy=0;}
      $keeptrying = (($trynum<BOARD_WIDTH*BOARD_BOARD) && (!PathIsClear($x,$y,$dx,$dy,$word)));
      $trynum++;
  } //  print(word+":random("+(trynum+1)+")<br>");
  if (PathIsClear($x,$y,$dx,$dy,$word)){ 
    PlaceWord($x,$y,$dx,$dy,$word);
  }
}

function PlaceAtBestCrossing($places,$word){
  $x=$places[0][1];  $y=$places[0][2];
  $dx=$places[0][3];  $dy=$places[0][4];
  PlaceWord($x,$y,$dx,$dy,$word);
}

//1. Loops 

function BuildCrossword(){
	global $board, $wordlist, $Horizontal, $Vertical;
	ClearBoard(); $unconnected=0;
	$xwordlist = $wordlist;  
	$Retry = array();
	$Retry2 = array();
	while(count($xwordlist)>0){
	  $word = array_pop($xwordlist);
	  $places = CrossablePlaces($word);
		if(count($places)>0){  
	   // print(word+":best("+places.length+" results)<br>");
		 PlaceAtBestCrossing($places,$word);  //so Mia could cross both Mike and Ann..
	   } else {
		 if(!in_array($word, $Retry)){ array_push($Retry, $word); array_push($xwordlist, $word); } else
		 if(!in_array($word, $Retry2)){ array_push($Retry2, $word); array_push($xwordlist, $word); } else
		   PlaceAtRandom($word); 
	   }
	}  
}


function ScreenDumpCrossword(){
       print("!<pre>");  
   for($x=0;$x<BOARD_WIDTH;$x++){
     for($y=0;$y<BOARD_WIDTH;$y++){
       $c = $board[x][y];       
       print($c);
     }
      print($x+"\r\n");
    }
       print("</pre>");
 
 print('Down:<br>');
 for($i=0;$i<count($Vertical);$i++){ print(($i+1)+'. ('+$Vertical[$i]+')<br>'); }
 print('Across:<br>');
 for($i=0;$i<count($Horizontal);$i++){ print(($i+1)+'. ('+$Horizontal[$i]+')<br>'); }


}

function CrosswordTable(){
	global $board, $wordlist, $Horizontal, $Vertical;
       print('<table border=1 cellspacing=0 cellpadding=2>');  
   for($x=0;$x<BOARD_WIDTH;$x++){
       print("<tr>");  
     for($y=0;$y<BOARD_WIDTH;$y++){
       $c = $board[$x][$y]; 
       if($c==" "){print('<td style="background:#000">'); } else {  print("<td>");        }
       print($c);
       print("</td>");  
     }
       print("</tr>");  
    }
       print("</table>");
 
 print('Down:<br>');
 for($i=0;$i<count($Vertical);$i++){ print(($i+1)+'. ('+$Vertical[$i]+')<br>'); }
 print('Across:<br>');
 for($i=0;$i<count($Horizontal);$i++){ print(($i+1)+'. ('+$Horizontal[$i]+')<br>'); }


}




//**********************************************************


//BuildCrossword();
//CrosswordTable();

function printCrosswordData() {
	global $Horizontal, $Vertical;
	$data = array();
	BuildCrossword();
	
	print_r( $Vertical);
	
	echo 'var oygCrosswordPuzzle = new oyCrosswordPuzzle (
		  "5748185539682739085",
		  "../inc/oy-cword",
		  "/a/a",
		  "Gang Of Four (GOF) Software Design Patterns Crossword",
		  "This crossword tests your knowledge of software design patterns.",
		  [';
		  	 $returning = '';
			 for($i=0;$i<count($Vertical);$i++){ 
				$returning .= ', new oyCrosswordClue('.strlen($Vertical[$i][2]).', "This factory creates an instance of several families of classes", "'.$Vertical[$i][2].'", "'.md5(rand()).'", 0, '.$Vertical[$i][1]-strlen($Vertical[$i][2]).', '.$Vertical[$i][0].')';
			 }
			 $returning = substr($returning, 1);
			 
			 for($i=0;$i<count($Horizontal);$i++){ 
				$returning .= ', new oyCrosswordClue('.strlen($Horizontal[$i][2]).', "This factory creates an instance of several families of classes", "'.$Horizontal[$i][2].'", "'.md5(rand()).'", 1, '.$Horizontal[$i][1]-strlen($Horizontal[$i][2]).', '.$Horizontal[$i][0].')';
			 }
			 
			 echo $returning;

			 echo '
		  ],
		  '.BOARD_WIDTH.',
		  '.BOARD_BOARD.',
		  20,
		  20 
		);';
}

echo printCrosswordData();

?>

De foutmeldingen die ik krijg zijn:
Code:
Notice: Undefined offset: -1 in C:\xampp\htdocs\ajax\games\weaver.inc.php on line 76
Notice: Undefined offset: 20 in C:\xampp\htdocs\ajax\games\weaver.inc.php on line 106

Zou iemand mij kunnen helpen dit probleem op te lossen?

Alvast heel erg bedankt,

Geert
 
Je kunt ook Javascript en PHP tegelijkertijd gebruiken dus,

Code:
var board = Array();
var wordlist = <?php echo $array; ?>;
 
var board_width = <?php echo $board_width; ?> ;
var board_board = <?php echo $board_board; >;

Dan kan je zelf de variables laten invullen door bijvoorbeeld sql of GET/POST
 
Undefined offset houdt in dat er een element uit een array wordt opgevraagd welke niet bestaat.

Wanneer dit in een FOR-lus gebeurt zoals hier dan is het bereik verkeerd. Dit kan het gevolg zijn van een verkeerde berekening naar de lengte van een array of het gebruik van verkeerde FOR-parameters.
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan