wstępem do Pythona + dokumentacja TheGame
Transkrypt
wstępem do Pythona + dokumentacja TheGame
Maciej Kotecki TheGame Bots recommended 2 1 SPIS TREŚCI 2 Po krótce o TheGame ...................................................................................................................... 4 3 Instalacja i konfiguracja ................................................................................................................... 4 4 Wstęp do Pythona ........................................................................................................................... 5 4.1 Czym się różni Python od C++?................................................................................................ 5 4.2 Dlaczego Python a nie C++? .................................................................................................... 5 4.3 Pierwszy projekt ...................................................................................................................... 5 4.4 Hello world! ............................................................................................................................. 5 4.5 Zmienne ................................................................................................................................... 6 4.5.1 Przypisywanie zmiennych................................................................................................ 6 4.5.2 Listy.................................................................................................................................. 6 4.5.3 Typy zmiennych ............................................................................................................... 7 4.5.4 Tuple ................................................................................................................................ 8 4.6 4.6.1 Operatory matematyczne ............................................................................................... 9 4.6.2 Operatory bitowe ............................................................................................................ 9 4.6.3 Operatory porównania .................................................................................................... 9 4.6.4 Operatory logiczne .......................................................................................................... 9 4.7 Instrukcje warunkowe ........................................................................................................... 10 4.8 Pętle....................................................................................................................................... 10 4.8.1 while .............................................................................................................................. 10 4.8.2 for .................................................................................................................................. 11 4.8.3 range() ........................................................................................................................... 11 4.8.4 break, continue.............................................................................................................. 12 4.9 5 Operatory ................................................................................................................................ 9 Funkcje .................................................................................................................................. 12 4.9.1 Definicja ......................................................................................................................... 12 4.9.2 Zasięg zmiennych, global ............................................................................................... 12 4.10 Klasy....................................................................................................................................... 14 4.11 Moduły .................................................................................................................................. 14 Co jest dostępne w TheGame? ...................................................................................................... 15 5.1 Cel gry .................................................................................................................................... 15 5.2 Zasady .................................................................................................................................... 15 5.3 Serwer ................................................................................................................................... 16 5.3.1 Uruchamianie serwera .................................................................................................. 16 5.3.2 Działanie serwera .......................................................................................................... 17 3 5.3.3 Plik konfiguracyjny......................................................................................................... 17 5.3.4 Baza danych ................................................................................................................... 17 5.4 Klient...................................................................................................................................... 18 5.4.1 settings.py ..................................................................................................................... 18 5.4.2 conversation.py ............................................................................................................. 18 4 2 PO KRÓTCE O THEGAME TheGame to shooter 2D w której każdy z graczy posiada własny czołg którym steruje się wcześniej napisanym botem. Celem gry jest nabicie jak największej liczby punktów przyznawanych za trafienie oraz zabicie gracza. Gra została stworzona przez Marcina Kalinowskiego. 3 INSTALACJA I KONFIGURACJA Podczas zajęć wykorzystany zostanie Python 2.7 wraz z IDE PyCharm. Paczka PortablePython znajduje się pod linkiem. Po pobraniu paczki, należy ją wypakować w dowolne miejsce (domyślna lokalizacja to C:\Portable Python). Korzystać będziemy skonfigurowanego już edytora PyCharm wraz z interpreterem Python 2.7. Przy pierwszym uruchomieniu PyCharma, program rozpocznie czasochłonny proces aktualizacji indeksów, podczas którego nie będzie można uruchamiać napisanego kodu. Aby w przyszłości zapobiec temu, paczkę można wypakować na Pendrive i korzystać z PyCharma prosto z urządzenia. Dodatkowo jeśli projekty zapisane zostaną na Pendrive’ie będzie można z nich korzystać nie zależnie od komputera do którego podłączymy urządzenie. W domowych zastosowaniach polecam raczej korzystać z nowszych wersji instalowanych Pythona oraz PyCharma niż mobilnych. Przy instalacji Pythona pamiętaj aby zaznaczyć opcję dodania ścieżki Pythona do zmiennych środowiskowych! Po instalacji można to zrobić też ręcznie: Mój komputer -> PPM -> właściwości systemu -> zaawansowane ustawienia systemu -> zmienne środowiskowe. Do zmiennej Path należy dopisać lokalizację instalacji Pythona (domyślnie C:\Python27). Nową wartość należy rozdzielić od poprzednich średnikiem (;). W efekcie może to wyglądać następująco: […]C:\WINDOWS;C:\Python27. Dodatkowe informacje oraz materiały zamieszczone zostały na stronie thegame.tk. 5 4 WSTĘP DO PYTHONA 4.1 CZYM SIĘ RÓŻNI PYTHON OD C++? Python jest językiem interpretowanym. C++ jest językiem kompilowanym. Oznacza to że kod napisany w C++ przed wykonaniem musi zostać zamieniony do pliku binarnego który następnie jest wykonywany przez komputer. Python natomiast nie jest kompilowany. Kod napisany w Pythonie jest odczytywany linijka po linijce i natychmiast wykonywany przez interpreter języka. Niesie to za sobą wiele konsekwencji do których dotrę w dalszej części. 4.2 DLACZEGO PYTHON A NIE C++? Python w porównaniu do C++ działa wolniej, jednak przewaga Pythona nad C++ nie leży w szybkości, a w łatwości pisania kodu programu. Python posiada ogromnie rozbudowaną bibliotekę standardową oferującą nam gotowe i elastyczne rozwiązania najczęściej spotykanych problemów, dlatego Python doskonale nadaje się do szybkiego i łatwego tworzenia rozwiązań na różne problemy, w tym pisania naszego bota . 4.3 PIERWSZY PROJEKT W miejscu gdzie wypakowany został PortablePython uruchom edytor PyCharm. Utworzyć nowy projekt: File -> new project. Podać nazwę projektu, lokalizację oraz ustawić odpowiedni interpreter Pythona. Zatwierdzić OK. Dodać nowy plik do projektu. File -> new -> python file. Podać nazwę pliku i zatwierdzić OK. Pliki Pythona posiadają rozszerzenie .py. 4.4 HELLO WORLD! Do wypisywania rzeczy na ekran służy komenda print. Poniżej zamieszczone zostały przykłady użycia. Kod: Wynik programu: print 'Hello world' print "Hello world!" print """Hello world!!""" print "Hello!", "world!" Hello world Hello world! Hello world!! Hello! world! 6 4.5 ZMIENNE 4.5.1 Przypisywanie zmiennych W Pythonie nie używa się deklaracji zmiennych, tak jak to robi się w C++. Zmienną może być właściwie cokolwiek, a każdej zmiennej można jej przypisać dowolną wartość. Kod: a = 7 b = 4 print a + b, a/b b = "tekst" print a, b Wynik programu: 5 1 7 tekst 7 4 W przykładzie zastosowane zostały zmienne całkowite dlatego dzielenie całkowite daje wynik 1. Aby wykonać dzielenie na liczbach rzeczywistych, zmienne należy przypisać w postaci zmiennoprzecinkowej: Kod: a = 7.0 b = 4.0 print a/b Wynik programu: 1.75 4.5.2 Listy Python nie posiada wbudowanych tablic takich jakie dostępne są w C++. Posiada za to listy, z których możemy korzystać w podobny sposób jak z tablicy. Lista Tworzona jest za pomocą nawiasów kwadratowych, a poszczególne wartości oddzielane są przecinkami a = [1,2,3]. Do elementów listy można odwoływać się za pomocą operatora indeksowania, używanego w C++ w odwołaniu do elementu tablicy a[0]. Dodatkowo w Pythonie operator indeksowania pozwala odwoływać się od końca listy, podając indeks za znakiem minus. Kod: a = [1,2,'tekst',False,True,3.2] print a a[0] = 'ala' print a print a[0], a[-1] Wynik: [1, 2, 'tekst', False, True, 3.0] ['ala', 2, 'tekst', False, True, 3.0] ala 3.2 Jak widać w powyższym przykładzie, lista nie musi zawierać elementów tego samego typu. Jako argument operacji print można podać także listę. Aby dodać element na koniec listy należy użyć polecenia lista.append(zmienna). Kod: Wynik: a = [1,2,3] print a a.append(4) print a [1, 2, 3] [1, 2, 3, 4] 7 Operator indeksowania pozwala odwoływać się nie tylko do pojedynczego elementu ale także do pewnej części obiektu. Można tego dokonać korzystając z formy obiekt[początek:koniec]. Operacja ta zwróci podciąg zawierający elementy od obiekt[początek] do obiekt[koniec-1]. Kod: Wynik: a = "Przykladowy tekst" print a[4:11] print a[:-9] print a[-9:] kladowy Przyklad owy tekst Długość listy możemy sprawdzić przy pomocy funkcji len(obiekt). Kod: Wynik: print len([1,2,3,4,5,6]) print len("tekst") 6 5 Więcej o listach. 4.5.3 Typy zmiennych Pomimo tego, że do zmiennych możemy przypisywać dane dowolnych typów, nie oznacza to, że w Pythonie nie ma rozróżnienia między typami. Podstawowe typy używane w Pythonie to: - typ całkowity. float - typ zmiennoprzecinkowy (inaczej rzeczywisty). str - typ tekstowy. bool - typ logiczny, przyjmuje wartości True lub False. list - typ listy. Więcej o listach opowiedziane jest w 3.5.2. None - typ specjalny oznaczający brak wartości. Właściwa nazwa tego typy to NoneType, a None to pewna stała która nie posiada wartości. Więcej o tym typie w części o funkcjach tuple - typ krotki. Więcej o zastosowaniach krotki na następnej stronie. dict - typ słownika (z ang. dictionary) lub inaczej haszmapa. Działanie można porównać z działaniem std::mapa w C++. Więcej o słownikach. int Obiekty można konwertować z jednego typu do innych. Konwersję wykonuje się za pomocą funkcji typ(obiekt). Kod: Wynik: a = 10 b = 3 print a/b b = float(b) print a/b a = bool(100) b = bool(0) print a, b 3 3.33333333333 True False 8 4.5.4 Tuple Tuple w języku polskim oznacza krotkę. Krotka jest to uporządkowany zbiór wartości. Przykładem krotki dwuelementowej często stosowanych w C++ jest std::pair<T,T>. Jeżeli krotka zawiera n elementów, mówi się że jest to krotka n-elementowa. W Pythonie bardzo często stosuje się krotki. Krotkę definiuje się jak listę wartości, która jest ograniczona nawiasami okrągłymi (ale nie zawsze musi być). Krotki są bardzo użyteczne ponieważ pozwalają manipulować w prosty i łatwy sposób zmiennymi. Kod: Wynik: k = (1,2,"aba",4) print k, k[2] a,b,c,d = k print a,b,c,d x,y,z = 1,2,3 print x,y,z (1, 2, 'aba', 4) aba 1 2 aba 4 1 2 3 Jak widać w powyższym przykładzie, do krotki można odwoływać się za pomocą operatora indeksowania, jednak w przeciwieństwie do list, nie można zmieniać elementów krotki. Przykładowa operacja k[2]= 3 zakończy się błędem wykonania. W 3 linii kodu do krotki składającej się ze zmiennych a,b,c,d została przypisana krotka k. W efekcie zmiennej a została przypisana wartość 1, zmiennej b wartość 2 itd. Krotka w Pythonie pozwala przypisywać do szeregu zmiennych, szereg wartości, jak to zostało pokazane w linii 3 oraz 5. 9 4.6 OPERATORY 4.6.1 Operatory matematyczne Python posiada standardowe operatory matematyczne: + dodawanie, - odejmowanie, * mnożenie, / dzielenie, % dzielenie modullo (reszta z dzielenia). Pamiętać należy, że przy dzieleniu przez siebie dwóch liczb całkowitych, wykonywanie zostaje dzielenie całkowite. Aby wykonać dzielenie rzeczywiste, należy zamienić przynajmniej jedną z wartości na typ zmiennoprzecinkowy. Korzystać można także z operatorów działania oraz przypisania: a+=b, a-=b, a*=b, a/=b, a%=b. Kod: Wynik: a = 10 b = 3 print a+b, a-b print a*b, a/b print float(a)/b, a/float(b) a += 3 b -= a print a, b 13 7 30 3 3.33333333333 3.33333333333 13 -10 4.6.2 Operatory bitowe W Pythonie dostępne są również operatory bitowe: <<, >>, &, |, ~, ^ a<<=b, a>>=b, a&=b, a|=b, a^=b Działają one tak samo jak w C++. Opis działania operatorów bitowych możesz znaleźć tutaj. Jednak do botów potrzeby nam będzie jedynie operator |=. 4.6.3 Operatory porównania Operatory porównań działają tak samo jak w C++. Dostępne są: ==, <, >, <=, >=. 4.6.4 Operatory logiczne W C++ logiczne „oraz” zapisywało się: wyrażenie1 && wyrażenie2 W Pythonie zapisuje się w postaci: wyrażenie1 and wyrażenie2 Analogicznie działa logiczne „lub”, w C++ zapisywane: wyrażenie1 || wyrażenie2 W Pythonie zapisuję się to w postaci: wyrażenie1 or wyrażenie2 10 4.7 INSTRUKCJE WARUNKOWE W Pythonie instrukcje warunkowe mają następującą składnię: instrukcja warunek dwukropek. Ponadto do wydzielenia bloków kodu nie stosuje się nawiasów klamrowych { }, jak to jest w C++. Używa się za to wcięć w tekście o takiej samej szerokości. Schemat instrukcji warunkowych w Python: if warunek: kod elif warunek: kod else: kod Poniższy przykład ma za zadanie sprawdzić czy da się utworzyć trójkąt o bokach a, b, c: Kod: a = 3 b = 2 c = 1 if a<=0: print 'dlugosc boku a musi byc wieksza od zera!' print 'podana dlugosc a:',a elif b<=0: print 'dlugosc boku b musi byc wieksza od zera!' print 'podana dlugosc b:',b elif c<=0: print 'dlugosc boku c musi byc wieksza od zera!' print 'podana dlugosc: c',c elif a<b+c and b<a+c and c<a+b: print 'Mozna utowrzyc trojkat z bokow:', a, b, c else: print 'Nie mozna utworzyc trojkata z podanych bokow.' Wynik: Nie mozna utworzyc trojkata z podanych bokow. 4.8 PĘTLE 4.8.1 while Pętla while ma takie same działanie jak w C++. Ogólny schemat pętli: while warunek: kod Przykład: Kod: Wynik: x = 1 while x < 5: print x x += 1 1 2 3 4 11 4.8.2 for Pętla for ma trochę odmienne działanie niż w C++, gdzie można zdefiniować warunek zatrzymania oraz operację do wykonania po każdej iteracji. W Pythonie pętla for jest odpowiednikiem pętli foreach i ma następujący schemat: for zmienna in lista: kod Dla zdefiniowanej zmiennej pętla for iteruje się po kolejnych elementach listy przez referencję. Najlepiej zilustruje to przykład: Kod: Wynik: a = [1,5,10,'tekst',8.2] for i in a: print i 1 5 10 tekst 8.2 Powyższy kod, dla każdej iteracji przypisuje (przez referencje) do zmiennej i kolejne elementy listy. Pętla for pozwala także na iterację po stringach. Co więcej w połączeniu z operatorem indeksowania obiekt[od:do] można iterować się po pewnej części listy. Kod: Wynik: a = 'Przykladowy tekst' for i in a[:5]: print i P r z y k 4.8.3 range() Funkcja range() (ang. zakres) zwraca listę zawierającą kolejne liczby z zadanego przedziału. Funkcji range() można podać do 3 parametrów: range(a) range(a,b) range(a,b,c) – podanie 1 argumentu zwraca listę liczb od 0 do a-1. – podanie 2 argumentów zwraca listę liczb od a do b-1. – podanie 3 argumentów zwraca listę liczb od a do b-1 z krokiem co c. Funkcję range() często stosuje się połączeniu z pętlą for. Kod: a = 'Przykladowy tekst' print range(5) print range(4,8) print range(3,20,4) for i in range(0,10,3): print a[:i] Wynik: [0, 1, 2, 3, 4] [4, 5, 6, 7] [3, 7, 11, 15, 19] Prz Przykl Przyklado 12 4.8.4 break, continue Pętle while oraz for mogą zostać przerwane za pomocą komendy break działającej to tak samo jak w C++. Podobnie komenda continue przerywa daną iterację pętli. 4.9 FUNKCJE 4.9.1 Definicja Ogólna definicja funkcji jest następująca: def funkcja(argument1, argument2, ...): ciało funkcji return zmienne Następnie w kodzie programu można wykorzystywać wywołanie funkcji za pomocąPrzykład funkcji sumującej dwie liczby: Kod: Wynik: def suma(a,b): c = a + b return c 5 print suma(1,4) Ponadto funkcje w Pythonie potrafią zwracać więcej niż jeden argument korzystając z wcześniej wspomnianej krotki: Kod: Wynik: def dzielenie_calk(a,b): return a/b, a%b 3 1 (3, 2) wynik,reszta=dzielenie_calk(10,3) print wynik, reszta print dzielenie_calk(17,5) 4.9.2 Zasięg zmiennych, global W tym miejscu warto wspomnieć o zasięgu zmiennych. Zmienne zdefiniowane w funkcji są definiowane lokalnie, co oznacza że są one dostępne poza nią. Jednak funkcja może się odwoływać do zmiennych utworzonych poza funkcją, jednak istotna jest kolejność występowania tych zmiennych. Python rozwiązując odwołanie do danej zmiennej wpierw przeszukuje zbiór zmiennych lokalnych, następnie zmiennych globalnych. Kod: a = '1' def funkcja(): b = '2' print a, b funkcja() print a, b Wynik: Traceback (most recent call last): 1 2 File "[..]/Tutorial.py", line 6, in <module> print a, b NameError: name 'b' is not defined 1 2” a następnie zwraca błąd „NameError: name ‘b’ is not defined ”. Powyższy kod wypisuje „1 Dzieje się tak, ponieważ zmienna b jest zdefiniowana jedynie lokalnie w funkcji. Aby zmienna b była dostępna poza funkcją należy na początku funkcji określić ją jako globalną: 13 Kod: Wynik: a = '1' def funkcja(): global b b = '2' print a, b funkcja() print a, b 1 2 1 2 W powyższym kodzie zmienna b została określona jako zmienna globalna przez co nie została zniszczona po zakończeniu funkcji. Podczas wywoływania funkcji nie odnalazł zmiennej ‘a’ wśród zmiennych lokalnych, jednak została odnaleziona wśród zmiennych globalnych. Następny kod ma na celu zilustrowanie kolejnego aspektu związanego z rozwiązywaniem nazw zmiennych: Kod: Wynik: a = 1 def przypisz(x): a=x print a 2 1 przypisz(2) print a Funkcja przypisz(2) wypisała 2, a następnie operacja print a wypisała 1. Dzieje się tak, ponieważ zmienna a została wpierw zdefiniowana poza ciałem funkcji, a następnie druga zmienna a została zdefiniowana lokalnie w ciele funkcji. Operacja przypisania a=x oraz print a wywołana w funkcji odwołuje się do lokalnego a, natomiast operacja print w 7 linii kodu odwołuje się do a zdefiniowanego poza ciałem funkcji a. Aby naprawić działanie funkcji należy użyć komendy global, czyniąca daną zmienną globalną, a nie lokalną: Kod: Wynik: a = 1 def przypisz(x): global a a=x print a 2 2 przypisz(2) print a Powyższy kod za drugim razem wypisał 2 zamiast 1, ponieważ operacja przypisania została wykonana na zmiennej globalnej, a nie lokalnej, niszczonej po zakończeniu wykonywania funkcji. 14 4.10 KLASY Klasy w Pythonie… 4.11 MODUŁY Moduły są to odpowiedniki bibliotek z C++. Moduły w Pythonie tworzy się tworząc nowy plik z rozszerzeniem .py. Nazwa modułu to nazwa stworzonego pliku. Python pozwala na importowanie całych modułów lub tylko części obiektów znajdujących się w module. W pierwszym przypadku wystarczy skorzystać z operacji: import moduł By odwołać się do obiektu modułu należy skorzystać z operatora odwołania, czyli kropki: moduł.obiekt W przypadku zaimportowania tylko jednego obiektu (lub wielu obiektów) z modułu, należy skorzystać: From plik import obiekt1, obiekt2, … W tym przypadku z zaimportowanych obiektów można korzystać bezpośrednio bez odwoływania się do modułu. Kod: Wynik: from random import randint 15 print randint(10,20) 15 5 CO JEST DOSTĘPNE W THEGAME? 5.1 CEL GRY Celem gry jest zdobycie jak największej liczby punktów otrzymywanych za trafienie przeciwnika lub zabicie go. 5.2 ZASADY Gra odbywa się na prostokątnej planszy 2D. Czołgi po dotarciu do krawędzi, przenoszą się na przeciwną stronę planszy. Można powiedzieć że gra toczy się na powierzchni torusa. Każdy z graczy steruje swoim czołgiem przesyłając przez sieć do serwera komendy jakie wykonać ma czołg. Serwer co klatkę przesyła do każdego gracza informacje o stanie gry, a także oczekuje na polecenia wysłane od graczy. Na pojedynczą klatkę można wysłać tylko jedno polecenie. Kolejne polecenia przesłane podczas trwania tej samej klatki będą ignorowane. Ruchem czołgów steruje się modyfikując prędkość, a nie przez bezpośrednie wskazanie przemieszczenia. Odpowiada to sterowaniu pojazdem ślizgającym się po lodzie bez tarcia, mając do dyspozycji wiatrak by zmieniać swoją prędkość. Ponadto w momencie zderzenia dwóch czołgów dochodzi do zderzenia doskonale sprężystego, co oznacza, że . Czołgi posiadają strzelające wieżyczki o zakresie obrotu 360°. Gracz może wydać polecenie obrotu wieżyczki w prawo lub w lewo. Wieżyczka obróci się wtedy o pewien stały kąt. Dodatkowo można wydać polecenie strzału. Ilość amunicji w czołgu jest skończona (domyślnie 200), jednak co drugą klatkę każdy czołg otrzymuje jeden nabój. W momencie wydania polecenia strzału nie posiadając żadnej amunicji gracz dostaje czasową karę, naliczaną w sekundach, (domyślnie 5s) podczas której nie można strzelać a amunicja czołgu się nie odnawia. Pociski nie przelatują przez krawędź planszy. 16 5.3 SERWER Serwer został napisany w C++ i obecnie skompilowany jedynie pod 64-bitowego Windowsa. Aby uruchomić własny serwer należy pobrać paczkę serwera ze strony thegame.tk a następnie wypakować ją do dowolnej lokalizacji. Plik binarny serwera to TheGame.exe. 5.3.1 Uruchamianie serwera Po uruchomieniu serwera otwarte zostaną 2 okna: okno gry oraz konsola. Okno gry składa się z planszy, na której toczy się rozgrywka oraz ze stopki pokazującej graficznie informacje graczach. Każde pole stopki składa się z: Tła w kolorze czołgu gracza wskazującego pozostałe HP. Nazwy gracza. Znaków [+] gdy gracz jest połączony z serwerem lub [-] gdy nie jest. Ilości uzyskanych punktów. Białego cienkiego paska nad polem oznaczającego część pozostałej amunicji w czołgu. Okno konsoli po uruchomieniu pokaże następujące dane: Loading XML from:settings.xml ...success Connecting to database TheGame.db ...success Starting reading players [0] Player_0 (0b0f9e47) has 1767 [1] Player_1 (7c08aed1) has 0 [2] Player_2 (e501ff6b) has 2682 [3] Player_3 (9206cffd) has 3184 [4] Player_4 (0c625a5e) has 1557 [5] Player_5 (7b656ac8) has 2287 [6] Master (2aa5a6e0) has 474 Finished reading players points points points points points points points Server started with SOCKET 1008 Pierwsze dwie linie to są informacje na temat odczytywania pliku konfiguracyjnego settings.xml oraz bazy danych TheGame.db zawierającej informacje na temat graczy. Kolejne linie to lista wczytanych graczy. Opis danego gracza składa się z: Numeru identyfikacyjnego Nazwy gracza Hasła gracza generowanego na podstawie nazwy gracza Ilości punktów Ostatnia linia jest zbugowana i nie oznacza portu serwera na którym on działa, pomimo mylącej nazwy. W momencie uzyskania bądź utracenia połączenia przez któregoś z graczy w konsoli pojawia się adekwatna informacja. W zależności od stanu połączenia w oknie graficznym pojawi się znak [-] lub [+] po lewej stronie nazwy gracza. 17 5.3.2 Działanie serwera Serwer w każdej klatce wykonuje następujące operacje: Symulacja gry dla danej klatki (przesunięcie graczy, przesunięcie pocisków, przeliczenie hitboxów itd.) Przesłanie informacji o stanie gry do graczy Odebranie informacji od każdego z graczy na temat 5.3.3 Plik konfiguracyjny Plik settings.xml jest plikiem konfiguracyjnym serwera. Można go edytować dowolnym edytorem tekstu. W pliku można dokonywać konfiguracji ustawień serwera. Pola które mogą interesować najbardziej to: fps="20" – jest to ilość klatek serwera na sekundę (domyślnie ustawione na 60). Obecnie dla lepszego rozeznania w początkowej fazie gry ustawione na 20, później gra toczyć się będzie z większą szybkością (możliwe że 200 FPS i więcej). map_size="700" – rozmiar mapy w pikselach, domyślnie 700 respawn_time="2" – czas respawnu gracza w sekundach max_ammo="200" – maksymalna ilość amunicji, domyślnie 200 hp="200" – ilość zdrowia, domyślnie 200 port="8080" – port na którym działa serwer, domyślnie 8080 Po edycji pliku konfiguracyjnego należy uruchomić serwer ponownie w celu zaaplikowania zmian. 5.3.4 Baza danych Dane graczy trzymane są w bazie danych, w pliku TheGame.db. Plik ten posiada tabelę USERS a w niej pola: ID – Unikalny numer identyfikacyjny gracza. LOGIN – nazwa użytkownika. COLOR – Kolor zapisany w postaci kodu HEX w palecie barw RGB. POINTS – Ilość punktów uzyskanych przez gracza. W momencie uruchomienia serwera bez pliku TheGame.db w lokalizacji serwera, zostanie utworzona nowa baza danych TheGame.db. W przypadku braku tabeli USERS (lub z tabeli o nazwie wskazanej w pliku konfiguracyjnym) zostanie utworzona nowa tabela z dwoma graczami. W takim przypadku w konsoli wyświetlona zostanie adekwatna informacja, a serwer trzeba będzie uruchomić ponownie. 18 5.4 KLIENT Celem gry jest napisanie AI dla czołgu gracza. Dla ułatwienia tego zadania udostępniona została paczka z przykładowymi kodami botów oraz z dwoma modułami potrzebnymi do komunikacji z serwerem: settings.py conversation.py 5.4.1 settings.py W module settings.py znajdują się ustawienia serwera. Najważniejsze z nich to parametry konieczne do poprawnego połączenia się z serwerem to: IP = '127.0.0.1' PORT = 8080 PIN = 0x7b656ac8 MY_NR = 5 Parametry te oznaczają odpowiednio: IP = '127.0.0.1' Adres IP serwera. Jeśli serwer działa na tej samej maszynie do bot, należy użyć wewnętrznego adresu IP maszyny, czyli: 127.0.0.1. W przeciwnym wypadku, należy ustawić adres IP komputera na którym działa serwer. PORT = 8080 Port na którym działa serwer. Powinien zostać 8080, o ile nie został zmieniony w pliku settings.xml. PIN = 0x7b656ac8 Pin gracza. Generowany na podstawie nazwy gracza przy uruchamianiu serwera. Należy pamiętać że pin skopiowany z konsoli serwera należy poprzedzić znakami 0x, co oznacza że jest to kod szesnastkowy. MY_NR = 5 Numer gracza, czyli numer ID danego gracza ustawiony w bazie danych. W zależności od tego czy zmienione zostały parametry serwera, można będzie chcieć zmienić także poniższe parametry. Należy pamiętać, że nie są to parametry wykorzystywane do komunikacji, a jedynie mogą być użyteczne dla gracza: HP = 200 Maksymalna ilość zdrowia graczy. AMMO = 200 Maksymalna ilość amunicji graczy. MAP_SIZE = 700 Szerokość i wysokość mapy w pikselach. FPS = 100 Ilość klatek na sekundę serwera. 5.4.2 conversation.py W pliku conversation.py znajdują się klasy Conversation, odpowiedzialna za komunikację z serwerem oraz klasa Player, przetrzymująca informacje jakie pozyskiwane są z serwera o każdym graczu. 19 5.4.2.1 Klasa Player Klasa Player ma następującą definicje: class Player(object): x = None y = None angle = None hp = settings.HP ammo = settings.AMMO reloading = False alive = True shot = False full = True player_nr = None Nie posiada ona żadnych metod a jedynie zmienne oznaczające x,y – współrzędne czołgu. Punkt (0,0) znajduje się w lewym górnym rogu. Oś OX rośnie w prawo, oś OY rośnie w dół. angle – aktualny kąt lufy podawany jest w radianach. hp – pozostałe punkty życia. ammo – pozostała ilość amunicji. reloading – czy czołg przeładowuje, tzn. czy otrzymał karę za wystrzelenie pocisku nie posiadając żadnej amunicji. alive – czy czołg jest żywy. shot – czy czołg wystrzelił pocisk w poprzedniej klatce. full – czy życie gracza jest pełne. player_nr – numer ID gracza. 5.4.2.2 Klasa Conversation Klasa Conversation odpowiada za komunikację z serwerem. Jej najważniejsze metody to: hello() – metoda odpowiedzialna za nawiązanie połączenia z serwerem. Należy ją wywołać ją jednokrotnie na początku działania programu. Nie zwraca żadnej wartości. get_players() – metoda odbierająca dane z serwera. Zwraca listę obiektów typu Players (każdy obiekt zawiera dane na temat danego gracza) lub zwraca typ None, jeśli serwer nie ma nic do przesłania. Metoda ta jest nie blokująca, tzn. jeśli podczas jednej klatki zostanie wywołana kilkukrotnie, tylko pierwsze wywołanie zwróci dane graczy, natomiast reszta wywołań zwróci obiekt None. send_command(komenda) – metoda służąca do wysyłania poleceń do serwera. Przyjmuje jeden parametr, liczbę całkowitą na której zapisane są polecenia w postaci maski bitowej. move(‘kierunek’) – metoda zwracająca liczbę całkowitą odpowiadająca masce bitowej dla danego kierunku modyfikacji prędkości. Metoda przyjmuje jeden parametr ‘kierunek’ typu string, czyli jeden z 4 możliwych kierunków ruchu: up, down, left, right. Rozmiar liter nie ma znaczenia. rot(‘kierunek’) – metoda zwracająca liczbę całkowitą odpowiadająca masce bitowej dla danego kierunku obrotu lufy. Metoda przyjmuje jeden parametr ‘kierunek’ typu string, odpowiadający jednemu z dwóch kierunków obrotu left (przeciwnie do ruchu wskazówek zegara) oraz right (zgodnie z ruchem wskazówek zegara). shoot() – metoda zwracająca liczbę całkowitą odpowiadająca masce bitowej polecenia strzału.