[PHP] Jak stworzyć zaawansowany test wyboru lub quiz?
Chcesz stworzyć rozbudowany test wyboru, gdzie użytkownik może wybrać jedną z kilku sugerowanych odpowiedzi w wielu pytaniach, jak w przykładzie
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.