[PHP] Jak stworzyć zaawansowany test wyboru lub quiz?

0x01 graphic

Chcesz stworzyć rozbudowany test wyboru, gdzie użytkownik może wybrać jedną z kilku sugerowanych odpowiedzi w wielu pytaniach, jak w przykładzie

0x01 graphic

Dobry test powala losować kolejność pytań i kolejność odpowiedzi w pytaniu. Umożliwia również podgląd ile procent testu zostało wykonane poprawnie, pozwala też na umieszczenie komentarza w zależności od stopnia poprawności rozwiązania testu.

Inną ważną cechą jest łatwe przygotowanie pytań i odpowiedzi. Mało tego - test powinien działać z dowolną ilością pytań i dowolną ilością odpowiedzi w każdym pytaniu, a więc musi być zupełnie elastyczny i dać się dowolnie kształtować.

Ponieważ pytania i odpowiedzi są wyświetlane na stronie WWW nic nie stoi na przeszkodzie aby dołączać do nich zdjęcia czy pliki za pomocą poleceń HTML, co spowoduje, że test będzie w pełni interaktywny.

Właśnie taki test przedstawiony poniżej. Zobacz jak go wykonać:

<?

$pytania = file("test001.txt");

$k5 = "<b>GRATULACJE!</b> <p>Twoja wiedza jest imponująca!";

$k4 = "Bardzo dobrze. Jeszcze trochę wysiłku i zostaniesz mistrzem!";

$k3 = "Poszło Ci przeciętnie. Koniecznie musisz wzbogacić swoją wiedzę!";

$k2 = "Oj... słabo. Pora nadrobić braki i uzupełnić swoje wiadomości!";

$k1 = "To nie były dobre odpowiedzi. Musisz się bardziej przyłożyć!";

$f = $_POST["f"];

$wyniki = $_POST["wyniki"];

srand((double)microtime()*1000000);

if ($wyniki>0) {

$ile = count($pytania); $dobre=0;

for ($o=0; $o<$ile ;$o++) if ($f[$o]==1) $dobre++;

$srednia=sprintf("%2d",($dobre/$ile)*100);

echo "<p><center>Poprawne odpowiedzi: $dobre z $ile. ";

echo "Zaliczone $srednia procent testu.<p>";

if ($srednia<=25) echo $k1;

if ($srednia>25 && $srednia<=50) echo $k2;

if ($srednia>50 && $srednia<=75) echo $k3;

if ($srednia>75 && $srednia<=99) echo $k4;

if ($srednia==100) echo $k5;

echo "</center>";

} else {

echo "<form action=\"index.php\" method=\"post\">";

echo "<input type=\"hidden\" name=\"wyniki\" value=\"1\">";

$ile = count($pytania);

for($i=0;$i<$ile;$i++) {

$nr = array_rand($pytania);

$tmp = $pytania[$nr];

$pytania[$nr] = $pytania[count($pytania)-1];

$pytania[count($pytania)-1] = $tmp;

$pyt = explode("`", array_pop($pytania));

echo "<p><b>"; echo $i+1; echo ". $pyt[0] </b><br>";

for ($b=1;$b<=count($pyt)-1;$b++)

$odp[]="<input type=radio name=\"f[$i]\" value=\"$b\">$pyt[$b]<br>";

$ileodp=count($odp);

for($io=0;$io<$ileodp;$io++) {

$nr=array_rand($odp);

$tmp=$odp[$nr];

$odp[$nr]=$odp[count($odp)-1];

$odp[count($odp)-1]=$tmp;

echo array_pop($odp);

}

}

echo "<center><input type=submit value=\" Gotowe! \"></center></form>";

}

?>

Zmienna $pytania jest tablicą, do której wczytywana jest zawartość pliku test001.txt przechowującego pytania - nazwa pliku może być dowolna. Składnię pytań i konstrukcję tego pliku opiszę na końcu.

Zmienne od $k1 do $k5 są komentarzami wypisywanymi w zależności od tego jak ktoś sobie poradził z odpowiedziami. Do nich też wrócę za chwilę, gdy pojawią się w skrypcie.

Zmienna $wyniki ustawiana jest na wartość 1 gdy wciśnięty zostanie guzik "Gotowe!" po wypełnieniu testu, dzięki czemu wiadomo od razu czy należy pokazać wynik czy wygenerować test. Zmienna $f zwraca zaznaczone odpowiedzi poszczególnych pytań.

Jeżeli zmienna $wyniki jest większa od zera, a więc użytkownik odpowiedział na pytania, obliczane są wyniki testu. Liczba dobrych odpowiedzi jest zerowana, a następnie w pętli sprawdzamy czy wskazana odpowiedź równa jest 1. Jeżeli tak, odpowiedź jest dobra.

System testowania odpowiedzi jest sprytny, bo pomimo tego, że odpowiedzi są przypadkowo ułożone w tescie, ich numeracja jest zgodna z układem pytań w pliku. Ponieważ zawsze pierwsza odpowiedź w pliku jest poprawna, wystarczy sprawdzić czy wskazana odpowiedź jest równa 1.

Na koniec wyliczana jest średnia z całego testu w procentach, ilość dobrych i wszystkich odpowiedzi oraz pokazywane są komentarze (możesz je wyłączyć, jeżeli będą zbędne).

Komentarze podzieliłem na pięć grup. Od 0 do 25 proc., od 26 do 50 proc., od 51 do 75 proc., od 76 do 99 proc. i 100 proc. Użytkownik może więc od razu otrzymać prognozy ocen lub komentarze słowne w zależności od tego, jak dobrze rozwiązał test.

Nieco bardziej rozbudowana jest część generująca test na podstawie pytań z pliku. Po wypisaniu nagłówka formularza losowana jest kolejność pytań. Następnie wypisywany jest tytuł pytania i losowana jest kolejność odpowiedzi w pytaniu.

Proces ten trwa tyle razy ile jest pytań, więc za każdym uruchomieniem testu, pytania i odpowiedzi ułożone są zupełnie inaczej. Nie można nauczyć się kolejności na pamięć, co powoduje, że test dobrze spełnia swoją rolę.

Najważniejsza jest oczywiście konstrukcja pliku z pytaniami i odpowiedziami. Każde pytanie i odpowiedzi znajdują się w osobnej linijce i zawsze pierwsza odpowiedź za pytaniem jest poprawna. W pliku nie może być pustych linii.

Odpowiedzi w pytaniu może być dowolna ilość. Pytań również może być dowolnie wiele. Poszczególne pytania i odpowiedzi muszą być oddzielone znakiem `. Oto przykładowa zawartość pliku:

Jakie miasto jest stolicą Polski?`Warszawa`Poznań`Kraków`Płock

Kiedy była bitwa pod Grunwaldem?`1410`1456`1520`1100`nigdy jej nie było!

Najbardziej znana mysz?`Miki`Mia

Co to jest PHP?`język programowania`bohater kreskówki`marka kotłów parowych

Zapis jest więc bardzo prosty. Pytanie, dobra odpowiedź, pozostałe odpowiedzi. Możesz wpisać dowolną ilość pytań i odpowiedzi, każde pytanie w jednej linijce, nawet gdy odpowiedzi są długie. Całość zapisz w zwykłym pliku tekstowym.