Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- # Snake Tutorial Python
- import math
- import random
- import pygame
- import tkinter as tk
- from tkinter import messagebox
- class cube(object):
- rows = 20
- w = 600
- 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
- self.pos = start
- self.dirnx = 1
- self.dirny = 0
- self.color = color
- def move(self, dirnx, dirny):
- self.dirnx = dirnx
- self.dirny = dirny
- # zmiana pozycji zaleznie od kierunku poruszania
- self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny)
- def draw(self, surface, eyes=False):
- sizeBtwn = self.w // self.rows
- i = self.pos[0]
- j = self.pos[1]
- pygame.draw.rect(surface, self.color, (i * sizeBtwn + 1, j * sizeBtwn + 1, sizeBtwn - 2, sizeBtwn - 2))
- # +1 i -2 chodzi o to zeby bylo widac linie miedzy kostkami ciala weza
- # rysowanie oczu malo wazne xD
- if eyes:
- centre = sizeBtwn // 2
- radius = 3
- circleMiddle = (i * sizeBtwn + centre - radius, j * sizeBtwn + 8)
- circleMiddle2 = (i * sizeBtwn + sizeBtwn - radius * 2, j * sizeBtwn + 8)
- pygame.draw.circle(surface, (0, 0, 0), circleMiddle, radius)
- pygame.draw.circle(surface, (0, 0, 0), circleMiddle2, radius)
- class snake(object):
- body = []
- turns = {} # tablica skretow zeby zapamierac jakby w jakiej pozycji w ktorym kierunku sie jechalo
- # ta tablica skretow jest potrzebna bo cialo to wiecej niz jeden klocek
- def __init__(self, color, pos):
- self.color = color
- self.head = cube(pos) # glowa weza to kostka na danej pozycji
- self.body.append(self.head) # cialo weza to lista kostek
- # 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
- self.dirnx = 0
- self.dirny = 1
- def move(self):
- for event in pygame.event.get():
- if event.type == pygame.QUIT:
- pygame.quit()
- keys = pygame.key.get_pressed()
- # tutaj ustalany jest kierunek ruchu zaleznie od przycisku
- for key in keys:
- if keys[pygame.K_LEFT]:
- self.dirnx = -1
- self.dirny = 0
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- elif keys[pygame.K_RIGHT]:
- self.dirnx = 1
- self.dirny = 0
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- elif keys[pygame.K_UP]:
- self.dirnx = 0
- self.dirny = -1
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- elif keys[pygame.K_DOWN]:
- self.dirnx = 0
- self.dirny = 1
- self.turns[self.head.pos[:]] = [self.dirnx, self.dirny]
- for i, c in enumerate(self.body):
- p = c.pos[:] # pozycje danek kostki w ciele weza
- if p in self.turns: # jesli w pozycji tej kostki byl skret to
- turn = self.turns[p]
- c.move(turn[0], turn[1]) # "skrec" dana kostke
- if i == len(self.body) - 1:
- self.turns.pop(p) # po wszystkich kostkach wyrzuc ostatni skret zeby nie skrecac w nim caly czas
- else: # sprawdzanie czy nie jest jakby na kranicy planszy i ewentualne przenoszenie
- if c.dirnx == -1 and c.pos[0] <= 0:
- c.pos = (c.rows - 1, c.pos[1])
- elif c.dirnx == 1 and c.pos[0] >= c.rows - 1:
- c.pos = (0, c.pos[1])
- elif c.dirny == 1 and c.pos[1] >= c.rows - 1:
- c.pos = (c.pos[0], 0)
- elif c.dirny == -1 and c.pos[1] <= 0:
- c.pos = (c.pos[0], c.rows - 1)
- else:
- c.move(c.dirnx, c.dirny)
- def reset(self, pos):
- self.head = cube(pos)
- self.body = []
- self.body.append(self.head)
- self.turns = {}
- self.dirnx = 0
- self.dirny = 1
- def addCube(self):
- tail = self.body[-1]
- dx, dy = tail.dirnx, tail.dirny
- # dodanie kostki w dobrym miejscu zaleznie od kierunku poruszania sie ogona
- if dx == 1 and dy == 0:
- self.body.append(cube((tail.pos[0] - 1, tail.pos[1])))
- elif dx == -1 and dy == 0:
- self.body.append(cube((tail.pos[0] + 1, tail.pos[1])))
- elif dx == 0 and dy == 1:
- self.body.append(cube((tail.pos[0], tail.pos[1] - 1)))
- elif dx == 0 and dy == -1:
- self.body.append(cube((tail.pos[0], tail.pos[1] + 1)))
- self.body[-1].dirnx = dx
- self.body[-1].dirny = dy
- def draw(self, surface):
- for i, c in enumerate(self.body):
- if i == 0:
- c.draw(surface, True) # jesli glowa to narysuj oczy xD
- else:
- c.draw(surface) # jesli nie to rysuj zwykla kostke
- def drawGrid(w, rows, surface):
- sizeBtwn = w // rows # // dzielenie bez czesci po przecinku
- # odleglosc miedzy kazda linia w siatce
- x = 0
- y = 0
- for l in range(rows):
- x = x + sizeBtwn
- y = y + sizeBtwn
- pygame.draw.line(surface, (255, 255, 255), (x, 0), (x, w)) # linie pionowe
- pygame.draw.line(surface, (255, 255, 255), (0, y), (w, y)) # linie poziome
- def redrawWindow(surface):
- global rows, width, s, snack
- surface.fill((0, 0, 0)) # czarna plansza
- s.draw(surface)
- snack.draw(surface) # rysowania jedzenia
- drawGrid(width, rows, surface) # rysowanie siatki na planszy
- pygame.display.update()
- def randomSnack(rows, snake):
- positions = snake.body
- while True:
- x = random.randrange(rows)
- y = random.randrange(rows)
- flag = False
- # sprawdzanie czy jedzenie nie jest w ciele weza
- for i, c in enumerate(positions):
- if c.pos == (x, y):
- flag = True
- break
- if flag:
- continue
- else:
- break
- return (x, y)
- def message_box(subject, content):
- root = tk.Tk()
- root.attributes("-topmost", True)
- root.withdraw()
- messagebox.showinfo(subject, content)
- try:
- root.destroy()
- except:
- pass
- def main():
- global width, rows, s, snack
- width = 600
- rows = 20
- win = pygame.display.set_mode((width, width)) # plansza kwadratowa wymiary width na width
- s = snake((255, 0, 0), (10, 10))
- snack = cube(randomSnack(rows, s), color=(0, 255, 0)) # dodanie jedzenie w randomowym miejscu na poczatku
- flag = True
- clock = pygame.time.Clock()
- while flag:
- pygame.time.delay(50) # im wiecej tym szybciej leci waz
- clock.tick(8) # im mniej tym szybciej leci waz
- s.move()
- if s.body[0].pos == snack.pos: # najechanie na jedzenie
- s.addCube() #dodanie kostki do ciala weza
- snack = cube(randomSnack(rows, s), color=(0, 255, 0)) # nowa random kostka
- for x in range(len(s.body)):
- if s.body[x].pos in list(map(lambda z: z.pos, s.body[x + 1:])): # sprawdzanie czy sie w siebie nie wjechalo
- print('Score: ', len(s.body))
- message_box('You Lost!', 'Play again...')
- s.reset((10, 10))
- break
- redrawWindow(win) # rysowanie planszy
- pass
- main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement