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.

Podobne dokumenty