PyGame Gra w Życie Conwaya

Podobne dokumenty
PyGame Gra w Kółko i Krzyżyk

PyGame Gra w Ponga. Spis treści

Zaawansowany kurs języka Python

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 3

Podstawy programowania, Poniedziałek , 8-10 Projekt, część 1

Baltie 3. Podręcznik do nauki programowania dla klas I III gimnazjum. Tadeusz Sołtys, Bohumír Soukup

Obsługa grafiki w Delphi, rysowanie na płótnie, obsługa myszki, zapisywanie obrazków do plików, bitmapy pozaekranowe.

Ćwiczenia z przetwarzania tablic 2D

Budowa i generowanie planszy

2.1. Duszek w labiryncie

Programowanie w języku Python. Grażyna Koba

Opis implementacji: Implementacja przedstawia Grę w życie jako przykład prostej symulacji opartej na automatach.

Obsługa programu Paint. mgr Katarzyna Paliwoda

Microsoft Small Basic

Rysowanie punktów na powierzchni graficznej

narzędzie Linia. 2. W polu koloru kliknij kolor, którego chcesz użyć. 3. Aby coś narysować, przeciągnij wskaźnikiem w obszarze rysowania.

Prezentacje multimedialne w Powerpoint

Pong to dwuwymiarowy symulator tenisa sportowego. Gracz, poruszając prostokątem symulującym paletkę, stara się zdobyć punkt poprzez posłanie piłki

Jak zrobić klasyczny button na stronę www? (tutorial) w programie GIMP

Spadające jabłuszka. licencja CC-BY-SA Uznanie autorstwa Na tych samych warunkach 3.0 Polska. Strona 51

Zajęcia nr 15 JavaScript wprowadzenie do JavaScript

LIVE Gra w życie. LIVE w JavaScript krok po kroku. ANIMACJA Rozpoczynamy od podstawowego schematu stosowanego w animacji

Grażyna Koba. Grafika komputerowa. materiały dodatkowe do podręcznika. Informatyka dla gimnazjum

Narzędzia programu Paint

Instrukcja użytkownika

Opis implementacji: Poznanie zasad tworzenia programów komputerowych za pomocą instrukcji języka programowania.

1. Umieść kursor w miejscu, w którym ma być wprowadzony ozdobny napis. 2. Na karcie Wstawianie w grupie Tekst kliknij przycisk WordArt.

1. Opis okna podstawowego programu TPrezenter.

Rozwiązanie ćwiczenia 8a

1. Przypisy, indeks i spisy.

Grafika komputerowa. Zajęcia 7

Simba 3D LOGO. Cele zajęć: - Poznanie zasad i sposobów tworzenia procedur z parametrami. - Poznanie zasad wywoływania procedur z parametrami.

Wizualne systemy programowania. Wykład 11 Grafika. dr Artur Bartoszewski -Wizualne systemy programowania, sem. III- WYKŁAD

Wymagania edukacyjne - Informatyka w klasie I

Następnie zdefiniujemy utworzony szkic jako blok, wybieramy zatem jak poniżej

Allegro5 3/x. Przykład wklejamy go do dev'a zamiast kodu domyślnego dal programu z allegro i kompilujemy.

BAZY DANYCH Panel sterujący

Ćwiczenia nr 4. Arkusz kalkulacyjny i programy do obliczeń statystycznych

Wymagania edukacyjne z informatyki w klasie V

Podstawy Informatyki Wykład V

Projekt Hurtownia, realizacja rejestracji dostaw produktów

Edytor tekstu MS Word podstawy

FINCH PONG. Realizator: Partner: Patronat:

ECDL/ICDL Przetwarzanie tekstów Moduł B3 Sylabus - wersja 5.0

INFORMATYKA KLASA IV

Obszar Logistyka/Zamówienia Publiczne

Naukę zaczynamy od poznania interpretera. Interpreter uruchamiamy z konsoli poleceniem

Liczby losowe i pętla while w języku Python

Teraz bajty. Informatyka dla szkoły podstawowej. Klasa 4 Wymagania edukacyjne na poszczególne oceny szkolne dla klasy 4

Praca z tekstem: WORD Listy numerowane, wstawianie grafiki do pliku

Google Earth. Co to jest Google Earth? Co to jest KML? Skąd można pobrać Google Earth?

Program szkoleniowy. 24 h dydaktycznych (18 h zegarowych) NAZWA SZCZEGÓŁY CZAS

Dodanie nowej formy do projektu polega na:

Maskowanie i selekcja

Ćwiczenie 1 Automatyczna animacja ruchu

Dodawanie grafiki i obiektów

PROSTY PROGRAM DO MALOWANIA

Praktyka programowania projekt

Zadanie 1. Stosowanie stylów

przedmiot kilka razy, wystarczy kliknąć przycisk Wyczaruj ostatni,

Teraz bajty. Informatyka dla szkoły podstawowej. Klasa VI

Jak dodać własny szablon ramki w programie dibudka i dilustro

dla gastronomii i hoteli S4H W PRAKTYCE DOPASUJ NASZE PROGRAMY DO POTRZEB TWOJEJ FIRMY S4H POS MODYFIKACJE EKRANU BONOWANIA

Projekt Hurtownia, realizacja rejestracji dostaw produktów

CorelDRAW. wprowadzenie

Podręcznik użytkownika programu. Ceremonia 3.1

PLAN WYNIKOWY KLASA 1

Teraz bajty. Informatyka dla szkoły podstawowej. Klasa IV

Laboratorium Systemów SCADA

Skaner Mustek Scan Express

MS Access formularze

I. Spis treści I. Spis treści... 2 II. Kreator szablonów Tworzenie szablonu Menu... 4 a. Opis ikon Dodanie nowego elementu...

Jak uzyskać efekt 3D na zdjęciach z wykorzystaniem programu InkScape

LABORATORIUM 7 Cel: 1_1

Po uruchomieniu programu nasza litera zostanie wyświetlona na ekranie

Arkusz kalkulacyjny EXCEL

SZCZEGÓŁOWY SPIS TREŚCI

Animacje z zastosowaniem suwaka i przycisku

WASM AppInventor Lab 3. Rysowanie i animacja po kanwie PODSTAWY PRACY Z KANWAMI

Warsztaty komputerowe

Zadanie 3. Praca z tabelami

PLAN WYNIKOWY Z ZAJĘĆ KOMPUTEROWYCH DLA KLASY 6

Dokument zawiera podstawowe informacje o użytkowaniu komputera oraz korzystaniu z Internetu.

Nazwa implementacji: Pong. Autor: Jarosław Żok. Opis implementacji: Zmiany w skryptach gry Pong, dodające kolejny element zmieniający jej zasady.

Visual Basic w programie Excel dla Windows

Arkusz strona zawierająca informacje. Dokumenty Excela są jakby skoroszytami podzielonymi na pojedyncze arkusze.

Sieciowe Technologie Mobilne. Laboratorium 2

Ćwiczenie 14 Dmuchawce

Informatyka Arkusz kalkulacyjny Excel 2010 dla WINDOWS cz. 1

KURSY PROGRAMOWANIA DLA DZIECI

Wymagania edukacyjne z przedmiotu zajęcia komputerowe dla klasy VI

3.4. Opis konfiguracji layoutów.

Wymagania edukacyjne na ocenę z informatyki klasa 3

Obsługa programu Paint materiały szkoleniowe

KURSY PROGRAMOWANIA DLA DZIECI

GIMP Grafika rastrowa (Ćwiczenia cz. 2)

Wymagania edukacyjne z przedmiotu zajęcia komputerowe dla klasy IV

Transkrypt:

- 1 - PyGame Gra w Życie Conwaya Opis implementacji: Używając biblioteki PyGame oraz języka Python, stworzymy prostą implementację gry w życie Conwaya. Autorzy: Łukasz Zarzecki, Robert Bednarz Czas realizacji: 90 min Poziom trudności: Poziom 3 Biblioteka PyGame ułatwia tworzenie aplikacji multimedialnych, w tym gier.

I. Zmienne i plansza gry - 2 - Tworzymy plik life.py w terminalu lub w wybranym edytorze i zaczynamy od zdefiniowania zmiennych określających właściwości obiektów w naszej grze. #! /usr/bin/env python # -*- coding: utf-8 -*- import pygame, sys, random from pygame.locals import * #udostępnienie nazw metod z locals # inicjacja modułu pygame pygame.init() # szerokość i wysokość okna gry OKNOGRY_SZER = 800 OKNOGRY_WYS = 400 # przygotowanie powierzchni do rysowania, czyli inicjacja okna gry OKNOGRY = pygame.display.set_mode((oknogry_szer, OKNOGRY_WYS), 0, 32) # tytuł okna gry pygame.display.set_caption('gra o życie') # rozmiar komórki ROZ_KOM = 10 # ilość komórek w poziomie i pionie KOM_POZIOM = OKNOGRY_SZER/ROZ_KOM KOM_PION = OKNOGRY_WYS/ROZ_KOM # wartości oznaczające komórki "martwe" i "żywe" KOM_MARTWA = 0 KOM_ZYWA = 1 # lista opisująca stan pola gry, 0 - komórki martwe, 1 - komórki żywe # na początku tworzymy listę zawierającą KOM_POZIOM zer POLE_GRY = [KOM_MARTWA] * KOM_POZIOM # rozszerzamy listę o listy zagnieżdżone, otrzymujemy więc listę dwuwymiarową for i in range(kom_poziom): POLE_GRY[i] = [KOM_MARTWA] * KOM_PION Kod I.1 W instrukcji pygame.display.set_mode() inicjalizujemy okno gry o rozmiarach 800x400 pikseli i 32 bitowej głębi kolorów. Tworzymy w ten sposób powierzchnię główną do rysowania zapisaną w zmiennej OKNOGRY. Ilość możliwych do narysowania komórek, reprezentowanych przez kwadraty o boku 10 pikseli, wyliczamy w zmiennych KOM_POZIOM i KOM_PION. Najważniejszą strukturą w naszej grze jest POLE_GRY, dwuwymiarowa lista elementów reprezentujących "żywe" i "martwe" komórki, czyli populację. Tworzymy ją w dwóch krokach, na początku inicjujemy zerami jednowymiarową listę o rozmiarze odpowiadającym ilości komórek w poziomie (POLE_GRY = [KOM_MARTWA] * KOM_POZIOM). Następnie do każdego elementu listy przypisujemy listę zawierającą tyle zer, ile jest komórek w pionie.

II. Populacja komórek Kolejnym krokiem będzie zdefiniowanie funkcji przygotowującej i rysującej populację komórek. - 3 - # przygotowanie następnej generacji komórek, czyli zaktualizowanego POLA_GRY def przygotuj_populacje(polegry): # na początku tworzymy 2-wymiarową listę wypełnioną zerami nast_gen = [KOM_MARTWA] * KOM_POZIOM for i in range(kom_poziom): nast_gen[i] = [KOM_MARTWA] * KOM_PION # iterujemy po wszystkich komórkach for y in range(kom_pion): for x in range(kom_poziom): # zlicz populację (żywych komórek) wokół komórki populacja = 0 # wiersz 1 if polegry[x-1][y-1] == KOM_ZYWA: populacja += 1 if polegry[x][y-1] == KOM_ZYWA: populacja += 1 if polegry[x+1][y-1] == KOM_ZYWA: populacja += 1 # wiersz 2 if polegry[x-1][y] == KOM_ZYWA: populacja += 1 if polegry[x+1][y] == KOM_ZYWA: populacja += 1 # wiersz 3 if polegry[x-1][y+1] == KOM_ZYWA: populacja += 1 if polegry[x][y+1] == KOM_ZYWA: populacja += 1 if polegry[x+1][y+1] == KOM_ZYWA: populacja += 1 Kod II.1 # "niedoludnienie" lub przeludnienie = śmierć komórki if polegry[x][y] == KOM_ZYWA and (populacja < 2 or populacja > 3): nast_gen[x][y] = KOM_MARTWA # życie trwa elif polegry[x][y] == KOM_ZYWA and (populacja == 3 or populacja == 2): nast_gen[x][y] = KOM_ZYWA # nowe życie elif polegry[x][y] == KOM_MARTWA and populacja == 3: nast_gen[x][y] = KOM_ZYWA # zwróć nowe polegry z następną generacją komórek return nast_gen # rysowanie komórek (kwadratów) żywych def rysuj_populacje():

- 4 - for y in range(kom_pion): for x in range(kom_poziom): if POLE_GRY[x][y] == KOM_ZYWA: pygame.draw.rect(oknogry, (255,255,255), Rect((x*ROZ_KOM,y*ROZ_KOM),(ROZ_KOM,ROZ_KOM)),1) Najważniejszym fragmentem kodu, implementującym logikę naszej gry, jest funkcja przygotuj_populacje(), która jako parametr przyjmuje omówioną wcześniej strukturę POLE_GRY (pod nazwą polegry). Funkcja sprawdza, jak rozwija się populacja komórek, według następujących zasad: 1. Jeżeli żywa komórka ma mniej niż 2 żywych sąsiadów, umiera z powodu samotności. 2. Jeżeli żywa komórka ma więcej niż 3 żywych sąsiadów, umiera z powodu przeludnienia. 3. Żywa komórka z 2 lub 3 sąsiadami żyje dalej. 4. Martwa komórka z 3 żywymi sąsiadami ożywa. Funkcja iteruje po każdym elemencie POLA_GRY i sprawdza stan sąsiadów każdej komórki, w wierszu 1 powyżej komórki, w wierszu 2 na tym samym poziomie i w wierszu 3 poniżej. Konstrukcja try...except pozwala obsłużyć sytuacje wyjątkowe (błędy), a więc komórki skrajne, które nie mają sąsiadów u góry czy u dołu, z lewej bądź z prawej strony: w takim przypadku wywoływana jest instrukcja pass, czyli nie rób nic :-). Końcowa złożona instrukcja warunkowa if ożywia lub uśmierca sprawdzaną komórkę w zależności od stanu sąsiednich komórek (czyli zmiennej populacja). Zadaniem funkcji rysuj_populacje() jest narysowanie kwadratów (obiekty Rect) o białych bokach w rozmiarze 10 pikseli dla pól (elementów), które w liście POLE_GRY są żywe (mają wartość 1). III. Główna pętla programu Programy interaktywne, w tym gry, reagujące na działania użytkownika, takie jak ruchy czy kliknięcia myszą, działają w pętli, której zadaniem jest: 1. przechwycenie i obsługa działań użytkownika, czyli tzw. zdarzeń (ruchy, kliknięcia myszą, naciśnięcie klawiszy), 2. aktualizacja stanu gry (przesunięcia elementów, aktualizacja planszy), 3. aktualizacja wyświetlanego okna (narysowanie nowego stanu gry). Dopisujemy więc do kodu główną pętlę wraz z obsługą zdarzeń: zycie_trwa = False przycisk_wdol = False # pętla główna programu while True: # obsługa zdarzeń generowanych przez gracza for event in pygame.event.get(): # przechwyć zamknięcie okna if event.type == QUIT: pygame.quit() sys.exit() if event.type == KEYDOWN and event.key == K_RETURN: zycie_trwa = True if zycie_trwa == False: Kod III.1

- 5 - if event.type == MOUSEBUTTONDOWN: przycisk_wdol = True przycisk_typ = event.button if event.type == MOUSEBUTTONUP: przycisk_wdol = False if przycisk_wdol: mouse_x, mouse_y = pygame.mouse.get_pos() mouse_x = mouse_x / ROZ_KOM mouse_y = mouse_y / ROZ_KOM # lewy przycisk myszy ożywia if przycisk_typ == 1: POLE_GRY[mouse_x][mouse_y] = KOM_ZYWA # prawy przycisk myszy uśmierca if przycisk_typ == 3: POLE_GRY[mouse_x][mouse_y] = KOM_MARTWA if zycie_trwa == True: POLE_GRY = przygotuj_populacje(pole_gry) OKNOGRY.fill((0,0,0)) # ustaw kolor okna gry rysuj_populacje() pygame.display.update() pygame.time.delay(100) W obrębie głównej pętli programu pętla for odczytuje kolejne zdarzenia zwracane przez metodę pygame.event.get(). Jak widać, w pierwszej kolejności obsługujemy wydarzenie typu (właściwość.type) QUIT, czyli zakończenie aplikacji. Jednak na początku gry gracz klika lewym lub prawym klawiszem myszy i ożywia lub uśmierca kliknięte komórki w obrębie okna gry. Dzieje się tak dopóty, dopóki zmienna zycie_trwa ma wartość False, a więc dopóki gracz nie naciśnie klawisza ENTER (if event.type == KEYDOWN and event.key == K_RETURN:). Każde kliknięcie myszą zostaje przechwycone (if event.type == MOUSEBUTTONDOWN:) i zapamiętane w zmiennej przycisk_wdol. Jeżeli zmienna ta ma wartość True, pobieramy współrzędne kursora myszy (mouse_x, mouse_y = pygame.mouse.get_pos()) i obliczamy indeksy elementu listy POLE_GRY odpowiadającego klikniętej komórce. Następnie sprawdzamy, który przycisk myszy został naciśnięty; informację tę zapisaliśmy wcześniej za pomocą funkcji event.button w zmiennej przycisk_typ, która przyjmuje wartość 1 (lewy) lub 3 (prawy przycisk myszy), w zależności od klikniętego przycisku ożywiamy lub uśmiercamy komórkę, zapisując odpowiedni stan w liście POLE_GRY. Naciśnięcie klawisza ENTER uruchamia symulację rozwoju populacji. Zmienna zycie_trwa ustawiona zostaje na wartość True, co przerywa obsługę kliknięć myszą, i wywoływana jest funkcja przygotuj_populacje(), która przygotowuje kolejny stan populacji. Końcowe polecenia wypełniają okno gry kolorem (.fill()), wywołują funkcję rysującą planszę (rysuj_populacje()). Funkcja pygame.display.update(), która musi być wykonywana na końcu rysowania, aktualizuje obraz gry na ekranie. Ostatnie polecenie pygame.time.delay(100) dodaje 100-milisekundowe opóźnienie kolejnej aktualizacji stanu populacji. Dzięki temu możemy obserwować jej rozwój na planszy. Grę możemy uruchomić poleceniem wpisanym w terminalu: python life.py.

- 6 - Słownik Kanał alfa (ang. alpha channel) w grafice komputerowej jest kanałem, który definiuje przezroczyste obszary grafiki. Jest on zapisywany dodatkowo wewnątrz grafiki razem z trzema wartościami barw składowych RGB. Inicjalizacja proces wstępnego przypisania wartości zmiennym i obiektom. Każdy obiekt jest inicjalizowany różnymi sposobami zależnie od swojego typu. Iteracja czynność powtarzania (najczęściej wielokrotnego) tej samej instrukcji (albo wielu instrukcji) w pętli. Mianem iteracji określa się także operacje wykonywane wewnątrz takiej pętli. Zdarzenie (ang. event) zapis zajścia w systemie komputerowym określonej sytuacji, np. poruszenie myszką, kliknięcie, naciśnięcie klawisza. pygame.display.set_mode() inicjuje okno lub ekran do wyświetlania, parame rozdzielczość w pikselach = (x,y), flagi, głębia koloru. pygame.display.set_caption() ustawia tytuł okna, parametr: tekst tytułu. pygame.surface() obiekt reprezentujący dowolny obrazek (grafikę), który ma określoną rozdzielczość (szerokość i wysokość) oraz format pikseli (głębokość, przezroczystość); SRCALPHA oznacza, że format pikseli będzie zawierać ustawienie alfa (przezroczystości);.fill() wypełnia obrazek kolorem;.get_rect() zwraca prostokąt zawierający obrazek, czyli obiekt Rect;.convert_alpha() zmienia format pikseli, w tym przezroczystość;.blit() rysuje jeden obrazek na drugim, parame źródło, cel. pygame.draw.rect() rysuje prostokąt na wskazanej powierzchni, parame powierzchnia, kolor, obiekt Rect, grubość obramowania. pygame.draw.ellipse() rysuje okrągły kształt wewnątrz prostokąta, parame przestrzeń, kolor, prostokąt. pygame.font.font() tworzy obiekt czcionki z podanego pliku;.render() tworzy

- 7 - nową powierzchnię z podanym tekstem, parame tekst, antyaliasing, kolor, tło. pygame.event.get() pobiera zdarzenia z kolejki zdarzeń; event.type() zwraca identyfikator SDL typu zdarzenia, np. KEYDOWN, KEYUP, MOUSEMOTION, MOUSEBUTTONDOWN, QUIT. SDL (Simple DirectMedia Layer) międzyplatformowa biblioteka ułatwiająca tworzenie gier i programów multimedialnych. pygame.rect obiekt pygame przechowujący współrzędne prostokąta;.centerx,.x,.y,.top,.bottom,.left,.right wirtualne własności obiektu prostokąta określające jego położenie;.colliderect() metoda sprawdza czy dwa prostokąty nachodzą na siebie. POĆWICZ SAM Zmień grę tak, aby zaczynał ją komputer. Dodaj do gry możliwość rozgrywki wielokrotnej bez konieczności ponownego uruchamiania skryptu. Zmodyfikuj funkcję rysującą pole gry tak, aby komputer rysował krzyżyki, a nie kółka.