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:
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:
De foutmeldingen die ik krijg zijn:
Zou iemand mij kunnen helpen dit probleem op te lossen?
Alvast heel erg bedankt,
Geert
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