Problem jest w kolejności warunków logicznych
if ($odpowiedzi[$i] == $Poprawne_odp[$i]) {
$pkt = $pkt + 1;
}
to wyłapuje każdą poprawną odpowiedź, dlatego żadne else pod spodem się nie wykona i zawsze dostajesz 1pkt
IMO jak używasz bazy danych, dodoaj tam kolumne punkty/points jako int i na tej podstawie licz
po 2, To jest błędne
foreach ($_POST as $p) {
$odpowiedzi[] = $p;
}
jeśli user "pominie" pytanie to tablica się rozjedzie i indeksy nie będą pasować do poprawnych odpowiedzi
po 3. Zamiast wpisywać $max_pkt = 50 recznie, oblicz sumę punktów wszystkich pytań pobranych z bazy, wtedy procenty będą liczone nawet gdy dodasz nowe pytanie do db