giganciprogramowania

Can't Stop final

Jun 15th, 2023
122
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  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()
Add Comment
Please, Sign In to add comment