2018-03-21 06:10:42 +00:00
"""
Snake pour l ' ISN
"""
2017-11-02 02:19:19 +00:00
import pygame
2018-03-21 06:10:42 +00:00
from random import randint
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
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 ) ]
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
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 ( )
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
# --- Globals ---
# Colors
BLACK = ( 0 , 0 , 0 )
GREEN = ( 0 , 255 , 0 )
RED = ( 255 , 0 , 0 )
2017-11-02 02:19:19 +00:00
WHITE = ( 255 , 255 , 255 )
2018-03-21 06:10:42 +00:00
# font
TITLEFONT = pygame . font . SysFont ( None , 48 )
TEXTFONT = pygame . font . SysFont ( None , 30 )
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
# 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 ] )
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
# Set the title of the window
pygame . display . set_caption ( ' Snake ' )
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
clock = pygame . time . Clock ( )
2017-11-02 02:19:19 +00:00
2018-03-21 06:10:42 +00:00
# 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 :
# Event loop
2017-11-02 02:19:19 +00:00
for event in pygame . event . get ( ) :
if event . type == pygame . QUIT :
running = False
2018-03-21 06:10:42 +00:00
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 )
2017-11-02 02:19:19 +00:00
pygame . quit ( )