id = $id; $crossm->sourcemodule = $game->sourcemodule; $this->delete_records( $id); if (!(game_insert_record( "game_cross", $crossm))){ print_error( 'Insert page: new page game_cross not inserted'); } foreach( $crossd as $rec) { $rec->attemptid = $id; $rec->questiontext = addslashes( $rec->questiontext); $rec->gamekind = $game->gamekind; $rec->gameid = $game->id; $rec->userid = $USER->id; $rec->sourcemodule = $game->sourcemodule; if (!$DB->insert_record( 'game_queries', $rec)){ print_error( 'Insert page: new page game_queries not inserted'); } game_update_repetitions($game->id, $USER->id, $rec->questionid, $rec->glossaryentryid); } return true; } function delete_records( $id) { global $DB; if( !$DB->delete_records( 'game_queries', array( 'attemptid' => $id))){ print_error( "Can't delete from game_queries attemptid=$id"); } if( !$DB->delete_records( 'game_cross', array( 'id' => $id))){ print_error( "Can't delete from game_cross id=$id"); } } function loadcross( $g, &$done, &$html, $game, $attempt, $crossrec, $onlyshow, $showsolution, &$finishattempt, $showhtmlsolutions, &$language, $showstudentguess, $context) { global $DB; $info = ''; $correctLetters = 0; $allLetters = 0; $wrongLetters = 0; $html = ''; $done = false; $loadfromdb = ( $g == ""); $this->m_mincol = $this->m_minrow = 0; $this->m_maxcol = $crossrec->cols; $this->m_maxrow = $crossrec->rows; if( $g == ""){ $g = str_repeat( ' ', $this->m_maxcol * $this->m_maxrow); } $load = false; $puzzle = str_repeat('.', $this->m_maxrow * $this->m_maxcol); if ($recs = $DB->get_records( 'game_queries', array( 'attemptid' => $crossrec->id))) { $a = array(); foreach ($recs as $rec) { if( $rec->horizontal) $key = sprintf( 'h%10d %10d', $rec->row, $rec->col); else $key = sprintf( 'v%10d %10d', $rec->col, $rec->row); $a[ $key] = $rec; } ksort( $a); $b = array(); $correctletters = $wrongletters = $restletters = 0; foreach( $a as $rec){ $this->updatecrossquestions( $rec, $g, $pos, $correctletters, $wrongletters, $restletters, $game, $attempt, $crossrec, $loadfromdb); $b[] = $rec; if( ($rec->col != 0) and ($rec->row != 0)){ $load = true; } if( $language == ''){ $language = game_detectlanguage( $rec->answertext); } } $info = $this->game_cross_computecheck( $correctletters, $wrongletters, $restletters, $game, $attempt, $done, $onlyshow, $showsolution, $finishattempt); $html = $this->showhtml_base( $crossrec, $b, $showsolution, $showhtmlsolutions, $showstudentguess, $context, $game); } if( $load == false) { $finishattempt = true; } return $info; } function game_cross_computecheck( $correctletters, $wrongletters, $restletters, $game, $attempt, &$done, $onlyshow, $showsolution, $finishattempt) { $ret = ''; //if( $correctletters == 0 and $wrongletters == 0){ // return $ret; //} $and = get_string( 'and', 'game'); $a = array(); if( $correctletters) $a[] = $correctletters.' '.( $correctletters > 1 ? get_string( 'cross_corrects', 'game') :get_string( 'cross_correct', 'game')); if( $wrongletters) $a[] = ''.$wrongletters.' '.( $wrongletters > 1 ? get_string( 'cross_errors', 'game') : get_string( 'cross_error', 'game')).''; if( $correctletters > 1 or $wrongletters > 1) { $ret = get_string( 'cross_found_many', 'game'); }else if( count( $a)) { $ret = get_string( 'cross_found_one', 'game'); }else $ret = ''; $i = 0; foreach( $a as $msg) { $i++; if( $i == 1){ $ret .= ' '.$msg; }else if( $i == count($a)) { $ret .= ' '.get_string( 'and', 'game').' '.$msg; }else { $ret .= ', '.$msg; } } $done = ( $restletters == 0 ? true : false); if( $finishattempt == false){ if( $onlyshow or $showsolution){ return $ret; } }else{ $done = 1; } $grade = $correctletters / ($correctletters + $restletters); $ret .= '
'.get_string( 'grade', 'game').' '.round( $grade * 100).' %'; game_updateattempts( $game, $attempt, $grade, $done); return $ret; } //rec is a record of cross_questions function updatecrossquestions( &$rec, &$g, &$pos, &$correctletters, &$wrongletters, &$restletters, $game, $attempt, $crossrec, $loadfromdb) { global $DB, $USER; $word = $rec->answertext; $len = game_strlen( $word); if( $loadfromdb) $guess = $rec->studentanswer; else $guess = game_substr( $g, $pos, $len); $len_guess = game_strlen( $guess);; $pos += $len; $is_empty = true; for($i = 0; $i < $len; $i++) { if( $i < $len_guess) $letterguess = game_substr( $guess, $i, 1); else $letterguess = " "; if( $letterguess != ' ') $is_empty = false; $letterword= game_substr( $word, $i, 1); if( $letterword != $letterguess) { if( ($letterguess != ' ' and $letterguess != '_')){ $wrongletters++; } game_setchar( $guess, $i, '_'); $restletters++; }else if( $letterguess == ' '){ if( $guess == $word){ $correctletters++; }else { //$wrongletters++; //game_setchar( $guess, $i, '_'); } }else { $correctletters++; } } if( $is_empty){ return; } if( ($rec->studentanswer == $guess )){ return; } $rec->studentanswer = $guess; $updrec = new stdClass(); $updrec->studentanswer = $guess; $updrec->id = $rec->id; if (!$DB->update_record( 'game_queries', $updrec, $rec->id)){ print_error( 'Update game_queries: not updated'); } $score = $correctletters / $len; game_update_queries( $game, $attempt, $rec, $score, $guess); } }