View difference between Paste ID: XkXJBi2Z and 0QsGZaYL
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()