<?php
header("Content-Type: text/plain");
mb_internal_encoding('utf-8');

/*   Программа вывода вопросов и проверки ответов,
 *   добавлен тип вопросов с вводом числа
 */

// Общий класс для всех вопросов
abstract class AbstractQuestion 
{
    public $text;           // текст вопроса
    public $points = 5;     // число баллов, по умолчанию 5
    public $correctAnswer;  // правильный ответ
    public $hintAnswer;     // подсказка
    
    // Сверяем введенный ответ с правильным
    public function checkAnswer ($answer) {

        if ($answer == $this->correctAnswer) {
            return true;
        } else {
            return false;
        }
    }
    
    // Абстрактный метод вывода вопроса
    abstract public function printQuestion ();
}

// Класс для вопросов с вариантами ответов
class VariantQuestion extends AbstractQuestion
{
    public $answers;        // варианты ответов
    
    // Вывод вопроса
    public function printQuestion () {     
        
        // Склеиваем текст вопроса и инструкцию для пользователя
        $message = $this->text . "\n\n" . "Варианты ответов:\n";        
        
        // Добавляем варианты ответов
        foreach ($this->answers as $letter => $answer) {
            
            $message .= $letter . ". " . $answer . "\n";
        }
        
        return $message;
    }
}

// Класс для вопросов с вводом числа 
class NumberQuestion extends AbstractQuestion
{
    // Вывод вопроса
    public function printQuestion () {     
        
        // Склеиваем текст вопроса и инструкцию для пользователя
        $message = $this->text . "\n\n" . "Введите правильное значение\n"; 
       
        return $message;
    }
}

// Функция, создающая массив с вопросами:
function createQuestions()
{
    $questions = array();

    // Вопрос 1
    $q1 = new VariantQuestion;
    $q1->text = "Какая планета располагается четвертой по счету от Солнца?";
    $q1->points = 10; // 10 баллов за ответ
    $q1->answers = array('a' => 'Венера', 'b' => 'Марс', 'c' => 'Юпитер', 'd' => 'Меркурий'); // Варианты ответа
    $q1->correctAnswer = 'b'; // Правильный ответ
    $q1->hintAnswer = 'Круглая'; // Подсказка
        
    // Кладем вопрос в массив
    $questions[] = $q1;
    
    // Вопрос 2
    $q2 = new VariantQuestion;
    $q2->text = 'Какой город является столицей Великобритании?';
    $q2->points = 5;
    $q2->answers = array('a' => 'Париж', 'b' => 'Москва', 'c' => 'Нью-Йорк', 'd' => 'Лондон');
    $q2->correctAnswer = 'd';
    $q2->hintAnswer = 'Английский';
    
    // Кладем вопрос в массив
    $questions[] = $q2;
    
    // Вопрос 3
    $q3 = new VariantQuestion;
    $q3->text = 'Кто придумал теорию относительности?';
    $q3->points = 30;
    $q3->answers = array('a' => 'Джон Леннон', 'b' => 'Джим Моррисон', 'c' => 'Альберт Эйнштейн', 'd' => 'Исаак Ньютон');
    $q3->correctAnswer = 'c';
    $q3->hintAnswer = 'Кто-то из них';
    
    // Кладем вопрос в массив
    $questions[] = $q3;
    
    // Вопрос 4
    $q4 = new NumberQuestion;
    $q4->text = 'Сколько весит твоя мамаша?';
    $q4->points = 100;
    $q4->correctAnswer = 200;
    $q4->hintAnswer = 'Гораздо больше, чем она может поднять'; 
    
    // Кладем вопрос в массив
    $questions[] = $q4;

    // Выведем содержимое, чтобы проверить, что все верно
    //var_dump($questions);

    return $questions;
}

// Функция выводящая список вопросов
function printQuestions($questions)
{
    $i = 1; // номер вопроса
    
    foreach ($questions as $question) {
        
        // Выводим номер вопроса и текст вопроса
        echo "{$i} . {$question->printQuestion()}\n\n";
        $i++; 
    }
}

// Проверить ответы, посчитать число баллов и вывести вопросы, на который дан неправильный ответ
function checkAnswers($questions, $answers)
{
    // Проверим, что число ответов равно числу вопросов (защищаемся от ошибки)
    if (count($questions) != count($answers)) {
        die("Число ответов и вопросов не совпадает\n");
    }

    $pointsTotal = 0; // сколько набрано баллов
    $pointsMax = 0;   // сколько можно набрать баллов при всех правильных ответах
    $correctAnswers = 0; // сколько отвечено верно
    $totalQuestions = count($questions); // Сколько всего вопросов

    // Цикл для обхода вопросов и ответов
    for ($i = 0; $i < count($questions); $i++) {
        $question = $questions[$i]; // Текущий вопрос
        $answer = $answers[$i]; // текущий ответ

        // Считаем максимальную сумму баллов
        $pointsMax += $question->points;

        // Проверяем ответ
        if ($question->checkAnswer($answer)) {
            // Добавляем баллы
            $correctAnswers ++;
            $pointsTotal += $question->points;
        } else {
            // Неправильный ответ
            $number = $i + 1;
            echo "Неправильный ответ на вопрос №{$number} ({$question->text}), подсказка: ({$question->hintAnswer})\n";
        }
    }

    // Выведем итог
    echo "Правильных ответов: {$correctAnswers} из {$totalQuestions}, баллов набрано: {$pointsTotal} из {$pointsMax}\n";
}

$questions = createQuestions();
printQuestions($questions);
$answers = array('b', 'z', 'a', 200);
checkAnswers($questions, $answers);
?>