From da9b86943403c6a4366aa51e5b05249bf403bbc6 Mon Sep 17 00:00:00 2001 From: Kristofers-Solo Date: Tue, 29 Mar 2022 23:45:44 +0300 Subject: [PATCH] changed screen and grid size --- pygame/snake/snake.py | 217 ------------------- pygame/snake/source/fonts/space_invaders.ttf | Bin 0 -> 19380 bytes pygame/snake/source/snake.py | 216 ++++++++++++++++++ 3 files changed, 216 insertions(+), 217 deletions(-) delete mode 100755 pygame/snake/snake.py create mode 100644 pygame/snake/source/fonts/space_invaders.ttf create mode 100755 pygame/snake/source/snake.py diff --git a/pygame/snake/snake.py b/pygame/snake/snake.py deleted file mode 100755 index 544045f8..00000000 --- a/pygame/snake/snake.py +++ /dev/null @@ -1,217 +0,0 @@ -# Author - Kristiāns Francis Cagulis -# Date - 11.03.2022 -# Title - Snake - -from random import randrange, randint -import pygame -import tkinter as tk -from tkinter import messagebox - -RED = (255, 0, 0) -BLACK = (0, 0, 0) -WHITE = (255, 255, 255) -GREEN = (0, 128, 30) -PURPLE = (170, 0, 255) -RANDOM_COLOR = (randint(0, 255), randint(0, 255), randint(0, 255)) - -WIDTH = 500 -ROWS = 20 - - -class Cube(object): - width = WIDTH - rows = ROWS - - def __init__(self, start, color=RANDOM_COLOR): - self.pos = start - self.dirnx = 1 - self.dirny = 0 - self.color = color - - def move(self, dirnx, dirny): - self.dirnx = dirnx - self.dirny = dirny - self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny) - - # eyes - def draw(self, surface, eyes=False): - distance = self.width // self.rows - i = self.pos[0] - j = self.pos[1] - - pygame.draw.rect(surface, self.color, (i * distance + 1, j * distance + 1, distance - 2, distance - 2)) - if eyes: - center = distance // 2 - radius = 3 - circle_middle = (i * distance + center - radius, j * distance + 8) - circle_middle_2 = (i * distance + distance - radius * 2, j * distance + 8) - pygame.draw.circle(surface, BLACK, circle_middle, radius) - pygame.draw.circle(surface, BLACK, circle_middle_2, radius) - - -class Snake(object): - body = [] - turns = {} - - def __init__(self, color, pos): - self.color = color - self.head = Cube(pos, self.color) - self.body.append(self.head) - 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() - - for _ 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[:] - if p in self.turns: - turn = self.turns[p] - c.move(turn[0], turn[1]) - if i == len(self.body) - 1: - self.turns.pop(p) - - else: - 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.turns = {} - self.dirnx = 0 - self.dirny = 1 - - def add_cube(self): - tail = self.body[-1] - dx, dy = tail.dirnx, tail.dirny - - 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) - - else: - c.draw(surface) - - -def draw_grid(width, rows, surface): - size_between = width // rows - x = 0 - y = 0 - for _ in range(rows): - x += size_between - y += size_between - - pygame.draw.line(surface, WHITE, (x, 0), (x, width)) - pygame.draw.line(surface, WHITE, (0, y), (width, y)) - - -def redraw_window(surface): - surface.fill(BLACK) - s.draw(surface) - snack.draw(surface) - draw_grid(WIDTH, ROWS, surface) - pygame.display.update() - - -def random_snack(rows, item): - positions = item.body - while True: - x = randrange(rows) - y = randrange(rows) - if len(list(filter(lambda z: z.pos == (x, y), positions))) > 0: - 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(): - win = pygame.display.set_mode((WIDTH, WIDTH)) - flag = True - clock = pygame.time.Clock() - global snack - snack = Cube(random_snack(ROWS, s), color=RED) - while flag: - pygame.time.delay(50) - clock.tick(10) - s.move() - if s.body[0].pos == snack.pos: - s.add_cube() - snack = Cube(random_snack(ROWS, s), color=RED) - - for i in range(len(s.body)): - if s.body[i].pos in list(map(lambda z: z.pos, s.body[i + 1:])): - print(f"Score: {len(s.body)}") - message_box("You Lost!", f"Your score was {len(s.body)}.\nPlay again") - s.reset((10, 10)) - break - redraw_window(win) - - pass - - -s = Snake(PURPLE, (10, 10)) - -if __name__ == '__main__': - main() diff --git a/pygame/snake/source/fonts/space_invaders.ttf b/pygame/snake/source/fonts/space_invaders.ttf new file mode 100644 index 0000000000000000000000000000000000000000..c613ec774c608c39ad9ec6a186539bd0d8f6e9d4 GIT binary patch literal 19380 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 literal 0 HcmV?d00001 diff --git a/pygame/snake/source/snake.py b/pygame/snake/source/snake.py new file mode 100755 index 00000000..77937ca2 --- /dev/null +++ b/pygame/snake/source/snake.py @@ -0,0 +1,216 @@ +# Author - Kristiāns Francis Cagulis +# Date - 28.03.2022 +# Title - Snake + +import pygame +from random import randrange, randint + +RED = (255, 0, 0) +BLACK = (0, 0, 0) +WHITE = (255, 255, 255) +GREEN = (0, 128, 30) +PURPLE = (170, 0, 255) +RANDOM_COLOR = (randint(0, 255), randint(0, 255), randint(0, 255)) + +SQUARE_SIZE = 30 +ROWS, COLUMNS = 30, 20 +WIDTH, HEIGHT = ROWS * SQUARE_SIZE, COLUMNS * SQUARE_SIZE + +RANDOM_POS = (randint(0, ROWS - 1), randint(0, COLUMNS - 1)) + +WINDOW = pygame.display.set_mode((WIDTH, HEIGHT)) + + +class Cube(object): + def __init__(self, start, color=RANDOM_COLOR) -> None: + self.pos = start + self.dirnx = 1 + self.dirny = 0 + self.color = color + + def move(self, dirnx, dirny) -> None: + self.dirnx = dirnx + self.dirny = dirny + self.pos = (self.pos[0] + self.dirnx, self.pos[1] + self.dirny) + + # eyes + def draw(self, surface, eyes=False) -> None: + distance = WIDTH // ROWS + # print(distance) + i = self.pos[0] + j = self.pos[1] + + pygame.draw.rect(surface, self.color, (i * distance + 1, j * distance + 1, distance - 2, distance - 2)) + if eyes: + center = distance // 2 + radius = 3 + circle_middle = (i * distance + center - radius, j * distance + 8) + circle_middle_2 = (i * distance + distance - radius * 2, j * distance + 8) + pygame.draw.circle(surface, BLACK, circle_middle, radius) + pygame.draw.circle(surface, BLACK, circle_middle_2, radius) + + +class Snake(object): + def __init__(self, pos, color) -> None: + self.color = color + self.head = Cube(pos, self.color) + self.body = [] + self.body.append(self.head) + self.turns = {} + self.dirnx = 0 + self.dirny = 1 + + def move(self) -> None: + for event in pygame.event.get(): + if event.type == pygame.QUIT: + pygame.quit() + keys = pygame.key.get_pressed() + + if keys[pygame.K_LEFT] or keys[pygame.K_a]: # turn left + self.dirnx = -1 + self.dirny = 0 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] # turn right + + elif keys[pygame.K_RIGHT] or keys[pygame.K_d]: + self.dirnx = 1 + self.dirny = 0 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + + elif keys[pygame.K_UP] or keys[pygame.K_w]: # turn up + self.dirnx = 0 + self.dirny = -1 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + + elif keys[pygame.K_DOWN] or keys[pygame.K_s]: # turn down + self.dirnx = 0 + self.dirny = 1 + self.turns[self.head.pos[:]] = [self.dirnx, self.dirny] + + for i, head in enumerate(self.body): + head_pos = head.pos[:] + if head_pos in self.turns: + turn = self.turns[head_pos] + head.move(turn[0], turn[1]) + if i == len(self.body) - 1: + self.turns.pop(head_pos) + + else: # move player to other screen size + if head.dirnx == -1 and head.pos[0] <= 0: # left to right + head.pos = (ROWS - 1, head.pos[1]) + + elif head.dirnx == 1 and head.pos[0] >= ROWS - 1: # right to left + head.pos = (0, head.pos[1]) + + elif head.dirny == 1 and head.pos[1] >= COLUMNS - 1: # bottom to top + head.pos = (head.pos[0], 0) + + elif head.dirny == -1 and head.pos[1] <= 0: # top to bottom + head.pos = (head.pos[0], COLUMNS - 1) + + else: + head.move(head.dirnx, head.dirny) + + def reset(self, pos) -> None: + self.head = Cube(pos, self.color) + self.body = [] + self.turns = {} + self.dirnx = 0 + self.dirny = 1 + + def add_cube(self) -> None: + tail = self.body[-1] + dx, dy = tail.dirnx, tail.dirny + + if dx == 1 and dy == 0: + self.body.append(Cube((tail.pos[0] - 1, tail.pos[1]), self.color)) + elif dx == -1 and dy == 0: + self.body.append(Cube((tail.pos[0] + 1, tail.pos[1]), self.color)) + elif dx == 0 and dy == 1: + self.body.append(Cube((tail.pos[0], tail.pos[1] - 1), self.color)) + elif dx == 0 and dy == -1: + self.body.append(Cube((tail.pos[0], tail.pos[1] + 1), self.color)) + + self.body[-1].dirnx = dx + self.body[-1].dirny = dy + + def draw(self, surface) -> None: + for i, head in enumerate(self.body): + if i == 0: + head.draw(surface, True) + + else: + head.draw(surface) + + +def draw_grid(surface) -> None: + size_between = WIDTH // ROWS + x = 0 + y = 0 + for _ in range(ROWS): + x += size_between + y += size_between + + pygame.draw.line(surface, WHITE, (x, 0), (x, HEIGHT)) + pygame.draw.line(surface, WHITE, (0, y), (WIDTH, y)) + + +def redraw_window(snake, snack) -> None: + WINDOW.fill(BLACK) + draw_grid(WINDOW) + snake.draw(WINDOW) + snack.draw(WINDOW) + pygame.display.update() + + +def random_snack(rows, columns, item) -> tuple: + positions = item.body + while True: + x = randrange(rows) + y = randrange(columns) + if len(list(filter(lambda z: z.pos == (x, y), positions))) > 0: + continue + else: + break + return x, y + + +def main() -> None: + FPS = 10 + run = True + clock = pygame.time.Clock() + snake = Snake(RANDOM_POS, PURPLE) + snack = Cube(random_snack(ROWS, COLUMNS, snake), color=GREEN) + while run: + clock.tick(FPS) + pygame.time.delay(50) + snake.move() + if snake.body[0].pos == snack.pos: + snake.add_cube() + snack = Cube(random_snack(ROWS, COLUMNS, snake), color=GREEN) + for i in range(len(snake.body)): + if snake.body[i].pos in list(map(lambda z: z.pos, snake.body[i + 1:])): + print(f"Score: {len(snake.body)}") + run = False + # snake.reset(RANDOM_POS) + redraw_window(snake, snack) + + +set_font = lambda size: pygame.font.SysFont("roboto", size) # sets font size + + +def main_menu() -> None: + while True: + WINDOW.fill(BLACK) + # title_label = set_font(50).render("Press any key to start...", 1, WHITE) + title_label = pygame.font.SysFont("roboto", 50).render("Press any key to start...", 1, WHITE) + WINDOW.blit(title_label, (WIDTH / 2 - title_label.get_width() / 2, HEIGHT / 2 - title_label.get_height() / 2)) + pygame.display.update() + for event in pygame.event.get(): + if event.type == pygame.QUIT: + quit() + if event.type == pygame.KEYDOWN: + main() + + +if __name__ == '__main__': + main_menu()