Untitled

mail@pastecode.io avatar
unknown
plain_text
10 months ago
16 kB
2
Indexable
Never
import pygame
import random

from pygame.locals import *
pygame.init()

screen = pygame.display.set_mode((1000, 700), 0, 32)
zegar = pygame.time.Clock()

kolor_niebieski = (0, 0, 255)
kolor_czerwony = (255, 0, 0)
kolor_zielonkawy = (71, 102, 58)
kolor_bialy = (255, 255, 255)

domyslny_font = pygame.font.SysFont(None, 45)

grafika_options_wcisniety = pygame.image.load('grafiki/options_2.png')
grafika_ranking_wcisniety = pygame.image.load('grafiki/ranking_2.png')
grafika_menu_wcisniety = pygame.image.load('grafiki/menu2.png')
grafika_play_wcisniety = pygame.image.load('grafiki/play.png')
grafika_exit_wcisniety = pygame.image.load('grafiki/quit.png')
grafika_save_wcisniety = pygame.image.load('grafiki/save.png')
grafika_options = pygame.image.load('grafiki/options.png')
grafika_ranking = pygame.image.load('grafiki/ranking.png')
grafika_menu = pygame.image.load('grafiki/menu.png')
grafika_play = pygame.image.load('grafiki/play_2.png')
grafika_exit = pygame.image.load('grafiki/quit_2.png')
grafika_save = pygame.image.load('grafiki/save 2.png')
grafika_tlo = pygame.image.load('grafiki/tlo.png')
grafika_jablko = pygame.image.load('grafiki/jablko.png')
grafika_napis = pygame.image.load('grafiki/tekst.png')
grafika_ramka = pygame.image.load('grafiki/ramka.png')
grafiki_waz = {
    'glowa_gora': pygame.image.load('grafiki/waz_glowa_gora.png'),
    'glowa_dol': pygame.image.load('grafiki/waz_glowa_dol.png'),
    'glowa_prawo': pygame.image.load('grafiki/waz_glowa_prawo.png'),
    'glowa_lewo': pygame.image.load('grafiki/waz_glowa_lewo.png'),
    'ogon_gora': pygame.image.load('grafiki/waz_ogon_dol.png'),
    'ogon_dol': pygame.image.load('grafiki/waz_ogon_gora.png'),
    'ogon_prawo': pygame.image.load('grafiki/waz_ogon_lewo.png'),
    'ogon_lewo': pygame.image.load('grafiki/waz_ogon_prawo.png'),
    'cialo_poziomo': pygame.image.load('grafiki/waz_poziomo.png'),
    'cialo_pionowo': pygame.image.load('grafiki/waz_pionowo.png'),
    'lewo_dol': pygame.image.load('grafiki/waz_zakret_dol_lewo.png'),
    'prawo_dol': pygame.image.load('grafiki/waz_zakret_dol_prawo.png'),
    'lewo_gora': pygame.image.load('grafiki/waz_zakret_gora_lewo.png'),
    'prawo_gora': pygame.image.load('grafiki/waz_zakret_gora_prawo.png')
}



class Kwadrat():
    bok = 50

    def __init__(self, kolumna, wiersz, kolor = None, grafika = None):
        self.kolumna = kolumna
        self.wiersz = wiersz
        self.kolor = kolor
        self.grafika = grafika

    def polozenie(self):
        return list([self.kolumna, self.wiersz])

    def rysuj(self):
        print(f"self.grafika = {self.grafika}")
        if self.grafika == None:
            pygame.draw.rect(screen, self.kolor, (self.kolumna * self.bok, self.wiersz * self.bok, self.bok, self.bok))
        else:

            screen.blit(self.grafika, (self.kolumna * self.bok, self.wiersz * self.bok, self.bok, self.bok))

class ElementCiala(Kwadrat):
    def __init__(self, kolumna, wiersz, kierunek):
        self.kierunek = kierunek
        Kwadrat.__init__(self, kolumna, wiersz)

class Snake():
    def __init__(self):
        self.dlugosc = 3
        self.tablica = []
        self.tablica.append(ElementCiala(0, 0, 'prawo'))
        self.tablica.append(ElementCiala(0, 1, 'prawo'))
        self.tablica.append(ElementCiala(0, 2, 'prawo'))
        self.kierunek = [1, 0]
        self.poprzedni_kierunek = [1, 0]
        self.update_grafiki()

    def wynik(self):
        return self.dlugosc - 3
    def update(self, jedzenie):
        nowa_glowa = self.tablica[-1].polozenie()
        nowa_glowa[0] += self.kierunek[0]
        nowa_glowa[1] += self.kierunek[1]
        self.poprzedni_kierunek = self.kierunek
        if jedzenie.polozenie() == nowa_glowa:
            print("teraz bede jadl")
            jedzenie.kolumna = random.randint(0, 19)
            jedzenie.wiersz = random.randint(0, 13)
            self.dlugosc += 1
        else:
            print("teraz nie jem")
            self.tablica.pop(0)

        k = None
        if self.kierunek == [1, 0]:
            k = 'prawo'
        elif self.kierunek == [-1, 0]:
            k = 'lewo'
        elif self.kierunek == [0, -1]:
            k = 'gora'
        else:
            k = 'dol'
        self.tablica.append(ElementCiala(nowa_glowa[0], nowa_glowa[1], k))
        self.update_grafiki()

    def update_grafiki(self):
        for i in range(1, len(self.tablica) - 1):
            if self.tablica[i].kierunek == 'prawo':
                if self.tablica[i + 1].kierunek == 'dol':
                    self.tablica[i].grafika = grafiki_waz['lewo_dol']
                elif self.tablica[i + 1].kierunek == 'gora':
                    self.tablica[i].grafika = grafiki_waz['lewo_gora']
                else:
                    self.tablica[i].grafika = grafiki_waz['cialo_poziomo']
            elif self.tablica[i].kierunek == 'lewo':
                if self.tablica[i + 1].kierunek == 'dol':
                    self.tablica[i].grafika = grafiki_waz['prawo_dol']
                elif self.tablica[i + 1].kierunek == 'gora':
                    self.tablica[i].grafika = grafiki_waz['prawo_gora']
                else:
                    self.tablica[i].grafika = grafiki_waz['cialo_poziomo']
            elif self.tablica[i].kierunek == 'gora':
                if self.tablica[i + 1].kierunek == 'prawo':
                    self.tablica[i].grafika = grafiki_waz['prawo_dol']
                elif self.tablica[i + 1].kierunek == 'lewo':
                    self.tablica[i].grafika = grafiki_waz['lewo_dol']
                else:
                    self.tablica[i].grafika = grafiki_waz['cialo_pionowo']
            elif self.tablica[i].kierunek == 'dol':
                if self.tablica[i + 1].kierunek == 'prawo':
                    self.tablica[i].grafika = grafiki_waz['prawo_gora']
                elif self.tablica[i + 1].kierunek == 'lewo':
                    self.tablica[i].grafika = grafiki_waz['lewo_gora']
                else:
                    self.tablica[i].grafika = grafiki_waz['cialo_pionowo']

            # grafika ogona
            if self.tablica[1].kierunek == 'prawo':
                self.tablica[0].grafika = grafiki_waz['ogon_prawo']
            elif self.tablica[1].kierunek == 'lewo':
                self.tablica[0].grafika = grafiki_waz['ogon_lewo']
            elif self.tablica[1].kierunek == 'dol':
                self.tablica[0].grafika = grafiki_waz['ogon_dol']
            elif self.tablica[1].kierunek == 'gora':
                self.tablica[0].grafika = grafiki_waz['ogon_gora']

            # grafika glowy
            if self.tablica[-1].kierunek == 'prawo':
                self.tablica[-1].grafika = grafiki_waz['glowa_prawo']
            elif self.tablica[-1].kierunek == 'lewo':
                self.tablica[-1].grafika = grafiki_waz['glowa_lewo']
            elif self.tablica[-1].kierunek == 'dol':
                self.tablica[-1].grafika = grafiki_waz['glowa_dol']
            elif self.tablica[-1].kierunek == 'gora':
                self.tablica[-1].grafika = grafiki_waz['glowa_gora']

    def rysuj(self):
        for element in self.tablica:
            print('rysuje element ciala')
            print(f'grafika = {element.grafika}')
            print(f'polozenie = {element.polozenie()}')
            print(f'kolor = {element.kolor}')
            print(f'kierunek = {element.kierunek}')
            element.rysuj()

class Plansza():
    def __init__(self):
        self.snake = Snake()
        kolumna = random.randint(0, 19)
        wiersz = random.randint(0, 13)
        self.jedzenie = Kwadrat(kolumna, wiersz, None, grafika_jablko)

    def update(self):
        glowa = self.snake.tablica[-1].polozenie()
        if glowa[0] >= 20 or glowa[0] < 0 or glowa[1] >= 14 or glowa[1] < 0:
            print("!!!!! Uderzenie")
            return -1
        for i in range(len(self.snake.tablica) - 1):
            if glowa == self.snake.tablica[i].polozenie():
                print("Zderzenie z samym soba")
                return -1

        self.snake.update(self.jedzenie)


    def punkty_rysuj(self):
        punkty = self.snake.wynik()
        punkty_img = domyslny_font.render(str(punkty), True, kolor_bialy)
        screen.blit(punkty_img, (950, 10))

    def rysuj(self):
        if self.update() == -1:
            return -1

        self.snake.rysuj()
        self.jedzenie.rysuj()
        self.punkty_rysuj()

def gra():
    plansza = Plansza()

    while 1:
        # wylacza okienko gry po klijnieciu X'a
        events = pygame.event.get()
        for event in events:
            if event.type == pygame.QUIT:
                break
            #obsluga klawiatury
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_DOWN:
                    if plansza.snake.poprzedni_kierunek != [0, -1]:
                        plansza.snake.kierunek = [0, 1]
                if event.key == pygame.K_UP:
                    if plansza.snake.poprzedni_kierunek != [0, 1]:
                        plansza.snake.kierunek = [0, -1]
                if event.key == pygame.K_LEFT:
                    if plansza.snake.poprzedni_kierunek != [1, 0]:
                        plansza.snake.kierunek = [-1, 0]
                if event.key == pygame.K_RIGHT:
                    if plansza.snake.poprzedni_kierunek != [-1, 0]:
                        plansza.snake.kierunek = [1, 0]

        screen.blit(grafika_tlo, (0, 0))
        if plansza.rysuj() == -1:
            ranking(plansza.snake.wynik())
        pygame.display.update()

        zegar.tick(2)

def zapisz_wynik(wynik):
    pole_wpisywania = pygame.Rect(200, 200, 140, 32)
    wpisany_tekst = ''
    while True:
        click = False
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True
            if event.type == pygame.KEYDOWN:
                if event.key == pygame.K_BACKSPACE:
                    #usuwamy ostatnia litere tekstu - wytlumaczyc jak to dziala
                    wpisany_tekst = wpisany_tekst[:len(wpisany_tekst)-1]
                else:
                    wpisany_tekst += event.unicode

        przycisk_zapisz = pygame.Rect(389, 375, 222, 108)
        przycisk_nie_zapisuj = pygame.Rect(389, 452.5, 222, 108)



        myszka_x, myszka_y = pygame.mouse.get_pos()

        if przycisk_zapisz.collidepoint((myszka_x, myszka_y)):
            screen.blit(grafika_save_wcisniety, (389, 388))
            print("wcisniety")
            if click:
                #zapisywanie do pliku
                with open('wyniki.txt', 'a') as plik:
                    plik.write(wpisany_tekst+';'+str(wynik))

                main()

        if przycisk_nie_zapisuj.collidepoint((myszka_x, myszka_y)):
            screen.blit(grafika_exit_wcisniety, (389, 465.5))
            if click:
                main()


        screen.fill(kolor_zielonkawy)

        pygame.draw.rect(screen, kolor_czerwony, pole_wpisywania)
        tekst_img = domyslny_font.render(wpisany_tekst, True, kolor_bialy)
        screen.blit(tekst_img, (pole_wpisywania.x + 5, pole_wpisywania.y + 5))

        pygame.display.update()

def wczytaj_ranking():
    plik = open('wyniki.txt')
    dane = plik.read()
    print(dane)

    linijki = dane.splitlines()
    wyniki = []
    for linijka in linijki:
        wyniki.append(linijka.split(';'))
    return wyniki

def ranking(aktualny_wynik = None):
    wyniki = wczytaj_ranking()
    wpisany_tekst = ''
    click = False

    while 1:
        screen.fill(kolor_zielonkawy)

        screen.blit(grafika_save, (389, 375))

        for i in range(len(wyniki)):
            screen.blit(grafika_ramka, (250, 50 + 50* i))
            nazwa_gracza = domyslny_font.render(wyniki[i][0], True, kolor_bialy)
            punkty = domyslny_font.render(wyniki[i][1], True, kolor_bialy)

            screen.blit(nazwa_gracza, (300, 55 + 50 * i + 5))
            screen.blit(punkty, (650, 55 + 50 * i + 5))

        przycisk_main_menu = pygame.Rect(389, 600, 222, 108)

        click = False
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True
            if aktualny_wynik != None:
                if event.type == KEYDOWN:
                    if event.key == K_BACKSPACE:
                        #usun ostatnia litere z wpisanego tekstu
                        wpisany_tekst = wpisany_tekst[:len(wpisany_tekst) - 1]
                    else:
                        wpisany_tekst += event.unicode

        if aktualny_wynik != None:
            przycisk_zapisz = pygame.Rect(400, 500, 200, 100)
            #pygame.draw.rect(screen, kolor_niebieski, przycisk_zapisz)

            screen.blit(grafika_ramka, (250, 500))
            punkty = domyslny_font.render(str(aktualny_wynik), True, kolor_bialy)
            tekst = domyslny_font.render(wpisany_tekst, True, kolor_bialy)
            screen.blit(punkty, (650, 505))
            screen.blit(tekst, (300, 505))

            myszka_1, myszka_2 = pygame.mouse.get_pos()

            if przycisk_zapisz.collidepoint((myszka_1, myszka_2)):
                if click:
                    with open('wyniki.txt', 'a') as plik:
                        plik.write(wpisany_tekst + ';' + str(aktualny_wynik) + '\n')

                    main()



        myszka_1, myszka_2 = pygame.mouse.get_pos()

        if przycisk_main_menu.collidepoint((myszka_1, myszka_2)):
            screen.blit(grafika_menu_wcisniety, (389, 600))
            if click:
                main()
        else:
            screen.blit(grafika_menu, (389, 583))





        myszka_x, myszka_y = pygame.mouse.get_pos()

        if przycisk_main_menu.collidepoint((myszka_x, myszka_y)):
            if click:
                main()

        pygame.display.update()

def main():
    click = False
    while 1:
        screen.fill(kolor_zielonkawy)
        przycisk_graj = pygame.Rect(389, 207.5, 222, 108)
        przycisk_ranking = pygame.Rect(389, 330, 222, 108)
        przycisk_exit = pygame.Rect(389, 452.5, 222, 108)

        click = False
        for event in pygame.event.get():
            if event.type == MOUSEBUTTONDOWN:
                if event.button == 1:
                    click = True


        myszka_x, myszka_y = pygame.mouse.get_pos()

        if przycisk_graj.collidepoint((myszka_x, myszka_y)):
            screen.blit(grafika_play_wcisniety, (389, 220.5))
            if click:
                gra()
        else:
            screen.blit(grafika_play, (389, 207.5))

        if przycisk_ranking.collidepoint((myszka_x, myszka_y)):
            screen.blit(grafika_ranking_wcisniety, (389, 343))
            if click:
                ranking()
        else:
            screen.blit(grafika_ranking, (389, 330))

        if przycisk_exit.collidepoint((myszka_x, myszka_y)):
            screen.blit(grafika_exit_wcisniety, (389, 465.5))
            if click:
                exit()
        else:
            screen.blit(grafika_exit, (389, 452.5))


        screen.blit(grafika_napis, (325, 25))
        pygame.display.update()

gra()