예제 #1
0
function game_question_shortanswer_question($game, $allowspaces, $use_repetitions)
{
    global $DB;
    if ($game->questioncategoryid == 0) {
        print_error(get_string('must_select_questioncategory', 'game'));
    }
    $select = 'category=' . $game->questioncategoryid;
    if ($game->subcategories) {
        $cats = question_categorylist($game->questioncategoryid);
        if (strpos($cats, ',') > 0) {
            $select = 'category in (' . $cats . ')';
        }
    }
    $select .= " AND qtype='shortanswer'";
    $table = '{question} q';
    $fields = 'q.id';
    if (($id = game_question_selectrandom($game, $table, $select, $fields, $use_repetitions)) == false) {
        return false;
    }
    $select = "q.id={$id} AND qa.question={$id}" . " AND q.hidden=0 AND qtype='shortanswer'";
    $table = "{question} q,{question_answers} qa";
    $fields = "qa.id as answerid, q.id, q.questiontext as questiontext, " . "qa.answer as answertext, q.id as questionid, " . "0 as glossaryentryid, '' as attachment";
    //Maybe there are more answers to one question. I use as correct the one with bigger fraction
    $sql = "SELECT {$fields} FROM {$table} WHERE {$select} ORDER BY fraction DESC";
    if (($recs = $DB->get_records_sql($sql, null, 0, 1)) == false) {
        return false;
    }
    foreach ($recs as $rec) {
        return $rec;
    }
}
예제 #2
0
function game_millionaire_selectquestion(&$aanswer, $game, $attempt, &$millionaire, &$query, $context)
{
    global $DB, $USER;
    if ($game->sourcemodule != 'quiz' and $game->sourcemodule != 'question') {
        print_error(get_string('millionaire_sourcemodule_must_quiz_question', 'game', get_string('modulename', 'quiz')) . ' ' . get_string('modulename', $attempt->sourcemodule));
    }
    if ($millionaire->queryid != 0) {
        game_millionaire_loadquestions($game, $millionaire, $query, $aanswer, $context);
        return;
    }
    if ($game->sourcemodule == 'quiz') {
        if ($game->quizid == 0) {
            print_error(get_string('must_select_quiz', 'game'));
        }
        if (game_get_moodle_version() < '02.07') {
            $select = "qtype='multichoice' AND quiz='{$game->quizid}' AND qmo.questionid=q.id" . " AND qqi.question=q.id";
            $table = "{quiz_question_instances} qqi,{question} q, {qtype_multichoice_options} qmo";
            $order = '';
        } else {
            $select = "qtype='multichoice' AND qs.quizid='{$game->quizid}' AND qmo.questionid=q.id" . " AND qs.questionid=q.id";
            $table = "{quiz_slots} qs,{question} q, {qtype_multichoice_options} qmo";
            $order = 'qs.page,qs.slot';
        }
    } else {
        if ($game->questioncategoryid == 0) {
            print_error(get_string('must_select_questioncategory', 'game'));
        }
        // Include subcategories.
        $select = 'category=' . $game->questioncategoryid;
        if ($game->subcategories) {
            $cats = question_categorylist($game->questioncategoryid);
            if (count($cats)) {
                $select = 'q.category in (' . implode(',', $cats) . ')';
            }
        }
        $select .= " AND qtype='multichoice' AND qmo.single=1 AND qmo.questionid=q.id";
        $table = '{question} q, {qtype_multichoice_options} qmo';
    }
    $select .= ' AND hidden=0';
    if ($game->shuffle or $game->quizid == 0) {
        $questionid = game_question_selectrandom($game, $table, $select, 'q.id as id', true);
    } else {
        $questionid = game_millionaire_select_serial_question($game, $table, $select, 'q.id as id', $millionaire->level, $order);
    }
    if ($questionid == 0) {
        print_error(get_string('no_questions', 'game'));
    }
    $q = $DB->get_record('question', array('id' => $questionid), 'id,questiontext');
    $recs = $DB->get_records('question_answers', array('question' => $questionid));
    if ($recs === false) {
        print_error(get_string('no_questions', 'game'));
    }
    $correct = 0;
    $ids = array();
    foreach ($recs as $rec) {
        $aanswer[] = game_filterquestion_answer(str_replace('\\"', '"', $rec->answer), $rec->id, $context->id, $game->course);
        $ids[] = $rec->id;
        if ($rec->fraction == 1) {
            $correct = $rec->id;
        }
    }
    $count = count($aanswer);
    for ($i = 1; $i <= $count; $i++) {
        $sel = mt_rand(0, $count - 1);
        $temp = array_splice($aanswer, $sel, 1);
        $aanswer[] = $temp[0];
        $temp = array_splice($ids, $sel, 1);
        $ids[] = $temp[0];
    }
    $query = new StdClass();
    $query->attemptid = $attempt->id;
    $query->gamekind = $game->gamekind;
    $query->gameid = $game->id;
    $query->userid = $USER->id;
    $query->sourcemodule = $game->sourcemodule;
    $query->glossaryentryid = 0;
    $query->questionid = $questionid;
    $query->questiontext = addslashes($q->questiontext);
    $query->answertext = implode(',', $ids);
    $query->correct = array_search($correct, $ids) + 1;
    if (!($query->id = $DB->insert_record('game_queries', $query))) {
        print_error('error inserting to game_queries');
    }
    $updrec = new StdClass();
    $updrec->id = $millionaire->id;
    $updrec->queryid = $query->id;
    if (!($newid = $DB->update_record('game_millionaire', $updrec))) {
        print_error('error updating in game_millionaire');
    }
    $score = $millionaire->level / 15;
    game_updateattempts($game, $attempt, $score, 0);
    game_update_queries($game, $attempt, $query, $score, '');
}
function game_millionaire_SelectQuestion(&$aAnswer, $game, $attempt, &$millionaire, &$query)
{
    global $CFG, $USER;
    if ($game->sourcemodule != 'quiz' and $game->sourcemodule != 'question') {
        error(get_string('millionaire_sourcemodule_must_quiz_question', 'game', get_string('modulename', 'quiz')) . ' ' . get_string('modulename', $attempt->sourcemodule));
    }
    if ($millionaire->queryid != 0) {
        game_millionaire_loadquestions($millionaire, $query, $aAnswer);
        return;
    }
    if ($game->sourcemodule == 'quiz') {
        if ($game->quizid == 0) {
            error(get_string('must_select_quiz', 'game'));
        }
        $select = "qtype='multichoice' AND quiz='{$game->quizid}' " . " AND {$CFG->prefix}quiz_question_instances.question={$CFG->prefix}question.id";
        $table = "question,{$CFG->prefix}quiz_question_instances";
    } else {
        if ($game->questioncategoryid == 0) {
            error(get_string('must_select_questioncategory', 'game'));
        }
        //include subcategories
        $select = 'category=' . $game->questioncategoryid;
        if ($game->subcategories) {
            $cats = question_categorylist($game->questioncategoryid);
            if (strpos($cats, ',') > 0) {
                $select = 'category in (' . $cats . ')';
            }
        }
        $select .= " AND qtype='multichoice'";
        $table = "question";
    }
    $select .= " AND {$CFG->prefix}question.hidden=0";
    if ($game->shuffle or $game->quizid == 0) {
        $questionid = game_question_selectrandom($game, $table, $select, "{$CFG->prefix}question.id as id");
    } else {
        $questionid = game_millionaire_select_serial_question($game, $table, $select, "{$CFG->prefix}question.id as id", $millionaire->level);
    }
    if ($questionid == 0) {
        error(get_string('millionaire_nowords', 'game'));
    }
    $q = get_record_select('question', "id={$questionid}", 'id,questiontext');
    $recs = get_records_select('question_answers', "question={$questionid}");
    if ($recs === false) {
        error(get_string('millionaire_no_questions', 'game'));
    }
    $correct = 0;
    $ids = array();
    foreach ($recs as $rec) {
        $aAnswer[] = $rec->answer;
        $ids[] = $rec->id;
        if ($rec->fraction == 1) {
            $correct = $rec->id;
        }
    }
    $count = count($aAnswer);
    for ($i = 1; $i <= $count; $i++) {
        $sel = mt_rand(0, $count - 1);
        $temp = array_splice($aAnswer, $sel, 1);
        $aAnswer[] = $temp[0];
        $temp = array_splice($ids, $sel, 1);
        $ids[] = $temp[0];
    }
    $query = new StdClass();
    $query->attemptid = $attempt->id;
    $query->gamekind = $game->gamekind;
    $query->gameid = $game->id;
    $query->userid = $USER->id;
    $query->sourcemodule = $game->sourcemodule;
    $query->questionid = $questionid;
    $query->questiontext = addslashes($q->questiontext);
    $query->answertext = implode(',', $ids);
    $query->correct = array_search($correct, $ids) + 1;
    if (!($query->id = insert_record('game_queries', $query))) {
        print_object($query);
        error('error inserting to game_queries');
    }
    $updrec->id = $millionaire->id;
    $updrec->queryid = $query->id;
    if (!($newid = update_record('game_millionaire', $updrec))) {
        error('error updating in game_millionaire');
    }
    $score = $millionaire->level / 15;
    game_updateattempts($game, $attempt, $score, 0);
    game_update_queries($game, $attempt, $query, $score, '');
}
function game_question_shortanswer_question($game, $allowspaces, $use_repetitions)
{
    global $CFG;
    if ($game->questioncategoryid == 0) {
        error(get_string('must_select_questioncategory', 'game'));
    }
    $select = $CFG->prefix . 'question.category=' . $game->questioncategoryid;
    if ($game->subcategories) {
        $cats = question_categorylist($game->questioncategoryid);
        if (strpos($cats, ',') > 0) {
            $select = $CFG->prefix . 'question.category in (' . $cats . ')';
        }
    }
    $select .= " AND qtype='shortanswer'";
    $table = "question";
    $fields = "{$CFG->prefix}question.id";
    if (($id = game_question_selectrandom($game, $table, $select, $fields, $use_repetitions)) == false) {
        return false;
    }
    $select = "q.id={$id} AND qa.question={$id}" . " AND q.hidden=0 AND qtype='shortanswer'";
    $table = "question q,{$CFG->prefix}question_answers qa";
    $fields = "qa.id as answerid, q.id, q.questiontext as questiontext, " . "qa.answer as answertext, q.id as questionid, " . "0 as glossaryentryid, '' as attachment";
    //Maybe there are more answers to one question. I use as correct the one with bigger fraction
    $recs = get_records_select($table, $select, 'fraction DESC', $fields);
    if ($recs == false) {
        return false;
    }
    foreach ($recs as $rec) {
        return $rec;
    }
}