Zadanie 3

W grze w wojnę bierze udział dwu graczy grających talią 24 kart. Na początku karty są tasowane, potem obaj gracze otrzymują po 12 kart. Gra polega na tym, że gracze wykładają swoje pierwsze karty, ten który wyłożył wyższą kartę bierze obie i umieszcza (w dowolnej kolejności - można przyjąć pewną ustaloną kolejność lub wybierać losową) na końcu swoich kart. Jeśli obaj gracze wyłożą tę samą kartę, to dokładają jeszcze po jednej i jeszcze raz po jednej. Ten który dołożył wyższą z tych trzecich kart bierze wszystkie 6 kart i dokłada je (w dowolnej kolejności) na koniec swoich kart. Jeśli któremuś z graczy zabraknie kart, to jego rywal bierze wszystkie karty. Jeśli 3-cie karty były równe, to postępowanie powtarza się (i porównuje 5-te karty, jeśli i to nie pomoże, to 7-me itd.). Jeśli w czasie takiego dokładania w tym samym momencie obu graczom skończą się karty, to gra kończy się remisem. Przegrywa ten gracz, któremu pierwszemu skończą się karty.

Napisz program symulujący grę w wojnę. Program powinien na początku wygenerować listę wszystkich kart (funkcja TwórzTalię), potasować ją (procedura Tasuj, działająca na zasadzie przestawiania kart na liście), rozdzielić na dwie listy (co drugą, procedura Podziel), a następnie póki któraś z list się nie skończy wykonujący pojedynczy krok gry (procedura Zagranie) zgodnie z podanymi regułami gry. Przed pierwszym zagraniem i po każdym zagraniu program ma wypisywać obie listy na ekranie (w dowolny czytelny sposób, procedura Wypisz wypisująca jedną listę) i czekać aż użytkownik naciśnie przycisk n (kolejne zagranie) lub k (przerwanie gry).

Wymagana struktura danych: lista prosta (to nie jest jedyna dobra reprezentacja danych dla tego zadania, jest to natomiast reprezentacja wymagana). Wymaganie to dotyczy też sytuacji, gdy pewien zbiór kart musi być gdzieś tymczasowo zapamiętany.

Jak zwykle należy wypisać na początku i końcu działania programu informację o zajętości pamięci (MaxAvail i MemAvail, oczywiście program po zakończeniu symulacji powinien zwrócić do systemu zajętą przez siebie pamięć dynamiczną, więc te wypisane pary liczb powinny być identyczne). Ponadto podczas gry należy także wypisywać aktualny stan pamięci po każdym kroku.

Na koniec należy też wypisać komunikat o tym, który z symulowanych graczy wygrał (lub o remisie).

Uwagi:

Uściślenie warunku zakończenia gry. Gra kończy się, gdy przynajmniej jeden z graczy nie ma kart w momencie, gdy powinien wyłożyć kartę. Jeśli tylko jednemu graczowi brakuje kart, to on przegrywa, jeśli obydwu graczom skończą się karty, gra kończy się remisem. Jeśli gracz wyłoży swoją ostatnią kartę, ale okaże się ona wyższa od karty wyłożonej przez przeciwnika, to bierze obydwie karty ze stołu i gra toczy się dalej.

Rozwiązanie należy przesłać do 25.04.2005 do godziny 12:00 w południe na adres tmal@mimuw.edu.pl.

Zachęcam do wypróbowania nowego sposobu przysyłania rozwiązań. Identyfikator tego zadania to mp3.