SHOW:
|
|
- or go back to the newest paste.
1 | import pygame | |
2 | import random | |
3 | #szerokość i wysokość ekranu | |
4 | SZEROKOSC_EKRANU = 1280 | |
5 | WYSOKOSC_EKRANU = 960 | |
6 | ||
7 | pygame.init() | |
8 | ekran = pygame.display.set_mode([SZEROKOSC_EKRANU, WYSOKOSC_EKRANU]) | |
9 | zegar = pygame.time.Clock() | |
10 | obraz_tla = pygame.image.load('images/mountain.png') | |
11 | czcionka = pygame.font.SysFont('Comic Sans MS', 35) #nazwa i rozmiar czcionki | |
12 | obrazki_kosci = [] | |
13 | #wyniki kości | |
14 | kosci = [1,1,1,1] | |
15 | #kombinacje na kościach | |
16 | kombinacje = [] | |
17 | mozliwe_ruchy = [] | |
18 | wybrane_kolumny = [] | |
19 | zablokowane_kolumny = [] | |
20 | for i in range(4): | |
21 | obrazki_kosci.append(pygame.image.load('images/kosc-1.png')) | |
22 | ||
23 | teksty = ["Naciśnij Spacje"] | |
24 | liczba_pol = [3,5,7,9,11,13,11,9,7,5,3] | |
25 | skok_x = 70 | |
26 | skok_y = 50 | |
27 | start_x = 240 | |
28 | start_y = 900 | |
29 | aktywny_gracz = 0 | |
30 | czekanie_na_wybor_kolumny = False | |
31 | czekanie_na_kontynuacje = False | |
32 | ||
33 | def budowa_planszy(): | |
34 | #współrzędne pierwszego pola | |
35 | x = start_x | |
36 | y = start_y | |
37 | #numer kolumny | |
38 | num = 2 | |
39 | #Operacje wykonywane dla każdej kolumny | |
40 | for kolumna in liczba_pol: | |
41 | #modyfikacja współrzędnych | |
42 | #przesuwamy x w prawo po każdej zbudowanej kolumnie | |
43 | x += skok_x | |
44 | #Wracamy na dół kolumny aby zacząć budować nową | |
45 | y = start_y | |
46 | #budowa jednej kolumny | |
47 | for i in range(kolumna): | |
48 | #Przesuwamy współrzędną y w górę | |
49 | y -= skok_y | |
50 | #rysowanie koła które będzie czarną obwódką | |
51 | pygame.draw.circle(ekran, (0, 0, 0), (x,y), 22) | |
52 | #rysowanie środka pola - kolor dowolny | |
53 | #ważne aby dać inne kolory graczom potem | |
54 | pygame.draw.circle(ekran, (255, 230, 0), (x,y), 20) | |
55 | #przekształcamy liczbę na tekst | |
56 | numer_kolumny = czcionka.render(str(num), True,(0,0,0)) | |
57 | #Wyświetlamy to nad kolumną | |
58 | #cofamy x odrobinę aby wyśrodkować napis | |
59 | ekran.blit(numer_kolumny, (x-10,y-70)) | |
60 | #Przechodzimy do kolejnej kolumny | |
61 | num += 1 | |
62 | ||
63 | def pokaz_teksty(): | |
64 | #współrzędne tekstu | |
65 | x_tekstu = 800 | |
66 | y_tekstu = 40 | |
67 | #przesunięcie tekstu między linijkami | |
68 | skok_tekstu = 50 | |
69 | for tekst in teksty: | |
70 | #stworzenie linijki. | |
71 | #Kolor potem zmienimy na kolor aktywnego gracza | |
72 | linijka = czcionka.render(tekst, True,kolory_pionkow[aktywny_gracz]) | |
73 | ekran.blit(linijka, (x_tekstu,y_tekstu)) | |
74 | y_tekstu += skok_tekstu | |
75 | ||
76 | def rzut_kosci(): | |
77 | for i in range(4): | |
78 | #losowanie dla jednej kostki | |
79 | kosci[i] = random.randint(1,6) | |
80 | #załadowanie obrazka o nazwie zależnej od wyniku losowania | |
81 | obrazki_kosci[i] = pygame.image.load(f'images/kosc-{kosci[i]}.png') | |
82 | ||
83 | def sprawdz_mozliwe_ruchy(): | |
84 | kombinacje.clear() | |
85 | #Wyznaczenie wszystkich kombinacji | |
86 | kombinacje.append([kosci[0]+kosci[1], kosci[2]+kosci[3]]) | |
87 | kombinacje.append([kosci[0]+kosci[2], kosci[1]+kosci[3]]) | |
88 | kombinacje.append([kosci[0]+kosci[3], kosci[1]+kosci[2]]) | |
89 | mozliwe_ruchy.clear() | |
90 | liczba_opcji = 0 | |
91 | for i in range(len(kombinacje)): | |
92 | # tworzymy nową pustą listę na możliwe ruchy z tej kombinacji kości, | |
93 | # jeśli ruch nie będzie możliwy z tej kombinacji to | |
94 | # pustą listę później usuniemy | |
95 | mozliwe_ruchy.append([]) | |
96 | #3 pionki postawione | |
97 | if len(wybrane_kolumny) == 3: | |
98 | #Sprawdzamy czy pierwsza suma kości znajduje się | |
99 | # w liście wybranych kolumn | |
100 | if kombinacje[i][0] in wybrane_kolumny: | |
101 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][0]) | |
102 | #analogicznie z drugą wartością | |
103 | if kombinacje[i][1] in wybrane_kolumny: | |
104 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][1]) | |
105 | #2 pionki postawione | |
106 | elif len(wybrane_kolumny) == 2: | |
107 | # Sprawdzenie czy pierwszy wynik jest już wybrany | |
108 | if kombinacje[i][0] in wybrane_kolumny: | |
109 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][0]) | |
110 | #Jeśli pierwsza opcja jest w liście wybranych to druga jeśli | |
111 | # nie jest zablokowana to możemy się poruszyć również w tej kolumnie | |
112 | if not kombinacje[i][1] in zablokowane_kolumny: | |
113 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][1]) | |
114 | #analogiczne sprawdzenie drugiego wyniku | |
115 | elif kombinacje[i][1] in wybrane_kolumny: | |
116 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][1]) | |
117 | if not kombinacje[i][0] in zablokowane_kolumny: | |
118 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][0]) | |
119 | #Jeśli obie wartości nie znajdują się w liście wybranych | |
120 | #to sprawdzam czy pierwsza jest nie zablokowana | |
121 | elif not kombinacje[i][0] in zablokowane_kolumny: | |
122 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][1]) | |
123 | #Jeśli obie nie są zablokowane to musze je dodać oddzielnie | |
124 | # jest to przypadek gdy mamy dwa pionki na planszy | |
125 | # A dodać możemy tylko jeden, więc musimy wybrać który | |
126 | #Dlatego zwiększamy liczbę opcji i dodajemy kolejną opcję jako nową listę | |
127 | if not kombinacje[i][1] in zablokowane_kolumny: | |
128 | liczba_opcji += 1 | |
129 | mozliwe_ruchy.append([kombinacje[i][1]]) | |
130 | #Sprawdzenie czy choć druga opcja jest dostępna | |
131 | elif not kombinacje[i][1] in zablokowane_kolumny: | |
132 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][1]) | |
133 | #jeden lub zero użytych pionków | |
134 | else: | |
135 | if not kombinacje[i][0] in zablokowane_kolumny: | |
136 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][0]) | |
137 | if not kombinacje[i][1] in zablokowane_kolumny: | |
138 | mozliwe_ruchy[liczba_opcji].append(kombinacje[i][1]) | |
139 | liczba_opcji += 1 | |
140 | #Usunięcie pustych elementów | |
141 | while [] in mozliwe_ruchy: | |
142 | mozliwe_ruchy.remove([]) | |
143 | #wyświetlenie tekstów | |
144 | teksty.clear() | |
145 | for i in range(len(mozliwe_ruchy)): | |
146 | teksty.append(f'{i+1}. Ruch w kolumnach {mozliwe_ruchy[i]}') | |
147 | ||
148 | pozycje_pionkow_graczy = [[],[],[]] | |
149 | for i in range(len(pozycje_pionkow_graczy)): | |
150 | for j in range(11): | |
151 | pozycje_pionkow_graczy[i].append(0) | |
152 | czarne_pionki = [] | |
153 | def czysc_czarne(): | |
154 | czarne_pionki.clear() | |
155 | for j in range(11): | |
156 | czarne_pionki.append(0) | |
157 | czysc_czarne() | |
158 | ||
159 | def ruch(opcja): | |
160 | kolumny = mozliwe_ruchy[opcja] | |
161 | for kolumna in kolumny: | |
162 | # Jeśli pionek w danej kolumnie w danej turze nie był użyty | |
163 | # to pobieramy wartość startową z listy pionków danego gracza | |
164 | # odejmujemy dwa bo numeracja kolumn zaczyna się od 2 a w programowaniu od 0 | |
165 | if czarne_pionki[kolumna-2] == 0: | |
166 | czarne_pionki[kolumna-2] = pozycje_pionkow_graczy[aktywny_gracz][kolumna-2] | |
167 | # poruszamy pionkiem w konkretnej kolumnie o jedno pole do przodu | |
168 | czarne_pionki[kolumna-2] += 1 | |
169 | # Jeśli kolumna nie była użyta w tej turze to doklejamy ją do kolumn wybranych | |
170 | if not kolumna in wybrane_kolumny: | |
171 | wybrane_kolumny.append(kolumna) | |
172 | #blokada nie pozwalająca jechać ponad kolumnę | |
173 | if czarne_pionki[kolumna-2] >= liczba_pol[kolumna-2]: | |
174 | czarne_pionki[kolumna-2] = liczba_pol[kolumna-2] | |
175 | ||
176 | # podajemy kolejno kolory dla każdego gracza | |
177 | # ostatni kolor to kolor czarny pionków tury | |
178 | kolory_pionkow = [(255,0,0),(0,255,0),(0,0,255),(0,0,0)] | |
179 | def postaw_pionki(): | |
180 | #dla każdego gracza | |
181 | for numer_gracza in range(len(pozycje_pionkow_graczy)): | |
182 | #dla każdego pionka danego gracza | |
183 | for i in range(len(pozycje_pionkow_graczy[numer_gracza])): | |
184 | #z listy wyciągamy numer pola, na którym się najduję | |
185 | pozycja_pionka = pozycje_pionkow_graczy[numer_gracza][i] | |
186 | #jeśli jest różne od zera, czyli wszedł pionek już na planszę | |
187 | if pozycja_pionka != 0: | |
188 | #obliczamy współrzędne danego pionka | |
189 | # (numer_gracza * 5) - pozwala nam przesunąć | |
190 | # delikatnie w prawo każdy kolejny pionek, aby nie | |
191 | # zasłaniały się wzajemnie gdy zajmują to samo pole | |
192 | x = start_x + skok_x * (i + 1) + (numer_gracza * 5) | |
193 | y = start_y - (skok_y * pozycja_pionka) | |
194 | # rysujemy pionek o kolorze gracza | |
195 | pygame.draw.circle(ekran, kolory_pionkow[numer_gracza], (x,y), 10) | |
196 | #wykonujemy analogiczne czynności dla czarnych pionków | |
197 | for i in range(len(czarne_pionki)): | |
198 | pozycja_pionka = czarne_pionki[i] | |
199 | if pozycja_pionka != 0: | |
200 | x = start_x + skok_x * (i + 1) + (numer_gracza * 5) | |
201 | y = start_y - (skok_y * pozycja_pionka) | |
202 | #kolory[-1] oznaczają ostatni element listy | |
203 | pygame.draw.circle(ekran, kolory_pionkow[-1], (x,y), 10) | |
204 | ||
205 | def stop_tury(): | |
206 | #Sprawdzenie każdego czarnego pionka | |
207 | for i in range(len(czarne_pionki)): | |
208 | #Jeśli zdobyliśmy nim jakieś pola to aktualizujemy pozycje pionków gracza | |
209 | if czarne_pionki[i] != 0: | |
210 | pozycje_pionkow_graczy[aktywny_gracz][i] = czarne_pionki[i] | |
211 | #czyścimy wszystko przed turą kolejnego gracza | |
212 | czysc_czarne() | |
213 | teksty.clear() | |
214 | wybrane_kolumny.clear() | |
215 | ||
216 | ilosc_wygranych = 0 | |
217 | for i in range(len(pozycje_pionkow_graczy[aktywny_gracz])): | |
218 | #Sprawdzamy czy aktywny gracz odsiągnął gdzieś szczyt kolumny | |
219 | if pozycje_pionkow_graczy[aktywny_gracz][i] >= liczba_pol[i]: | |
220 | #jeśli tak to dodajemy taką kolumnę do zablokowanych | |
221 | zablokowane_kolumny.append(i+2) | |
222 | #oraz naliczamy wygraną | |
223 | ilosc_wygranych += 1 | |
224 | #jeśli naliczymy przynajmniej 3 wygrane kończymy grę | |
225 | if ilosc_wygranych >= 3: | |
226 | teksty.append("Wygrywasz") | |
227 | teksty.append("naciśnij Esc, aby zakończyć") | |
228 | # w przeciwnym wypadku zmieniamy gracza | |
229 | else: | |
230 | teksty.append("Tura następnego gracza") | |
231 | ||
232 | ||
233 | ||
234 | program_dziala = True | |
235 | while program_dziala: | |
236 | for zdarzenie in pygame.event.get(): | |
237 | if zdarzenie.type == pygame.KEYDOWN: | |
238 | if zdarzenie.key == pygame.K_ESCAPE: | |
239 | program_dziala = False | |
240 | if zdarzenie.key == pygame.K_SPACE and not czekanie_na_wybor_kolumny and not czekanie_na_kontynuacje: | |
241 | rzut_kosci() | |
242 | sprawdz_mozliwe_ruchy() | |
243 | if len(mozliwe_ruchy) == 0: | |
244 | teksty.append("Brak możliwości ruchu") | |
245 | teksty.append("Twoja tura kończy się") | |
246 | wybrane_kolumny.clear() | |
247 | aktywny_gracz += 1 | |
248 | if aktywny_gracz == 3: | |
249 | aktywny_gracz = 0 | |
250 | czekanie_na_wybor_kolumny = False | |
251 | czysc_czarne() | |
252 | else: | |
253 | czekanie_na_wybor_kolumny = True | |
254 | #Zdarzenie może się uruchomić jedynie, gdy czekamy na wybór kolumny | |
255 | # i ilość opcji wynosi przynajmniej jeden | |
256 | if zdarzenie.key == pygame.K_1 and czekanie_na_wybor_kolumny and len(teksty) >= 1: | |
257 | # Używamy opcji zero bo stosujemy numerację listy | |
258 | ruch(0) | |
259 | # Kończymy czekanie na wybór kolumn bo została wybrana | |
260 | czekanie_na_wybor_kolumny = False | |
261 | czekanie_na_kontynuacje = True | |
262 | if zdarzenie.key == pygame.K_2 and czekanie_na_wybor_kolumny and len(teksty) >= 2: | |
263 | ruch(1) | |
264 | czekanie_na_wybor_kolumny = False | |
265 | czekanie_na_kontynuacje = True | |
266 | if zdarzenie.key == pygame.K_3 and czekanie_na_wybor_kolumny and len(teksty) >= 3: | |
267 | ruch(2) | |
268 | czekanie_na_wybor_kolumny = False | |
269 | czekanie_na_kontynuacje = True | |
270 | if zdarzenie.key == pygame.K_4 and czekanie_na_wybor_kolumny and len(teksty) >= 4: | |
271 | ruch(3) | |
272 | czekanie_na_wybor_kolumny = False | |
273 | czekanie_na_kontynuacje = True | |
274 | if zdarzenie.key == pygame.K_5 and czekanie_na_wybor_kolumny and len(teksty) >= 5: | |
275 | ruch(4) | |
276 | czekanie_na_wybor_kolumny = False | |
277 | czekanie_na_kontynuacje = True | |
278 | if zdarzenie.key == pygame.K_6 and czekanie_na_wybor_kolumny and len(teksty) >= 6: | |
279 | ruch(5) | |
280 | czekanie_na_wybor_kolumny = False | |
281 | czekanie_na_kontynuacje = True | |
282 | if zdarzenie.key == pygame.K_d and czekanie_na_kontynuacje: | |
283 | czekanie_na_kontynuacje = False | |
284 | teksty = ["Naciśnij spacje"] | |
285 | if zdarzenie.key == pygame.K_s and czekanie_na_kontynuacje: | |
286 | stop_tury() | |
287 | aktywny_gracz += 1 | |
288 | if aktywny_gracz == 3: | |
289 | aktywny_gracz = 0 | |
290 | czekanie_na_kontynuacje = False | |
291 | elif zdarzenie.type == pygame.QUIT: | |
292 | program_dziala = False | |
293 | ||
294 | if czekanie_na_kontynuacje: | |
295 | teksty = ["s. Stop", "d. Dalej"] | |
296 | #wyświetl tło | |
297 | ekran.blit(obraz_tla, (0,0)) | |
298 | #Kosci | |
299 | ekran.blit(obrazki_kosci[0], (16,16)) | |
300 | ekran.blit(obrazki_kosci[1], (116,16)) | |
301 | ekran.blit(obrazki_kosci[2], (16,116)) | |
302 | ekran.blit(obrazki_kosci[3], (116,116)) | |
303 | #Plansza | |
304 | budowa_planszy() | |
305 | #TekstyWybór | |
306 | pokaz_teksty() | |
307 | #Pionki | |
308 | postaw_pionki() | |
309 | #odśwież ekran | |
310 | pygame.display.flip() | |
311 | zegar.tick(60) #liczba klatek na sekunde | |
312 | ||
313 | pygame.quit() |