You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
181 lines
4.2 KiB
181 lines
4.2 KiB
<?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/>.
|
|
|
|
/**
|
|
* Creates a sudoku.
|
|
*
|
|
* @package mod_game
|
|
* @copyright 2007 Vasilis Daloukas
|
|
* @license http://www.gnu.org/copyleft/gpl.html GNU GPL v3 or later
|
|
*/
|
|
require( "../../../config.php");
|
|
require_once("class.Sudoku.php");
|
|
require( '../header.php');
|
|
|
|
$action = optional_param('action', PARAM_ALPHA); // The action.
|
|
require_login();
|
|
if ($action == 'create') {
|
|
AppendSudokuB();
|
|
} else {
|
|
showform();
|
|
}
|
|
|
|
/**
|
|
* Show form
|
|
*/
|
|
function showform() {
|
|
$id = required_param('id', PARAM_NUMBER); // The action.
|
|
|
|
?>
|
|
<form name="form" method="post" action="create.php">
|
|
<center>
|
|
<table cellpadding="5">
|
|
<tr valign="top">
|
|
<td align="right"><b><?php echo get_string( 'sudoku_create_count', 'game'); ?>:</b></td>
|
|
<td>
|
|
<input type="text" name="count" size="6" value="2" /><br>
|
|
</td>
|
|
</tr>
|
|
<tr><td colspan=2><center><br><input type="submit" value="<?php print_string('sudoku_create_start', 'game') ?>" /></td></tr>
|
|
</table>
|
|
<input type="hidden" name=action value="create" >
|
|
<input type="hidden" name=level1 value="1" >
|
|
<input type="hidden" name=level2 value="10" >
|
|
<input type="hidden" name=id value="<?php echo $id; ?>" />
|
|
</form>
|
|
|
|
<?php
|
|
}
|
|
|
|
/**
|
|
* Append sudoku
|
|
*/
|
|
function appendsudokub() {
|
|
global $DB;
|
|
|
|
$level1 = required_param('level1', PARAM_NUMBER);
|
|
$level2 = required_param('level2', PARAM_NUMBER);
|
|
$count = required_param('count', PARAM_NUMBER);
|
|
|
|
$level = $level1;
|
|
|
|
for ($i = 1; $i <= $count; $i++) {
|
|
create( $si, $sp, $level);
|
|
|
|
$newrec->data = packsudoku( $si, $sp);
|
|
if (strlen( $newrec->data) != 81) {
|
|
return 0;
|
|
}
|
|
$newrec->level = $level;
|
|
$newrec->opened = GetOpened( $si);
|
|
|
|
$DB->insert_record( 'game_sudoku_database', $newrec, true);
|
|
|
|
$level++;
|
|
if ($level > $level2) {
|
|
$level = $level1;
|
|
}
|
|
|
|
echo get_string( 'sudoku_creating', 'game', $i)."<br>\r\n";
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Pack sudoku
|
|
*
|
|
* @param object $si
|
|
* @param object $sp
|
|
*
|
|
* @return the packed sudoku
|
|
*/
|
|
function packsudoku( $si, $sp) {
|
|
$data = '';
|
|
|
|
for ($i = 1; $i <= 9; $i++) {
|
|
for ($j = 1; $j <= 9; $j++) {
|
|
$c = &$sp->thesquares[$i];
|
|
$c = &$c->getcell($j);
|
|
$solution = $c->asstring( false);
|
|
|
|
$c = &$si->thesquares[$i];
|
|
$c = &$c->getCell($j);
|
|
$thesolvedstate = $c->solvedstate();
|
|
|
|
if ($thesolvedstate == 1) {
|
|
// Hint.
|
|
$solution = substr( 'ABCDEFGHI', $c->asString( false) - 1, 1);
|
|
}
|
|
|
|
$data .= $solution;
|
|
}
|
|
}
|
|
|
|
return $data;
|
|
}
|
|
|
|
/**
|
|
* Creates a sudoku
|
|
*
|
|
* @param stdClass $si
|
|
* @param object $sp
|
|
* @param int $level
|
|
*
|
|
* @return true if created correctly
|
|
*/
|
|
function create( &$si, &$sp, $level=1) {
|
|
for ($i = 1; $i <= 40; $i++) {
|
|
$sp = new sudoku();
|
|
$theinitialposition = $sp->generatepuzzle( 10, 50, $level);
|
|
if (count( $theinitialposition)) {
|
|
break;
|
|
}
|
|
}
|
|
if ($i > 40) {
|
|
return false;
|
|
}
|
|
|
|
$si = new sudoku();
|
|
|
|
$si->initializepuzzlefromarray( $theinitialposition);
|
|
|
|
return true;
|
|
}
|
|
|
|
/**
|
|
* get opened
|
|
*
|
|
* @param stdClass $si
|
|
*
|
|
* @return count of opened
|
|
*/
|
|
function getopened( $si) {
|
|
$count = 0;
|
|
|
|
for ($i = 1; $i <= 9; $i++) {
|
|
for ($j = 1; $j <= 9; $j++) {
|
|
$c = &$si->thesquares[$i];
|
|
$c = &$c->getcell($j);
|
|
$thesolvedstate = $c->solvedstate();
|
|
|
|
if ($thesolvedstate == 1) {
|
|
// Hint.
|
|
$count++;
|
|
}
|
|
}
|
|
}
|
|
|
|
return $count;
|
|
}
|
|
|