|
@ -1,9 +1,22 @@ |
|
|
<?php // $Id: play.php,v 1.23 2012/08/15 09:26:55 bdaloukas Exp $
|
|
|
<?php |
|
|
|
|
|
// This file is part of Moodle - http://moodle.org/ |
|
|
|
|
|
// |
|
|
|
|
|
// Moodle is free software: you can redistribute it and/or modify |
|
|
|
|
|
// it under the terms of the GNU General Public License as published by |
|
|
|
|
|
// the Free Software Foundation, either version 3 of the License, or |
|
|
|
|
|
// (at your option) any later version. |
|
|
|
|
|
// |
|
|
|
|
|
// Moodle is distributed in the hope that it will be useful, |
|
|
|
|
|
// but WITHOUT ANY WARRANTY; without even the implied warranty of |
|
|
|
|
|
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the |
|
|
|
|
|
// GNU General Public License for more details. |
|
|
|
|
|
// |
|
|
|
|
|
// You should have received a copy of the GNU General Public License |
|
|
|
|
|
// along with Moodle. If not, see <http://www.gnu.org/licenses/>. |
|
|
|
|
|
|
|
|
require_once( "../../lib/questionlib.php"); |
|
|
require_once( "../../lib/questionlib.php"); |
|
|
|
|
|
|
|
|
function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $context) |
|
|
function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $context) { |
|
|
{ |
|
|
|
|
|
global $CFG, $DB, $USER; |
|
|
global $CFG, $DB, $USER; |
|
|
|
|
|
|
|
|
if ($endofgame) { |
|
|
if ($endofgame) { |
|
@ -19,7 +32,7 @@ function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $conte |
|
|
$attempt = game_addattempt( $game); |
|
|
$attempt = game_addattempt( $game); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//new game |
|
|
// New game. |
|
|
srand( (double)microtime() * 1000000); |
|
|
srand( (double)microtime() * 1000000); |
|
|
|
|
|
|
|
|
$recsudoku = getrandomsudoku(); |
|
|
$recsudoku = getrandomsudoku(); |
|
@ -36,7 +49,7 @@ function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $conte |
|
|
$need = 81 - $recsudoku->opened; |
|
|
$need = 81 - $recsudoku->opened; |
|
|
$closed = game_sudoku_getclosed( $newrec->data); |
|
|
$closed = game_sudoku_getclosed( $newrec->data); |
|
|
$n = min( count($closed), $need); |
|
|
$n = min( count($closed), $need); |
|
|
//if the teacher set the maximum number of questions |
|
|
// If the teacher set the maximum number of questions. |
|
|
if ($game->param2 > 0) { |
|
|
if ($game->param2 > 0) { |
|
|
if ($game->param2 < $n) { |
|
|
if ($game->param2 < $n) { |
|
|
$n = $game->param2; |
|
|
$n = $game->param2; |
|
@ -45,13 +58,14 @@ function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $conte |
|
|
$recs = game_questions_selectrandom( $game, CONST_GAME_TRIES_REPETITION * $n); |
|
|
$recs = game_questions_selectrandom( $game, CONST_GAME_TRIES_REPETITION * $n); |
|
|
|
|
|
|
|
|
if ($recs === false) { |
|
|
if ($recs === false) { |
|
|
mysql_execute( "DELETE FROM {game_sudoku} WHERE id={$game->id}"); |
|
|
$sql = "DELETE FROM {game_sudoku} WHERE id={$game->id}"; |
|
|
|
|
|
$DB->execute( $sql); |
|
|
print_error( get_string( 'no_questions', 'game')); |
|
|
print_error( get_string( 'no_questions', 'game')); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
$closed = array_rand($closed, $n); |
|
|
$closed = array_rand($closed, $n); |
|
|
|
|
|
|
|
|
$selected_recs = game_select_from_repetitions( $game, $recs, $n); |
|
|
$selectedrecs = game_select_from_repetitions( $game, $recs, $n); |
|
|
|
|
|
|
|
|
if (!game_insert_record('game_sudoku', $newrec)) { |
|
|
if (!game_insert_record('game_sudoku', $newrec)) { |
|
|
print_error('error inserting in game_sudoku'); |
|
|
print_error('error inserting in game_sudoku'); |
|
@ -59,15 +73,16 @@ function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $conte |
|
|
|
|
|
|
|
|
$i = 0; |
|
|
$i = 0; |
|
|
$field = ($game->sourcemodule == 'glossary' ? 'glossaryentryid' : 'questionid'); |
|
|
$field = ($game->sourcemodule == 'glossary' ? 'glossaryentryid' : 'questionid'); |
|
|
foreach( $recs as $rec) |
|
|
foreach ($recs as $rec) { |
|
|
{ |
|
|
if ($game->sourcemodule == 'glossary') { |
|
|
if( $game->sourcemodule == 'glossary') |
|
|
|
|
|
$key = $rec->glossaryentryid; |
|
|
$key = $rec->glossaryentryid; |
|
|
else |
|
|
} else { |
|
|
$key = $rec->questionid; |
|
|
$key = $rec->questionid; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if( !array_key_exists( $key, $selected_recs)) |
|
|
if (!array_key_exists( $key, $selectedrecs)) { |
|
|
continue; |
|
|
continue; |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
$query = new stdClass(); |
|
|
$query = new stdClass(); |
|
|
$query->attemptid = $newrec->id; |
|
|
$query->attemptid = $newrec->id; |
|
@ -91,23 +106,24 @@ function game_sudoku_continue( $id, $game, $attempt, $sudoku, $endofgame, $conte |
|
|
game_sudoku_play( $id, $game, $attempt, $newrec, false, false, $context); |
|
|
game_sudoku_play( $id, $game, $attempt, $newrec, false, false, $context); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_play( $id, $game, $attempt, $sudoku, $onlyshow, $showsolution, $context) |
|
|
function game_sudoku_play( $id, $game, $attempt, $sudoku, $onlyshow, $showsolution, $context) { |
|
|
{ |
|
|
|
|
|
$offsetquestions = game_sudoku_compute_offsetquestions( $game->sourcemodule, $attempt, $numbers, $correctquestions); |
|
|
$offsetquestions = game_sudoku_compute_offsetquestions( $game->sourcemodule, $attempt, $numbers, $correctquestions); |
|
|
|
|
|
|
|
|
if ($game->toptext != '') { |
|
|
if ($game->toptext != '') { |
|
|
echo $game->toptext.'<br>'; |
|
|
echo $game->toptext.'<br>'; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
game_sudoku_showsudoku( $sudoku->data, $sudoku->guess, true, $showsolution, $offsetquestions, $correctquestions, $id, $attempt, $game); |
|
|
game_sudoku_showsudoku( $sudoku->data, $sudoku->guess, true, $showsolution, $offsetquestions, |
|
|
switch( $game->sourcemodule) |
|
|
$correctquestions, $id, $attempt, $game); |
|
|
{ |
|
|
switch ($game->sourcemodule) { |
|
|
case 'quiz': |
|
|
case 'quiz': |
|
|
case 'question': |
|
|
case 'question': |
|
|
game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetquestions, $numbers, $correctquestions, $onlyshow, $showsolution, $context); |
|
|
game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetquestions, |
|
|
|
|
|
$numbers, $correctquestions, $onlyshow, $showsolution, $context); |
|
|
break; |
|
|
break; |
|
|
case 'glossary': |
|
|
case 'glossary': |
|
|
game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $offsetquestions, $numbers, $correctquestions, $onlyshow, $showsolution); |
|
|
game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $offsetquestions, |
|
|
|
|
|
$numbers, $correctquestions, $onlyshow, $showsolution); |
|
|
break; |
|
|
break; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -116,9 +132,8 @@ function game_sudoku_play( $id, $game, $attempt, $sudoku, $onlyshow, $showsoluti |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//returns a map with an offset and id of each question |
|
|
// Returns a map with an offset and id of each question. |
|
|
function game_sudoku_compute_offsetquestions( $sourcemodule, $attempt, &$numbers, &$correctquestions) |
|
|
function game_sudoku_compute_offsetquestions( $sourcemodule, $attempt, &$numbers, &$correctquestions) { |
|
|
{ |
|
|
|
|
|
global $CFG, $DB; |
|
|
global $CFG, $DB; |
|
|
|
|
|
|
|
|
$select = "attemptid = $attempt->id"; |
|
|
$select = "attemptid = $attempt->id"; |
|
@ -144,33 +159,32 @@ function game_sudoku_compute_offsetquestions( $sourcemodule, $attempt, &$numbers |
|
|
foreach ($recs as $rec) { |
|
|
foreach ($recs as $rec) { |
|
|
$offsetquestions[ $rec->col] = $rec->id2; |
|
|
$offsetquestions[ $rec->col] = $rec->id2; |
|
|
$numbers[ $rec->id2] = $rec->col; |
|
|
$numbers[ $rec->id2] = $rec->col; |
|
|
if($rec->score == 1) |
|
|
if ( $rec->score == 1) { |
|
|
$correctquestions[ $rec->col] = 1; |
|
|
$correctquestions[ $rec->col] = 1; |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
ksort( $offsetquestions); |
|
|
ksort( $offsetquestions); |
|
|
|
|
|
|
|
|
return $offsetquestions; |
|
|
return $offsetquestions; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function getrandomsudoku() |
|
|
function getrandomsudoku() { |
|
|
{ |
|
|
|
|
|
global $DB; |
|
|
global $DB; |
|
|
|
|
|
|
|
|
$count = $DB->count_records( 'game_sudoku_database'); |
|
|
$count = $DB->count_records( 'game_sudoku_database'); |
|
|
if( $count == 0) |
|
|
if ($count == 0) { |
|
|
{ |
|
|
|
|
|
require_once(dirname(__FILE__) . '/../db/importsudoku.php'); |
|
|
require_once(dirname(__FILE__) . '/../db/importsudoku.php'); |
|
|
|
|
|
|
|
|
$count = $DB->count_records( 'game_sudoku_database'); |
|
|
$count = $DB->count_records( 'game_sudoku_database'); |
|
|
if( $count == 0) |
|
|
if ($count == 0) { |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
$i = mt_rand( 0, $count - 1); |
|
|
$i = mt_rand( 0, $count - 1); |
|
|
|
|
|
|
|
|
if( ($recs = $DB->get_records( 'game_sudoku_database', null, '', '*', $i, 1)) != false) |
|
|
if (($recs = $DB->get_records( 'game_sudoku_database', null, '', '*', $i, 1)) != false) { |
|
|
{ |
|
|
|
|
|
foreach ($recs as $rec) { |
|
|
foreach ($recs as $rec) { |
|
|
return $rec; |
|
|
return $rec; |
|
|
} |
|
|
} |
|
@ -179,24 +193,22 @@ function getrandomsudoku() |
|
|
return false; |
|
|
return false; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function game_sudoku_getclosed( $data) { |
|
|
function game_sudoku_getclosed( $data) |
|
|
|
|
|
{ |
|
|
|
|
|
$a = array(); |
|
|
$a = array(); |
|
|
|
|
|
|
|
|
$n = game_strlen( $data); |
|
|
$n = game_strlen( $data); |
|
|
for( $i=1; $i <= $n; $i++) |
|
|
for ($i = 1; $i <= $n; $i++) { |
|
|
{ |
|
|
|
|
|
$c = game_substr( $data, $i - 1, 1); |
|
|
$c = game_substr( $data, $i - 1, 1); |
|
|
if( $c >= "1" and $c <= "9") |
|
|
if ($c >= "1" and $c <= "9") { |
|
|
$a[ $i] = $i; |
|
|
$a[ $i] = $i; |
|
|
} |
|
|
} |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
return $a; |
|
|
return $a; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_showsudoku( $data, $guess, $bShowLegend, $bShowSolution, $offsetquestions, $correctquestions, $id, $attempt, $game) |
|
|
function game_sudoku_showsudoku( $data, $guess, $bshowlegend, $bshowsolution, $offsetquestions, |
|
|
{ |
|
|
$correctquestions, $id, $attempt, $game) { |
|
|
global $CFG, $DB; |
|
|
global $CFG, $DB; |
|
|
|
|
|
|
|
|
$correct = $count = 0; |
|
|
$correct = $count = 0; |
|
@ -204,58 +216,49 @@ function game_sudoku_showsudoku( $data, $guess, $bShowLegend, $bShowSolution, $o |
|
|
echo "<br>\r\n"; |
|
|
echo "<br>\r\n"; |
|
|
echo '<table border="1" style="border-collapse: separate; border-spacing: 0px;">'; |
|
|
echo '<table border="1" style="border-collapse: separate; border-spacing: 0px;">'; |
|
|
$pos = 0; |
|
|
$pos = 0; |
|
|
for( $i=0; $i <= 2; $i++) |
|
|
for ($i = 0; $i <= 2; $i++) { |
|
|
{ |
|
|
|
|
|
echo "<tr>"; |
|
|
echo "<tr>"; |
|
|
for( $j=0; $j <= 2; $j++) |
|
|
for ($j = 0; $j <= 2; $j++) { |
|
|
{ |
|
|
|
|
|
echo '<td><table border="1" width="100%">'; |
|
|
echo '<td><table border="1" width="100%">'; |
|
|
for( $k1=0; $k1 <= 2; $k1++) |
|
|
for ($k1 = 0; $k1 <= 2; $k1++) { |
|
|
{ |
|
|
|
|
|
echo "<tr>"; |
|
|
echo "<tr>"; |
|
|
for( $k2=0; $k2 <= 2; $k2++) |
|
|
for ($k2 = 0; $k2 <= 2; $k2++) { |
|
|
{ |
|
|
|
|
|
$s = substr( $data, $pos, 1); |
|
|
$s = substr( $data, $pos, 1); |
|
|
$g = substr( $guess, $pos, 1); |
|
|
$g = substr( $guess, $pos, 1); |
|
|
$pos++; |
|
|
$pos++; |
|
|
if ($g != 0) { |
|
|
if ($g != 0) { |
|
|
$s = $g; |
|
|
$s = $g; |
|
|
} |
|
|
} |
|
|
if( $s >= "1" and $s <= "9") |
|
|
if ($s >= "1" and $s <= "9") { |
|
|
{ |
|
|
// Closed number. |
|
|
//closed number |
|
|
if ($bshowlegend) { |
|
|
if( $bShowLegend) |
|
|
// Show legend. |
|
|
{ |
|
|
if ($bshowsolution == false) { |
|
|
//show legend |
|
|
|
|
|
if( $bShowSolution == false) |
|
|
|
|
|
{ |
|
|
|
|
|
if (!array_key_exists( $pos, $correctquestions)) { |
|
|
if (!array_key_exists( $pos, $correctquestions)) { |
|
|
if( array_key_exists( $pos, $offsetquestions)) |
|
|
if (array_key_exists( $pos, $offsetquestions)) { |
|
|
{ |
|
|
|
|
|
if ($s != $g) { |
|
|
if ($s != $g) { |
|
|
$s = '<input type="submit" value="A'.$pos.'" onclick="OnCheck( '.$pos.');" />'; |
|
|
$s = '<input type="submit" value="A'.$pos.'" onclick="OnCheck( '.$pos.');" />'; |
|
|
} |
|
|
} |
|
|
}else if( $g == 0) |
|
|
} else if ($g == 0) { |
|
|
{ |
|
|
|
|
|
$s = '<input type="submit" value="" onclick="OnCheck( '.$pos.');" />'; |
|
|
$s = '<input type="submit" value="" onclick="OnCheck( '.$pos.');" />'; |
|
|
} |
|
|
} |
|
|
}else |
|
|
} else { |
|
|
{ |
|
|
// Correct question. |
|
|
//correct question |
|
|
|
|
|
$count++; |
|
|
$count++; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
echo '<td width=33% style="text-align: center; padding: .6em; color: red; font-weight: lighter; font-size: 1em;">'.$s.'</td>'; |
|
|
echo '<td width=33% style="text-align: center; padding: .6em; '. |
|
|
}else |
|
|
' color: red; font-weight: lighter; font-size: 1em;">'.$s.'</td>'; |
|
|
{ |
|
|
} else { |
|
|
//not show legend |
|
|
// Not show legend. |
|
|
echo '<td width=33% style="text-align: center; padding: .6em; color: red; font-weight: lighter; font-size: 1em;"> </td>'; |
|
|
echo '<td width=33% style="text-align: center; padding: .6em;'. |
|
|
|
|
|
' color: red; font-weight: lighter; font-size: 1em;"> </td>'; |
|
|
} |
|
|
} |
|
|
}else |
|
|
} else { |
|
|
{ |
|
|
|
|
|
$s = strpos( "-ABCDEFGHI", $s); |
|
|
$s = strpos( "-ABCDEFGHI", $s); |
|
|
$count++; |
|
|
$count++; |
|
|
echo '<td width=33% style="text-align: center; padding: .6em; color: black; font-weight: lighter; font-size: 1em;">'.$s.'</td>'; |
|
|
echo '<td width=33% style="text-align: center; padding: .6em; '. |
|
|
|
|
|
' color: black; font-weight: lighter; font-size: 1em;">'.$s.'</td>'; |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
echo "</tr>"; |
|
|
echo "</tr>"; |
|
@ -265,6 +268,7 @@ function game_sudoku_showsudoku( $data, $guess, $bShowLegend, $bShowSolution, $o |
|
|
echo "</tr>"; |
|
|
echo "</tr>"; |
|
|
} |
|
|
} |
|
|
echo "</table>\r\n"; |
|
|
echo "</table>\r\n"; |
|
|
|
|
|
$href = $CFG->wwwroot.'/mod/game/attempt.php?action=sudokucheckn&id='.$id; |
|
|
|
|
|
|
|
|
?> |
|
|
?> |
|
|
<script language="javascript"> |
|
|
<script language="javascript"> |
|
@ -277,12 +281,12 @@ function game_sudoku_showsudoku( $data, $guess, $bShowLegend, $bShowSolution, $o |
|
|
if (s > "9") |
|
|
if (s > "9") |
|
|
return; |
|
|
return; |
|
|
|
|
|
|
|
|
window.location.href = "<?php echo $CFG->wwwroot.'/mod/game/attempt.php?action=sudokucheckn&id='.$id ?>&pos=" + pos + "&num=" + s; |
|
|
window.location.href = "<?php echo $href; ?>&pos=" + pos + "&num=" + s; |
|
|
} |
|
|
} |
|
|
</script> |
|
|
</script> |
|
|
<?php |
|
|
<?php |
|
|
|
|
|
|
|
|
//Here are the congratulations |
|
|
// Here are the congratulations. |
|
|
if ($attempt->timefinish) { |
|
|
if ($attempt->timefinish) { |
|
|
return $count; |
|
|
return $count; |
|
|
} |
|
|
} |
|
@ -297,7 +301,8 @@ function game_sudoku_showsudoku( $data, $guess, $bShowLegend, $bShowSolution, $o |
|
|
|
|
|
|
|
|
echo '<B><br>'.get_string( 'win', 'game').'</B><BR>'; |
|
|
echo '<B><br>'.get_string( 'win', 'game').'</B><BR>'; |
|
|
echo '<br>'; |
|
|
echo '<br>'; |
|
|
echo "<a href=\"$CFG->wwwroot/mod/game/attempt.php?id=$id\">".get_string( 'nextgame', 'game').'</a> '; |
|
|
echo "<a href=\"$CFG->wwwroot/mod/game/attempt.php?id=$id\">". |
|
|
|
|
|
get_string( 'nextgame', 'game').'</a> '; |
|
|
echo "<a href=\"$CFG->wwwroot/course/view.php?id=$cm->course\">".get_string( 'finish', 'game').'</a> '; |
|
|
echo "<a href=\"$CFG->wwwroot/course/view.php?id=$cm->course\">".get_string( 'finish', 'game').'</a> '; |
|
|
|
|
|
|
|
|
game_updateattempts( $game, $attempt, 1, 1); |
|
|
game_updateattempts( $game, $attempt, 1, 1); |
|
@ -305,9 +310,7 @@ function game_sudoku_showsudoku( $data, $guess, $bShowLegend, $bShowSolution, $o |
|
|
return $count; |
|
|
return $count; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
function game_sudoku_getquestionlist( $offsetquestions) { |
|
|
function game_sudoku_getquestionlist( $offsetquestions) |
|
|
|
|
|
{ |
|
|
|
|
|
$questionlist = ''; |
|
|
$questionlist = ''; |
|
|
foreach ($offsetquestions as $q) { |
|
|
foreach ($offsetquestions as $q) { |
|
|
if ($q != 0) { |
|
|
if ($q != 0) { |
|
@ -323,8 +326,7 @@ function game_sudoku_getquestionlist( $offsetquestions) |
|
|
return $questionlist; |
|
|
return $questionlist; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_getglossaryentries( $game, $offsetentries, &$entrylist, $numbers) |
|
|
function game_sudoku_getglossaryentries( $game, $offsetentries, &$entrylist, $numbers) { |
|
|
{ |
|
|
|
|
|
global $DB; |
|
|
global $DB; |
|
|
|
|
|
|
|
|
$entrylist = implode( ',', $offsetentries); |
|
|
$entrylist = implode( ',', $offsetentries); |
|
@ -333,7 +335,7 @@ function game_sudoku_getglossaryentries( $game, $offsetentries, &$entrylist, $nu |
|
|
print_error( get_string( 'sudoku_noentriesfound', 'game')); |
|
|
print_error( get_string( 'sudoku_noentriesfound', 'game')); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Load the questions |
|
|
// Load the questions. |
|
|
if (!$entries = $DB->get_records_select( 'glossary_entries', "id IN ($entrylist)")) { |
|
|
if (!$entries = $DB->get_records_select( 'glossary_entries', "id IN ($entrylist)")) { |
|
|
print_error( get_string('sudoku_noentriesfound', 'game')); |
|
|
print_error( get_string('sudoku_noentriesfound', 'game')); |
|
|
} |
|
|
} |
|
@ -341,14 +343,14 @@ function game_sudoku_getglossaryentries( $game, $offsetentries, &$entrylist, $nu |
|
|
return $entries; |
|
|
return $entries; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetquestions, $numbers, $correctquestions, $onlyshow, $showsolution, $context) |
|
|
function game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetquestions, $numbers, |
|
|
{ |
|
|
$correctquestions, $onlyshow, $showsolution, $context) { |
|
|
global $CFG; |
|
|
global $CFG; |
|
|
|
|
|
|
|
|
$questionlist = game_sudoku_getquestionlist( $offsetquestions); |
|
|
$questionlist = game_sudoku_getquestionlist( $offsetquestions); |
|
|
$questions = game_sudoku_getquestions( $questionlist); |
|
|
$questions = game_sudoku_getquestions( $questionlist); |
|
|
|
|
|
|
|
|
//I will sort with the number of each question |
|
|
// I will sort with the number of each question. |
|
|
$questions2 = array(); |
|
|
$questions2 = array(); |
|
|
foreach ($questions as $q) { |
|
|
foreach ($questions as $q) { |
|
|
$ofs = $numbers[ $q->id]; |
|
|
$ofs = $numbers[ $q->id]; |
|
@ -366,14 +368,14 @@ function game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetq |
|
|
foreach ($questions2 as $question) { |
|
|
foreach ($questions2 as $question) { |
|
|
$ofs = $numbers[ $question->id]; |
|
|
$ofs = $numbers[ $question->id]; |
|
|
if (array_key_exists( $ofs, $correctquestions)) { |
|
|
if (array_key_exists( $ofs, $correctquestions)) { |
|
|
continue; //I don't show the correct answers |
|
|
continue; // I don't show the correct answers. |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if( $found == false) |
|
|
if ( $found == false) { |
|
|
{ |
|
|
|
|
|
$found = true; |
|
|
$found = true; |
|
|
// Start the form |
|
|
// Start the form. |
|
|
echo "<form id=\"responseform\" method=\"post\" action=\"{$CFG->wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; |
|
|
echo "<form id=\"responseform\" method=\"post\" ". |
|
|
|
|
|
"action=\"{$CFG->wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; |
|
|
if (($onlyshow === false) and ($showsolution === false)) { |
|
|
if (($onlyshow === false) and ($showsolution === false)) { |
|
|
echo "<br><center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\">"; |
|
|
echo "<br><center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\">"; |
|
|
|
|
|
|
|
@ -381,14 +383,14 @@ function game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetq |
|
|
get_string('sudoku_finishattemptbutton', 'game')."\">"; |
|
|
get_string('sudoku_finishattemptbutton', 'game')."\">"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Add a hidden field with the quiz id |
|
|
// Add a hidden field with the quiz id. |
|
|
echo '<div>'; |
|
|
echo '<div>'; |
|
|
echo '<input type="hidden" name="id" value="' . s($id) . "\" />\n"; |
|
|
echo '<input type="hidden" name="id" value="' . s($id) . "\" />\n"; |
|
|
echo '<input type="hidden" name="action" value="sudokucheck" />'; |
|
|
echo '<input type="hidden" name="action" value="sudokucheck" />'; |
|
|
|
|
|
|
|
|
// Print all the questions |
|
|
// Print all the questions. |
|
|
|
|
|
|
|
|
// Add a hidden field with questionids |
|
|
// Add a hidden field with questionids. |
|
|
echo '<input type="hidden" name="questionids" value="'.$questionlist."\" />\n"; |
|
|
echo '<input type="hidden" name="questionids" value="'.$questionlist."\" />\n"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
@ -397,11 +399,10 @@ function game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetq |
|
|
game_print_question( $game, $question, $context); |
|
|
game_print_question( $game, $question, $context); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
if( $found) |
|
|
if ($found) { |
|
|
{ |
|
|
|
|
|
echo "</div>"; |
|
|
echo "</div>"; |
|
|
|
|
|
|
|
|
// Finish the form |
|
|
// Finish the form. |
|
|
echo '</div>'; |
|
|
echo '</div>'; |
|
|
if (($onlyshow === false) and ($showsolution === false)) { |
|
|
if (($onlyshow === false) and ($showsolution === false)) { |
|
|
echo "<center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\"></center>\n"; |
|
|
echo "<center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\"></center>\n"; |
|
@ -411,14 +412,14 @@ function game_sudoku_showquestions_quiz( $id, $game, $attempt, $sudoku, $offsetq |
|
|
} |
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//show the sudoku and glossaryentries |
|
|
// Show the sudoku and glossaryentries. |
|
|
function game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $offsetentries, $numbers, $correctentries, $onlyshow, $showsolution) |
|
|
function game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $offsetentries, $numbers, |
|
|
{ |
|
|
$correctentries, $onlyshow, $showsolution) { |
|
|
global $CFG; |
|
|
global $CFG; |
|
|
|
|
|
|
|
|
$entries = game_sudoku_getglossaryentries( $game, $offsetentries, $questionlist, $numbers); |
|
|
$entries = game_sudoku_getglossaryentries( $game, $offsetentries, $questionlist, $numbers); |
|
|
|
|
|
|
|
|
//I will sort with the number of each question |
|
|
// I will sort with the number of each question. |
|
|
$entries2 = array(); |
|
|
$entries2 = array(); |
|
|
foreach ($entries as $q) { |
|
|
foreach ($entries as $q) { |
|
|
$ofs = $numbers[ $q->id]; |
|
|
$ofs = $numbers[ $q->id]; |
|
@ -431,33 +432,35 @@ function game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $off |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
/// Start the form |
|
|
// Start the form. |
|
|
echo "<br><form id=\"responseform\" method=\"post\" action=\"{$CFG->wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; |
|
|
echo "<br><form id=\"responseform\" method=\"post\" ". |
|
|
|
|
|
"action=\"{$CFG->wwwroot}/mod/game/attempt.php\" onclick=\"this.autocomplete='off'\">\n"; |
|
|
|
|
|
|
|
|
if( $onlyshow) |
|
|
if ($onlyshow) { |
|
|
$hasquestions = false; |
|
|
$hasquestions = false; |
|
|
else |
|
|
} else { |
|
|
$hasquestions = ( count($correctentries) < count( $entries2)); |
|
|
$hasquestions = ( count($correctentries) < count( $entries2)); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
if ($hasquestions) { |
|
|
if ($hasquestions) { |
|
|
echo "<center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\"></center>\n"; |
|
|
echo "<center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\"></center>\n"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
// Add a hidden field with the quiz id |
|
|
// Add a hidden field with the quiz id. |
|
|
echo '<div>'; |
|
|
echo '<div>'; |
|
|
echo '<input type="hidden" name="id" value="' . s($id) . "\" />\n"; |
|
|
echo '<input type="hidden" name="id" value="' . s($id) . "\" />\n"; |
|
|
echo '<input type="hidden" name="action" value="sudokucheckg" />'; |
|
|
echo '<input type="hidden" name="action" value="sudokucheckg" />'; |
|
|
|
|
|
|
|
|
/// Print all the questions |
|
|
// Print all the questions. |
|
|
|
|
|
|
|
|
// Add a hidden field with questionids |
|
|
// Add a hidden field with questionids. |
|
|
echo '<input type="hidden" name="questionids" value="'.$questionlist."\" />\n"; |
|
|
echo '<input type="hidden" name="questionids" value="'.$questionlist."\" />\n"; |
|
|
|
|
|
|
|
|
$number = 0; |
|
|
$number = 0; |
|
|
foreach ($entries2 as $entry) { |
|
|
foreach ($entries2 as $entry) { |
|
|
$ofs = $numbers[ $entry->id]; |
|
|
$ofs = $numbers[ $entry->id]; |
|
|
if (array_key_exists( $ofs, $correctentries)) { |
|
|
if (array_key_exists( $ofs, $correctentries)) { |
|
|
continue; //I don't show the correct answers |
|
|
continue; // I don't show the correct answers. |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
$query = new StdClass; |
|
|
$query = new StdClass; |
|
@ -476,7 +479,7 @@ function game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $off |
|
|
|
|
|
|
|
|
echo "</div>"; |
|
|
echo "</div>"; |
|
|
|
|
|
|
|
|
// Finish the form |
|
|
// Finish the form. |
|
|
if ($hasquestions) { |
|
|
if ($hasquestions) { |
|
|
echo "<center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\"></center>\n"; |
|
|
echo "<center><input type=\"submit\" name=\"submit\" value=\"".get_string('sudoku_submit', 'game')."\"></center>\n"; |
|
|
} |
|
|
} |
|
@ -484,27 +487,25 @@ function game_sudoku_showquestions_glossary( $id, $game, $attempt, $sudoku, $off |
|
|
echo "</form>\n"; |
|
|
echo "</form>\n"; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_showquestion_onfinish( $id, $game, $attempt, $sudoku) |
|
|
function game_sudoku_showquestion_onfinish( $id, $game, $attempt, $sudoku) { |
|
|
{ |
|
|
|
|
|
if (!set_field( 'game_attempts', 'finish', 1, 'id', $attempt->id)) { |
|
|
if (!set_field( 'game_attempts', 'finish', 1, 'id', $attempt->id)) { |
|
|
print_error( "game_sudoku_showquestion_onfinish: Can't update game_attempts id=$attempt->id"); |
|
|
print_error( "game_sudoku_showquestion_onfinish: Can't update game_attempts id=$attempt->id"); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
echo '<B>'.get_string( 'win', 'game').'</B><BR>'; |
|
|
echo '<B>'.get_string( 'win', 'game').'</B><BR>'; |
|
|
echo '<br>'; |
|
|
echo '<br>'; |
|
|
echo "<a href=\"{$CFG->wwwroot}/mod/game/attempt.php?id=$id\">".get_string( 'nextgame', 'game').'</a> '; |
|
|
echo "<a href=\"{$CFG->wwwroot}/mod/game/attempt.php?id=$id\">". |
|
|
|
|
|
get_string( 'nextgame', 'game').'</a> '; |
|
|
echo "<a href=\"{$CFG->wwwroot}?id=$id\">".get_string( 'finish', 'game').'</a> '; |
|
|
echo "<a href=\"{$CFG->wwwroot}?id=$id\">".get_string( 'finish', 'game').'</a> '; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_checkanswers() |
|
|
function game_sudoku_checkanswers() { |
|
|
{ |
|
|
|
|
|
$responses = data_submitted(); |
|
|
$responses = data_submitted(); |
|
|
|
|
|
|
|
|
$actions = question_extract_responses($questions, $responses, $event); |
|
|
$actions = question_extract_responses($questions, $responses, $event); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_check_questions( $id, $game, $attempt, $sudoku, $finishattempt, $course) |
|
|
function game_sudoku_check_questions( $id, $game, $attempt, $sudoku, $finishattempt, $course) { |
|
|
{ |
|
|
|
|
|
global $QTYPES, $DB; |
|
|
global $QTYPES, $DB; |
|
|
|
|
|
|
|
|
$responses = data_submitted(); |
|
|
$responses = data_submitted(); |
|
@ -528,34 +529,33 @@ function game_sudoku_check_questions( $id, $game, $attempt, $sudoku, $finishatte |
|
|
|
|
|
|
|
|
$grade = game_grade_responses( $question, $responses, 100, $answertext); |
|
|
$grade = game_grade_responses( $question, $responses, 100, $answertext); |
|
|
if ($grade < 99) { |
|
|
if ($grade < 99) { |
|
|
//wrong answer |
|
|
// Wrong answer. |
|
|
game_update_queries( $game, $attempt, $query, $grade / 100, $answertext); |
|
|
game_update_queries( $game, $attempt, $query, $grade / 100, $answertext); |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
//correct answer |
|
|
// Correct answer. |
|
|
game_update_queries( $game, $attempt, $query, 1, $answertext); |
|
|
game_update_queries( $game, $attempt, $query, 1, $answertext); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
game_sudoku_check_last( $id, $game, $attempt, $sudoku, $finishattempt, $course); |
|
|
game_sudoku_check_last( $id, $game, $attempt, $sudoku, $finishattempt, $course); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_check_glossaryentries( $id, $game, $attempt, $sudoku, $finishattempt, $course) |
|
|
function game_sudoku_check_glossaryentries( $id, $game, $attempt, $sudoku, $finishattempt, $course) { |
|
|
{ |
|
|
|
|
|
global $QTYPES, $DB; |
|
|
global $QTYPES, $DB; |
|
|
|
|
|
|
|
|
$responses = data_submitted(); |
|
|
$responses = data_submitted(); |
|
|
|
|
|
|
|
|
//this function returns offsetentries, numbers, correctquestions |
|
|
// This function returns offsetentries, numbers, correctquestions. |
|
|
$offsetentries = game_sudoku_compute_offsetquestions( $game->sourcemodule, $attempt, $numbers, $correctquestions); |
|
|
$offsetentries = game_sudoku_compute_offsetquestions( $game->sourcemodule, $attempt, $numbers, $correctquestions); |
|
|
|
|
|
|
|
|
$entrieslist = game_sudoku_getquestionlist( $offsetentries ); |
|
|
$entrieslist = game_sudoku_getquestionlist( $offsetentries ); |
|
|
|
|
|
|
|
|
// Load the glossary entries |
|
|
// Load the glossary entries. |
|
|
if (!($entries = $DB->get_records_select( 'glossary_entries', "id IN ($entrieslist)"))) { |
|
|
if (!($entries = $DB->get_records_select( 'glossary_entries', "id IN ($entrieslist)"))) { |
|
|
print_error( get_string('noglossaryentriesfound', 'game')); |
|
|
print_error( get_string('noglossaryentriesfound', 'game')); |
|
|
} |
|
|
} |
|
|
foreach($entries as $entry) { |
|
|
foreach (entries as $entry) { |
|
|
$answerundefined = optional_param('resp'.$entry->id, 'undefined', PARAM_TEXT); |
|
|
$answerundefined = optional_param('resp'.$entry->id, 'undefined', PARAM_TEXT); |
|
|
if ($answerundefined == 'undefined') { |
|
|
if ($answerundefined == 'undefined') { |
|
|
continue; |
|
|
continue; |
|
@ -567,10 +567,11 @@ function game_sudoku_check_glossaryentries( $id, $game, $attempt, $sudoku, $fini |
|
|
if (game_upper( $entry->concept) != game_upper( $answer)) { |
|
|
if (game_upper( $entry->concept) != game_upper( $answer)) { |
|
|
continue; |
|
|
continue; |
|
|
} |
|
|
} |
|
|
//correct answer |
|
|
// Correct answer. |
|
|
$select = "attemptid=$attempt->id"; |
|
|
$select = "attemptid=$attempt->id"; |
|
|
$select .= " AND glossaryentryid=$entry->id AND col>0"; |
|
|
$select .= " AND glossaryentryid=$entry->id AND col>0"; |
|
|
$select .= " AND questiontext is null"; // check the student guesses not source glossary entry. |
|
|
// Check the student guesses not source glossary entry. |
|
|
|
|
|
$select .= " AND questiontext is null"; |
|
|
|
|
|
|
|
|
$query = new stdClass(); |
|
|
$query = new stdClass(); |
|
|
if (($query->id = $DB->get_field_select( 'game_queries', 'id', $select)) == 0) { |
|
|
if (($query->id = $DB->get_field_select( 'game_queries', 'id', $select)) == 0) { |
|
@ -586,10 +587,8 @@ function game_sudoku_check_glossaryentries( $id, $game, $attempt, $sudoku, $fini |
|
|
return true; |
|
|
return true; |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
// This is the last function after submiting the answers. |
|
|
//this is the last function after submiting the answers. |
|
|
function game_sudoku_check_last( $id, $game, $attempt, $sudoku, $finishattempt, $course) { |
|
|
function game_sudoku_check_last( $id, $game, $attempt, $sudoku, $finishattempt, $course) |
|
|
|
|
|
{ |
|
|
|
|
|
global $CFG, $DB; |
|
|
global $CFG, $DB; |
|
|
|
|
|
|
|
|
$correct = $DB->get_field_select( 'game_queries', 'COUNT(*) AS c', "attemptid=$attempt->id AND score > 0.9"); |
|
|
$correct = $DB->get_field_select( 'game_queries', 'COUNT(*) AS c', "attemptid=$attempt->id AND score > 0.9"); |
|
@ -597,21 +596,18 @@ function game_sudoku_check_last( $id, $game, $attempt, $sudoku, $finishattempt, |
|
|
|
|
|
|
|
|
if ($all) { |
|
|
if ($all) { |
|
|
$grade = $correct / $all; |
|
|
$grade = $correct / $all; |
|
|
}else |
|
|
} else { |
|
|
{ |
|
|
|
|
|
$grade = 0; |
|
|
$grade = 0; |
|
|
} |
|
|
} |
|
|
game_updateattempts( $game, $attempt, $grade, $finishattempt); |
|
|
game_updateattempts( $game, $attempt, $grade, $finishattempt); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
function game_sudoku_check_number( $id, $game, $attempt, $sudoku, $pos, $num, $context) |
|
|
function game_sudoku_check_number( $id, $game, $attempt, $sudoku, $pos, $num, $context) { |
|
|
{ |
|
|
|
|
|
global $DB; |
|
|
global $DB; |
|
|
|
|
|
|
|
|
$correct = game_substr( $sudoku->data, $pos - 1, 1); |
|
|
$correct = game_substr( $sudoku->data, $pos - 1, 1); |
|
|
|
|
|
|
|
|
if( $correct != $num) |
|
|
if ($correct != $num) { |
|
|
{ |
|
|
|
|
|
game_sudoku_play( $id, $game, $attempt, $sudoku, false, false, $context); |
|
|
game_sudoku_play( $id, $game, $attempt, $sudoku, false, false, $context); |
|
|
return; |
|
|
return; |
|
|
} |
|
|
} |
|
|