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() |