Advertisement
Guest User

Untitled

a guest
Jun 19th, 2019
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Python 7.64 KB | None | 0 0
  1. # Snake Tutorial Python
  2.  
  3. import math
  4. import random
  5. import pygame
  6. import tkinter as tk
  7. from tkinter import messagebox
  8.  
  9.  
  10. class cube(object):
  11.     rows = 20
  12.     w = 600
  13.  
  14.     def __init__(self, start, dirnx=1, dirny=0, color=(255, 0, 0)):  # poczatkowo dirnx jako 1 zeby waz jechal od poczatku i nie czekal na klikniecie
  15.         self.pos = start
  16.         self.dirnx = 1
  17.         self.dirny = 0
  18.         self.color = color
  19.  
  20.     def move(self, dirnx, dirny):
  21.         self.dirnx = dirnx
  22.         self.dirny = dirny
  23.         # zmiana pozycji zaleznie od kierunku poruszania
  24.         self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
  25.  
  26.     def draw(self, surface, eyes=False):
  27.         sizeBtwn = self.w // self.rows
  28.         i = self.pos[0]
  29.         j = self.pos[1]
  30.  
  31.         pygame.draw.rect(surface, self.color, (i * sizeBtwn + 1, j * sizeBtwn + 1, sizeBtwn - 2, sizeBtwn - 2))
  32.         # +1 i -2 chodzi o to zeby bylo widac linie miedzy kostkami ciala weza
  33.  
  34.  
  35.         # rysowanie oczu malo wazne xD
  36.         if eyes:
  37.             centre = sizeBtwn // 2
  38.             radius = 3
  39.             circleMiddle = (i * sizeBtwn + centre - radius, j * sizeBtwn + 8)
  40.             circleMiddle2 = (i * sizeBtwn + sizeBtwn - radius * 2, j * sizeBtwn + 8)
  41.             pygame.draw.circle(surface, (0, 0, 0), circleMiddle, radius)
  42.             pygame.draw.circle(surface, (0, 0, 0), circleMiddle2, radius)
  43.  
  44.  
  45. class snake(object):
  46.     body = []
  47.     turns = {}  # tablica skretow zeby zapamierac jakby w jakiej pozycji w ktorym kierunku sie jechalo
  48.                 # ta tablica skretow jest potrzebna bo cialo to wiecej niz jeden klocek
  49.  
  50.     def __init__(self, color, pos):
  51.         self.color = color
  52.         self.head = cube(pos)  # glowa weza to kostka na danej pozycji
  53.         self.body.append(self.head)  # cialo weza to lista kostek
  54.         # kierunki albo -1 albo 0 albo 1 zawsze jedna wartosc rozna od 0 inna rowna 0 bo albo w poziomie albo w pionie sie porusza
  55.         self.dirnx = 0
  56.         self.dirny = 1
  57.  
  58.     def move(self):
  59.         for event in pygame.event.get():
  60.             if event.type == pygame.QUIT:
  61.                 pygame.quit()
  62.  
  63.             keys = pygame.key.get_pressed()
  64.  
  65.             # tutaj ustalany jest kierunek ruchu zaleznie od przycisku
  66.             for key in keys:
  67.                 if keys[pygame.K_LEFT]:
  68.                     self.dirnx = -1
  69.                     self.dirny = 0
  70.                     self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
  71.  
  72.                 elif keys[pygame.K_RIGHT]:
  73.                     self.dirnx = 1
  74.                     self.dirny = 0
  75.                     self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
  76.  
  77.                 elif keys[pygame.K_UP]:
  78.                     self.dirnx = 0
  79.                     self.dirny = -1
  80.                     self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
  81.  
  82.                 elif keys[pygame.K_DOWN]:
  83.                     self.dirnx = 0
  84.                     self.dirny = 1
  85.                     self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
  86.  
  87.         for i, c in enumerate(self.body):
  88.             p = c.pos[:]  # pozycje danek kostki w ciele weza
  89.             if p in self.turns:  # jesli w pozycji tej kostki byl skret to
  90.                 turn = self.turns[p]
  91.                 c.move(turn[0], turn[1])  # "skrec" dana kostke
  92.                 if i == len(self.body) - 1:
  93.                     self.turns.pop(p)  # po wszystkich kostkach wyrzuc ostatni skret zeby nie skrecac w nim caly czas
  94.             else:  # sprawdzanie czy nie jest jakby na kranicy planszy i ewentualne przenoszenie
  95.                 if c.dirnx == -1 and c.pos[0] <= 0:
  96.                     c.pos = (c.rows - 1, c.pos[1])
  97.                 elif c.dirnx == 1 and c.pos[0] >= c.rows - 1:
  98.                     c.pos = (0, c.pos[1])
  99.                 elif c.dirny == 1 and c.pos[1] >= c.rows - 1:
  100.                     c.pos = (c.pos[0], 0)
  101.                 elif c.dirny == -1 and c.pos[1] <= 0:
  102.                     c.pos = (c.pos[0], c.rows - 1)
  103.                 else:
  104.                     c.move(c.dirnx, c.dirny)
  105.  
  106.     def reset(self, pos):
  107.         self.head = cube(pos)
  108.         self.body = []
  109.         self.body.append(self.head)
  110.         self.turns = {}
  111.         self.dirnx = 0
  112.         self.dirny = 1
  113.  
  114.     def addCube(self):
  115.         tail = self.body[-1]
  116.         dx, dy = tail.dirnx, tail.dirny
  117.  
  118.         # dodanie kostki w dobrym miejscu zaleznie od kierunku poruszania sie ogona
  119.         if dx == 1 and dy == 0:
  120.             self.body.append(cube((tail.pos[0] - 1, tail.pos[1])))
  121.         elif dx == -1 and dy == 0:
  122.             self.body.append(cube((tail.pos[0] + 1, tail.pos[1])))
  123.         elif dx == 0 and dy == 1:
  124.             self.body.append(cube((tail.pos[0], tail.pos[1] - 1)))
  125.         elif dx == 0 and dy == -1:
  126.             self.body.append(cube((tail.pos[0], tail.pos[1] + 1)))
  127.  
  128.         self.body[-1].dirnx = dx
  129.         self.body[-1].dirny = dy
  130.  
  131.     def draw(self, surface):
  132.         for i, c in enumerate(self.body):
  133.             if i == 0:
  134.                 c.draw(surface, True)  # jesli glowa to narysuj oczy xD
  135.             else:
  136.                 c.draw(surface)  # jesli nie to rysuj zwykla kostke
  137.  
  138.  
  139. def drawGrid(w, rows, surface):
  140.     sizeBtwn = w // rows  # // dzielenie bez czesci  po przecinku
  141.                           # odleglosc miedzy kazda linia w siatce
  142.  
  143.     x = 0
  144.     y = 0
  145.     for l in range(rows):
  146.         x = x + sizeBtwn
  147.         y = y + sizeBtwn
  148.  
  149.         pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w))  # linie pionowe
  150.         pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y))  # linie poziome
  151.  
  152.  
  153. def redrawWindow(surface):
  154.     global rows, width, s, snack
  155.     surface.fill((0, 0, 0))  # czarna plansza
  156.     s.draw(surface)
  157.     snack.draw(surface)  # rysowania jedzenia
  158.     drawGrid(width, rows, surface)  # rysowanie siatki na planszy
  159.     pygame.display.update()
  160.  
  161.  
  162. def randomSnack(rows, snake):
  163.     positions = snake.body
  164.  
  165.     while True:
  166.         x = random.randrange(rows)
  167.         y = random.randrange(rows)
  168.         flag = False
  169.  
  170.         # sprawdzanie czy jedzenie nie jest w ciele weza
  171.         for i, c in enumerate(positions):
  172.             if c.pos == (x, y):
  173.                 flag = True
  174.                 break
  175.  
  176.         if flag:
  177.             continue
  178.         else:
  179.             break
  180.  
  181.     return (x, y)
  182.  
  183.  
  184. def message_box(subject, content):
  185.     root = tk.Tk()
  186.     root.attributes("-topmost", True)
  187.     root.withdraw()
  188.     messagebox.showinfo(subject, content)
  189.     try:
  190.         root.destroy()
  191.     except:
  192.         pass
  193.  
  194.  
  195. def main():
  196.     global width, rows, s, snack
  197.     width = 600
  198.     rows = 20
  199.     win = pygame.display.set_mode((width, width))  # plansza kwadratowa wymiary width na width
  200.     s = snake((255, 0, 0), (10, 10))
  201.     snack = cube(randomSnack(rows, s), color=(0, 255, 0))  # dodanie jedzenie w randomowym miejscu na poczatku
  202.     flag = True
  203.  
  204.     clock = pygame.time.Clock()
  205.  
  206.     while flag:
  207.         pygame.time.delay(50)  # im wiecej tym szybciej leci waz
  208.         clock.tick(8)  # im mniej tym szybciej leci waz
  209.         s.move()
  210.         if s.body[0].pos == snack.pos:  # najechanie na jedzenie
  211.             s.addCube()  #dodanie kostki do ciala weza
  212.             snack = cube(randomSnack(rows, s), color=(0, 255, 0))  # nowa random kostka
  213.  
  214.         for x in range(len(s.body)):
  215.             if s.body[x].pos in list(map(lambda z: z.pos, s.body[x + 1:])):  # sprawdzanie czy sie w siebie nie wjechalo
  216.                 print('Score: ', len(s.body))
  217.                 message_box('You Lost!', 'Play again...')
  218.                 s.reset((10, 10))
  219.                 break
  220.  
  221.         redrawWindow(win)  # rysowanie planszy
  222.  
  223.     pass
  224.  
  225.  
  226. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement