PO, ćwiczenia
Napisy, BlackJack 2020-04-29
TW
Interfejsy
Alternatywny sposób deklarowania wymagań dotyczących funkcjonalności oferowanej przez klasy:
- deklarujemy minimalny zestaw operacji, które powinna obsługiwać nada klasa interface Collection {
void add(int element);
int get(int index);
void remove(int element);
}
class Array implements Collection {
void add(int element) {...}
int get(int index) {...}
void remove(int element) {...}
...
}
Tablice dynamiczne
- w wielu językach programowania (w tym w Javie) nie jest możliwa zmiana rozmiaru tablicy po jej zadeklarowaniu
- w praktyce jest to spore utrudnienie (rzadko kiedy znamy maksymalny rozmiar danych)
- nie jest możliwa obsługa tablicy z dynamicznym rozmiar w pesymistycznym czasie O(1)
- ale jest możliwe rozwiązanie z zamortyzowanym czasem operacji O(1) to oznacza, że od czasu do czasu niektóre operacje będą kosztowne (np.
zajmą O(n) czasu), ale średnio czas pojedynczej operacji to O(1)
Tablice dynamiczne - rozwiązanie
- początkowo alokujemy tablicę tab stałego rozmiaru (np. długości 42), dodatkowo będziemy pamiętać wartość n oznaczającą liczbę zajętych elementów tablicy (początkowo 0)
- zapełnienie tablicy to procentowa wartość (n / tab.length)
- będziemy starać się, żeby zapełnienie zawsze było w zakresie 25%..100%
- dodawanie:
jeśli n < tab.length
dodaj element na koniec zajętego obszaru i zwiększ n wpp
zadeklaruj dwa razy większą tablicę skopiuj wszystkie elementy z tab dodaj nowy element
Tablice dynamiczne - rozwiązanie cd.
- usuwanie (ostatniego elementu):
usuń element z tab, zmniejsz wartość n
jeśli 4 * n > tab.length // jeśli zapełnienie tab >= 25%
nic nie robimy wpp
zadeklaruj nową tablicę o rozmiarze 0.5 * tab.length skopiuj wszystkie elementy z tab do nowej tablicy (będzie ich około 0.25 * tab.length)
- więcej informacji i analiza:
https://en.wikipedia.org/wiki/Dynamic_array
BlackJack
https://pl.wikipedia.org/wiki/Blackjack
Gra w Blackjacka (nasze Oczko, czy Dwadzieścia-jeden) jest grą karcianą,
polegającą na zbieraniu kart tak, by uzbierać więcej oczek na kartach niż rywale, ale nie więcej niż 21. Dokładne reguły gry bywają różne, my przyjmiemy w tym zadaniu pewne ich uproszczenie.
W grę gra co najmniej jeden gracz (liczba graczy jest ograniczona tylko liczbą dostępnych kart, w naszym programie zakładamy, że jeśli graczy jest zbyt wielu i dla któregoś nie starczy kart, to program ma prawo przerwać działanie).
Gra składa się z wielu rozdań.
BlackJack
Rozdanie rozpoczyna się od potasowania kart. Następnie każdy gracz dostaje kolejne karty z talii (po jednej) tak długo, jak długo chce je brać lub do momentu, gdy suma oczek w kartach na ręku przekroczy 21.
Gracz nie widzi karty, którą ma dostać (oczywiście od momentu dołożenia karty do ręki może już ją oglądać).
Po zakończeniu każdego rozdania gracze, którzy zdobyli najwięcej oczek (ale nie więcej niż 21), dostają po 1 punkcie. Może się zdarzyć, że w danym rozdaniu
żaden z graczy nie dostanie punktu. Grę wygrywa ten z graczy (lub ci gracze), który zdobędzie najwięcej punktów.
BlackJack
Liczby oczek na poszczególnych kartach:
karty 2-10: taka sama liczba oczek jak na karcie,
karty J, Q, K: as to 11 oczek.
po 10 oczek każda,
BlackJack
- jakie strategie dla graczy przewidujemy?
- jak zorganizować rozgrywkę?
- jakie klasy pomocnicze mogą się nam przydać?
Klasy
- klasa bazowa gry (BlackJack)
- klasy do obsługi różnych strategii graczy - GraczAbstrakcyjny
- GraczSpiący - GraczLosowy - GraczLimitowy
- GraczOstrożny - Krupier
- Talia - Karta
Klasa BlackJack: graj
Funkcja otrzymuje listę graczy oraz liczbę rozdań.
Każdy gracz jest traktowany oddzielnie.
Przekazuje i odbieramy karty od graczy.
Gracz i GraczAbstrakcyjny
Przykładowa strategia gracza
Talia i Karta
Java - asercje
https://www.geeksforgeeks.org/assertions-in-java/
int divide(int x, int y) { assert y != 0;
return x/y;
}
Domyślnie sprawdzenie asercji jest wyłaczone!
Trzeba pamiętać o uruchamianiu w trybie:
java -ea nazwa_klasy
Rozwiązanie
Rozwiązanie zadania BlackJack zaproponowane przez wykładowcę:
https://drive.google.com/file/d/1v7KTqCaA0EdE3VCLPXXmVEQLaVf-MR2w/view
?usp=sharing