Ta strona wykorzystuje pliki cookie w celu prezentacji dopasowanych dla Ciebie treści. Możesz włączyć/wyłączyć obsługę plików cookies w swojej przeglądarce.

Dowiedz się więcej

Cześć, przed Tobą jedna z najdłuższych lekcji w naszym budowaniu gry w kólko i krzyżyk. Uzbrój się więć w gorącą herbatę lub kawę. Klawiatura w dłoń i do dzieła!

Definiujemy funckcje

Przyszła pora na zdefiniowanie naszych funkcji, które wpisaliśmy do naszej pętli. Dodajmy je (prawie) na końcu naszego kodu ale przed wywołaniem wpisanej już funkcji play_game()

Najpierw zdefiniujemy funkcję sprawdzającą czy gra sie zakończyła czyli nasze check_if_game_over.

Stwórzmy więc:

image

W tej naszej funkcji odwołamy się do uruchomienia kolejnych dwóch funkcji, które nazwiemy: check_if_win() oraz check_if_tie(), które też za chwile zdefiniujemy.

Więc w skrócie, nasza funkcja check_if_game_over() wywoła funkcję check_if_win(), która sprawdzi, czy ktoś wygrał grę, oraz uruchomi funkcję check_if_tie(), w której sprawdzi czy jest remis.

Funkcja def check_if_game_over(): powinna więc wyglądać w tej chwili tak

image

Teraz zdefiniujemy sobie działanie funkcji check_if_win(). Musimy w niej sprawdzić trzy rzeczy z naszej tablicy. Sprawdzić kolumny, wiersze oraz przekątne. Dodajmy sobie teraz brakujące funkcje, do których już odnosimy się w kodzie. Na razie zostawmy je puste ze zwrotem return. Zajmiemy się tym za chwilę.

Tak więc poniżej zdefiniowanej funkcji def check_if_game_over(): zdefiniujmy pozostałe funkcje, których jeszcze nie zdefiniowaliśmy. Zrób to w dokładnie ten sposób:

image

Możesz teraz uruchomić swój kod. Gra powinna się odpalić i powinieneś móc w nieskończoność dodawać “X” na swojej planszy, a cały kod powinien prezentować się w ten sposób:

image

Consola:

image

Zajmijmy się teraz naszą funkcją check_if_win, która sprawdza, czy gra się zakończyła. W grze kółko i krzyżyk wygrywa gracz, który zaznaczy 3 pola poziomo, lub 3 pola pionowo, lub na ukos. Więc musimy zdefiniować te wartości i sprawdzić naszą tablicę.

Musimy więc zdefiniować sobie kolejne trzy zmienne. heck_rows(): następnie check_columns(): oraz check_diagonals():

Zróbmy to bezpośrednio pod naszą definicją funkcji check_if_win(): Dodaj poniższy fragment kodu do swojej gry:

image

Następnie w naszej funkcji def check_if_win(): dodajmy następujące zmienne: image

które będą przechowywać informacje z naszych funkcji. Czyli w uproszczeniu, row_winner będzie otrzymywać wynik z naszej funkcji check_rows, column_winner z funkcji check_colums, a diagonal_winner z funkcji check_diagonals. Już powinieneś wiedzieć jak to działa, bo wcześniej stosowaliśmy podobne rozwiązania ucząc się zmiennych.

Teraz stworzymy kolejne instrukcje warunkowe dla naszych zmiennych, które stworzyliśmy. Dodajmy je do naszej funkcji def check_for_winner(): . Zrób to w ten sposób:

image

Zwróć uwagę na nowe wyrażenie, które pojawiło nam się w kodzie. global jest to funkcja, która pozwala nam się odwołać do zmiennej występującej poza tą funkcją (czyli zmiennej globalnej). W ramach funkcji możemy odwoływać się tylko do zmiennych, które się w niej znajdują. Dla sprawniejszego pisania kodu możesz tworzyć funkcje globalne (np. na początku kodu, do których potem możesz się odwoływać w ramach funkcji lokalnych). Brzmi skomplikowanie, ale wcale takie nie jest.

Popatrz na swój kod. Nasza zmienna winner znajduje się poza lokalną definicją funkcji def check_if_win więc musimy ją w jakiś sposób wprowadzić. Żeby nie opisywać jej od nowa za pomocą global importujemy sobie ją do naszej funkcji lokalnej.

Następnie wprowadź nasze instrukcje warunkowe, które już kilkakrotnie omawialiśmy więc powinieneś rozumieć w jaki sposób działają.

Teraz zdefiniujemy sobie nasze stworzone wcześniej funkcje, które będą sprawdzały czy w naszej tablicy występują te same znaczniki pionowo, poziomo lub po przekątnej.

Więc w naszej funkcji def check_rows() wprowadźmy teraz zmienną row_1, która sprawdzi czy nasze board[0] , board[1], i board[2] z naszej tablicy są takie same, ale (i tu uwaga) inne niż “-”.

Żeby to zrobić wprowadź kod:row_1 = board[0] == board[1] == board[2]

Jak widzisz kod w tej chwili sprawdza i zapisuje w zmiennej row_1 informacje o tym, że pierwsze trzy pozycje na naszej “planszy gry” mają tą samą wartość. Pewnie zastanawiasz się jak sprawdzić czy, żadna z nich nie równa się “-”.

W pythonie istnieją operatory. W przypadku równości to jest “==”, jeżeli chcemy użyć funkcji przeciwnej czyli nie równa korzystamy z operatora “!=”.

Więc na końcu naszej nowej linijki kodu dodaj != “-”. Powinno to wyglądać tak:

image

Czyli przeanalizujmy to jeszcze raz. Zmienna row_1 w naszej funkcji otrzymuje wartość i sprawdza czy pozycja 0, 1, oraz 2 na naszej tablicy nie jest myślnikiem. To pozwoli nam w tej chwili sprawdzić czy w 1 wierszu są X lub 0 i zakończyć grę.

Proste, prawda? Jak już się pewnie domyślasz należy tą czynność powtórzyć i zastosować do kolejnych wierszy z naszej tablicy gry, następnie zmienić nazwę zmiennej na row_2 i row_3 i odpowiednio dostosować pozycje z tablicy do odpowiednich pól.

Na początku naszego kodu wprowadziliśmy też zmienną game_still_going, której nadaliśmy wartość true. Musimy z niej teraz skorzystać czyli wprowadzić ją do naszej funkcji def check_rows():. Możesz to zrobić za pomocą funkcji global, którą już omawialiśmy.

Będzie ona nam potrzebna do zwrócenia wartości FALSE jeżeli jedna z tych zmiennych row_1, row_2 lub row_3 zostanie spełniona.

Teraz wprowadźmy instrukcję warunkową do naszej zmiennej def check_rows(): która spowoduje ustawienie tej wartości na FALSE. Tak więc przed zakończeniem naszej funkcji wpisz:

image

Dzięki temu już wiemy, że jeżeli przynajmniej jedna z naszych zmiennych row będzie prawdziwa gra zmieni wartość zmienne game_still_going na FALSE.

Możesz teraz uruchomić swój kod. I spróbować zagrać tylko “X” na wierszach. Jeżeli zaznaczysz pozycje 1, 2 oraz 3. Powinieneś dostać informacje od systemu, że “X” wygrał.

Twój cały kod powinien wyglądać tak:

image

Udało Ci się zaprogramować informację dla gry o zakończeniu jeżeli jeden z wierszy będzie pełny, Dokładnie w ten sam sposób musisz to zrobić w kolumnach i w przekątnych. Oczywiście musisz zmienić nazwy zmiennych, oraz numery z tablicy.

Dla kolumn będzie to wyglądało tak:

image

Więc dokładnie odwzorowanie tego co zrobiliśmy w wierszach ale nasza gra sprawdzi czy board[0], board[3] i board[6] czyli kolumny i brak występowania w nich myślnika. W instrukcjach warunkowych również zmieniliśmy wartości przy return żeby zostały wtedy zwrócone znaki z odpowiednich kolumn (pierwszej, drugiej lub trzeciej).

Analogicznie robimy z przekątnymi:

image

To już koniec tej lekcji. To była najdłuższa lekcja w tym mini kursie. Udało nam się już zrobić całkiem dużo. Jesteśmy już coraz bliżej końca naszej przygody w programowanie gry.

Miłego kodowania i do następnej lekcji!