diff --git a/ISN/pygame/fig/snake_corr.png b/ISN/pygame/fig/snake_corr.png new file mode 100644 index 0000000..b497537 Binary files /dev/null and b/ISN/pygame/fig/snake_corr.png differ diff --git a/ISN/pygame/snake_corr.py b/ISN/pygame/snake_corr.py index 6c728ff..000ae5f 100644 --- a/ISN/pygame/snake_corr.py +++ b/ISN/pygame/snake_corr.py @@ -1,22 +1,180 @@ -import pygame +""" + Snake pour l'ISN +""" + +import pygame +from random import randint + +def draw_grid(): + """ Dessine la grille """ + for i in range(COLUMN+1): + pygame.draw.line(screen, WHITE, (i*CELLSIZE, 0), (i*CELLSIZE, ROW*CELLSIZE)) + for i in range(ROW+1): + pygame.draw.line(screen, WHITE, (0, i*CELLSIZE), (COLUMN*CELLSIZE, i*CELLSIZE)) + +def draw_snake(snake): + """ Dessine le serpent """ + for i, j in snake: + top_left = (i * CELLSIZE, j * CELLSIZE) + pygame.draw.rect(screen, GREEN, (*top_left, CELLSIZE, CELLSIZE)) + +def draw_cherry(cherry): + """ Dessine les cherry (bonus) """ + center = (int((cherry[0] + 0.5) * CELLSIZE), int((cherry[1] + 0.5) * CELLSIZE)) + radius = int(0.5*CELLSIZE) + pygame.draw.circle(screen, RED, center, radius) + +def draw_right(score): + """ Dessine la partie droite de la fenête """ + width_right_bar = s_width - COLUMN*CELLSIZE + top_left_right_bar = (COLUMN*CELLSIZE, 0) + title = TITLEFONT.render("SNAKE", True, WHITE) + title_rect = title.get_rect() + title_rect.centerx = int(top_left_right_bar[0] + width_right_bar/2) + title_rect.centery = 50 + screen.blit(title, title_rect) + + score_text = "Score " + str(score) + score = TEXTFONT.render(score_text, True, WHITE) + score_rect = score.get_rect() + score_rect.centerx = int(top_left_right_bar[0] + width_right_bar/2) + score_rect.centery = 100 + screen.blit(score, score_rect) + +def random_place(row, col): + """ Retourne un lieu aléatoire sur la grille """ + return [randint(0, row-1), randint(0, col-1)] + +def move_snake(snake, snake_direction, growing): + """ Retourne la nouvelle position du snake + + Si growing est True, on ne supprime par le dernier élément de la queue pour que le serpent grandisse + + L'idée est de trouver les coordonnées de la nouvelle tête (new_head) puis de coller le corp du serpent (en supprimant la dernière partie si l'on veut que le serpent de grandisse pas. + + """ + new_head = [snake[0][0] + snake_direction[0], snake[0][1] + snake_direction[1]] + if growing: + return [new_head] + snake + else: + # [:-1] permet de dire que l'on veut la liste sauf le dernier élément. + return [new_head] + snake[:-1] + +def is_out(snake): + """ Retourne True si le snake est sorti de la grille """ + # le snake[0] est la tête du serpent. + return snake[0][0] > COLUMN or \ + snake[0][0] < 0 or \ + snake[0][1] > ROW or\ + snake[0][1] < 0 + +def is_eating_queue(snake): + """ Retourne True si le serpent se mort la queue """ + # On se demande si la tête du serpent est dans (in) la queue dans ce cas il se mort la queue + return snake[0] in snake[1:] + +def is_eating(snake, cherry): + """ Retroune True si le snake mange la cherry""" + return snake[0] == cherry + +# Call this function so the Pygame library can initialize itself pygame.init() -largeur = 600 -hauteur = 400 -windowSurface = pygame.display.set_mode((largeur, hauteur), 0,32) - +# --- Globals --- +# Colors +BLACK = (0, 0, 0) +GREEN = (0, 255, 0) +RED = (255, 0, 0) WHITE = (255, 255, 255) +# font +TITLEFONT = pygame.font.SysFont(None, 48) +TEXTFONT = pygame.font.SysFont(None, 30) + +# THE GRID +ROW = 20 +COLUMN = 20 + +# CELL +CELLSIZE = 20 + +# Create an 800x600 sized screen +s_width = COLUMN * CELLSIZE + 200 +s_height = ROW * CELLSIZE + 1 +screen = pygame.display.set_mode([s_width, s_height]) + +# Set the title of the window +pygame.display.set_caption('Snake') + +clock = pygame.time.Clock() + +# The snake +snake = [[5, 5], [4, 5], [3, 5]] +snake_direction = [1, 0] + +# The cherry +cherry = random_place(ROW, COLUMN) + +# The score +score = 0 +growing = False running = True while running: - - pygame.draw.line(windowSurface, WHITE, (0,10), (600,10)) - - pygame.display.update() - + # Event loop for event in pygame.event.get(): if event.type == pygame.QUIT: running = False + elif event.type == pygame.KEYUP: + # On empèche que le snake fasse demi tour + if event.key == pygame.K_UP: + if snake_direction != [0, 1]: + snake_direction = [0, -1] + elif event.key == pygame.K_DOWN: + if snake_direction != [0, -1]: + snake_direction = [0, 1] + elif event.key == pygame.K_LEFT: + if snake_direction != [1, 0]: + snake_direction = [-1, 0] + elif event.key == pygame.K_RIGHT: + if snake_direction != [-1, 0]: + snake_direction = [1, 0] + + # Move the snake + if growing: + snake = move_snake(snake, snake_direction, True) + growing = False + else: + snake = move_snake(snake, snake_direction, False) + + # Draw elements + screen.fill(BLACK) + draw_grid() + draw_right(score) + draw_snake(snake) + draw_cherry(cherry) + + # Flip screen + pygame.display.flip() + + if is_eating(snake, cherry): + score = score + 1 + growing = True + cherry = random_place(ROW, COLUMN) + + # loosing! + if is_out(snake) or is_eating_queue(snake): + screen.fill(BLACK) + text = TITLEFONT.render('You loose!!', True, BLACK,WHITE) + textRect = text.get_rect() + textRect.centerx = screen.get_rect().centerx + textRect.centery = screen.get_rect().centery + screen.blit(text, textRect) + pygame.display.flip() + pygame.time.wait(1000) + running = False + + # Pause + clock.tick(2) pygame.quit() diff --git a/ISN/pygame/snake_expl.pdf b/ISN/pygame/snake_expl.pdf new file mode 100644 index 0000000..fc6dd04 Binary files /dev/null and b/ISN/pygame/snake_expl.pdf differ diff --git a/ISN/pygame/snake_expl.svg b/ISN/pygame/snake_expl.svg new file mode 100644 index 0000000..b2e17e2 --- /dev/null +++ b/ISN/pygame/snake_expl.svg @@ -0,0 +1,311 @@ + + + + + + + image/svg+xml + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + 012 + ROW + + + + 0 1 2 + COLUMN + + s_width + s_height + CELLSIZE + + + width_right_bar +