• Nie Znaleziono Wyników

Napisy, BlackJack2020-04-29TW PO, ćwiczenia

N/A
N/A
Protected

Academic year: 2021

Share "Napisy, BlackJack2020-04-29TW PO, ćwiczenia"

Copied!
16
0
0

Pełen tekst

(1)

PO, ćwiczenia

Napisy, BlackJack 2020-04-29

TW

(2)

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) {...}

...

}

(3)

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)

(4)

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

(5)

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

(6)

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ń.

(7)

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.

(8)

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,

(9)

BlackJack

- jakie strategie dla graczy przewidujemy?

- jak zorganizować rozgrywkę?

- jakie klasy pomocnicze mogą się nam przydać?

(10)

Klasy

- klasa bazowa gry (BlackJack)

- klasy do obsługi różnych strategii graczy - GraczAbstrakcyjny

- GraczSpiący - GraczLosowy - GraczLimitowy

- GraczOstrożny - Krupier

- Talia - Karta

(11)

Klasa BlackJack: graj

Funkcja otrzymuje listę graczy oraz liczbę rozdań.

Każdy gracz jest traktowany oddzielnie.

Przekazuje i odbieramy karty od graczy.

(12)

Gracz i GraczAbstrakcyjny

(13)

Przykładowa strategia gracza

(14)

Talia i Karta

(15)

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

(16)

Rozwiązanie

Rozwiązanie zadania BlackJack zaproponowane przez wykładowcę:

https://drive.google.com/file/d/1v7KTqCaA0EdE3VCLPXXmVEQLaVf-MR2w/view

?usp=sharing

Cytaty

Powiązane dokumenty

Dla dodatniej liczby naturalnej n znaleźć wzór na największą potęgę liczby pierwszej p dzielącą n!4. Rozłożyć na czynniki pierwsze

 na zielonym - jeżeli oba pingwinki razem (w sumie) zdobędą 15 punktów i zielony &gt; fioletowy (czyli Zielony ma więcej punktów niż Fioletek) to może

Oblicz prawdopodobieństwo wylosowania króla z talii 24 kart, jeśli wiemy, że wy- losowana karta jest pikiem..

Udowodnić, że średnia arytmetyczna tych liczb jest równa n+1 r

Przed punktacją: możesz przemienić do 2 swoich kart: każdą z sekretnej na jawną lub z jawnej na sekretną!.

przecinają się w jednym punkcie, to równoległościan opisany na tym czworościanie jest rombościanem (wszystkie jego ściany są rombami).. Skonstruuj trójkąt mając dane jego

31 Ubocznym działaniem tego ataku - o ile atakujący nie jest w stanie usuwać z łącza pakietów generowanych przez klienta oraz serwer - jest burza pakietów ACK.. Liczba ich

Ubocznym działaniem tego ataku - o ile atakujący nie jest w stanie usuwać z łącza pakietów generowanych przez klienta oraz serwer - jest burza pakietów ACK.. Liczba ich