1+ import random
2+ import pygame
3+
4+ pygame .init ()
5+
6+ white = (255 , 255 , 255 )
7+ black = (0 , 0 , 0 )
8+ red = (255 , 0 , 0 )
9+ green = (0 , 255 , 0 )
10+
11+ display_width = 900
12+ display_height = 600
13+ block_size = 30
14+ speed = 30
15+ apple_thickness = 30
16+
17+ gameDisplay = pygame .display .set_mode ((display_width , display_height ))
18+ pygame .display .set_caption ('Slither' )
19+ apple_img = pygame .image .load ('apple2.png' )
20+ snakeHead = pygame .image .load ('snakehead.png' )
21+ pygame .display .set_icon (apple_img )
22+ clock = pygame .time .Clock ()
23+
24+ FPS = 15
25+ small_font = pygame .font .SysFont (None , 25 )
26+ med_font = pygame .font .SysFont (None , 50 )
27+ large_font = pygame .font .SysFont (None , 80 )
28+
29+
30+ def pause ():
31+
32+ paused = True
33+ message_to_screen ("Game Paused" , red , - 100 , "large" )
34+ message_to_screen ("press C to continue,R to restart and Q to quit" , black , 25 )
35+ pygame .display .update ()
36+ while paused :
37+ for event in pygame .event .get ():
38+ if event .type == pygame .KEYDOWN :
39+ if event .key == pygame .K_q :
40+ pygame .quit ()
41+ quit ()
42+ elif event .key == pygame .K_c :
43+ paused = False
44+ elif event .key == pygame .K_r :
45+ paused = False
46+ game_loop ()
47+ elif event .type == pygame .QUIT :
48+ pygame .quit ()
49+ quit ()
50+
51+
52+ def score (underscore ):
53+ text = small_font .render ("score: " + str (underscore ), True , black )
54+ gameDisplay .blit (text , [10 , 10 ])
55+
56+
57+ def snake (snake_list , direction ):
58+ if direction == 'right' :
59+ head = pygame .transform .rotate (snakeHead , 270 )
60+ elif direction == 'left' :
61+ head = pygame .transform .rotate (snakeHead , 90 )
62+ elif direction == 'top' :
63+ head = pygame .transform .rotate (snakeHead , 0 )
64+ else :
65+ head = pygame .transform .rotate (snakeHead , 180 )
66+ gameDisplay .blit (head , [snake_list [- 1 ][0 ], snake_list [- 1 ][1 ]])
67+ for xny in snake_list [:- 1 ]:
68+ pygame .draw .rect (gameDisplay , green , [xny [0 ], xny [1 ], block_size , block_size ])
69+
70+
71+ def text_objects (text , color , size ):
72+ text_surf = small_font .render (text , True , color )
73+ if size == "small" :
74+ text_surf = small_font .render (text , True , color )
75+ elif size == "medium" :
76+ text_surf = med_font .render (text , True , color )
77+ elif size == "large" :
78+ text_surf = large_font .render (text , True , color )
79+ return text_surf , text_surf .get_rect ()
80+
81+
82+ def message_to_screen (msg , color , y_displace = 0 , size = 'small' ):
83+ text_surf , text_rect = text_objects (msg , color , size )
84+ text_rect .center = (display_width / 2 ), (display_height / 2 ) + y_displace
85+ gameDisplay .blit (text_surf , text_rect )
86+
87+
88+ def game_intro ():
89+ intro = True
90+
91+ while intro :
92+ gameDisplay .fill (white )
93+ message_to_screen ("Welcome to Slither" , green , - 100 , "large" )
94+ message_to_screen ("Press C to play, P to pause, R to restart and Q to exit" , black , - 20 , "small" )
95+ pygame .display .update ()
96+ clock .tick (5 )
97+
98+ for event in pygame .event .get ():
99+ if event .type == pygame .KEYDOWN :
100+ if event .key == pygame .K_q :
101+ pygame .quit ()
102+ quit ()
103+ elif event .key == pygame .K_c :
104+ intro = False
105+ elif event .type == pygame .QUIT :
106+ pygame .quit ()
107+ quit ()
108+
109+
110+ def game_loop ():
111+
112+ game_exit = False
113+ game_over = False
114+
115+ lead_x = display_width / 2
116+ lead_y = display_height / 2
117+
118+ lead_x_change = speed
119+ lead_y_change = 0
120+
121+ snake_list = []
122+ snake_length = 1
123+
124+ rand_apple_x = random .randrange (0 , display_width - apple_thickness + 1 , 30 )
125+ rand_apple_y = random .randrange (0 , display_height - apple_thickness + 1 , 30 )
126+
127+ direction = 'right'
128+
129+ while not game_exit :
130+
131+ if game_over :
132+ message_to_screen ("Game over " , red , y_displace = - 50 , size = "large" )
133+ message_to_screen ("Your score is: " + str (snake_length - 1 ), green , y_displace = 10 , size = "medium" )
134+ message_to_screen ("press C to continue, Q to quit" , black , y_displace = 60 , size = "medium" )
135+ pygame .display .update ()
136+
137+ while game_over :
138+ for event in pygame .event .get ():
139+ if event .type == pygame .KEYDOWN :
140+ if event .key == pygame .K_q :
141+ game_exit = True
142+ game_over = False
143+ elif event .key == pygame .K_c :
144+ game_loop ()
145+ elif event .type == pygame .QUIT :
146+ game_exit = True
147+ game_over = False
148+
149+ for event in pygame .event .get ():
150+ if event .type == pygame .QUIT :
151+ game_exit = True
152+ elif event .type == pygame .KEYDOWN :
153+ if event .key == pygame .K_q :
154+ game_exit = True
155+ game_over = False
156+ elif event .key == pygame .K_LEFT :
157+ lead_x_change = - speed
158+ lead_y_change = 0
159+ direction = 'left'
160+ elif event .key == pygame .K_RIGHT :
161+ lead_x_change = speed
162+ lead_y_change = 0
163+ direction = 'right'
164+ elif event .key == pygame .K_UP :
165+ lead_y_change = - speed
166+ lead_x_change = 0
167+ direction = 'top'
168+ elif event .key == pygame .K_DOWN :
169+ lead_y_change = speed
170+ lead_x_change = 0
171+ direction = 'down'
172+ elif event .key == pygame .K_p :
173+ pause ()
174+ elif event .key == pygame .K_r :
175+ game_loop ()
176+
177+ if lead_x < 0 or lead_x > display_width - block_size or lead_y < 0 or lead_y > display_height - block_size :
178+ game_over = True
179+
180+ lead_x += lead_x_change
181+ lead_y += lead_y_change
182+ gameDisplay .fill (white )
183+ while [rand_apple_x , rand_apple_y ] in snake_list :
184+ rand_apple_x = random .randrange (0 , display_width - apple_thickness + 1 , 30 )
185+ rand_apple_y = random .randrange (0 , display_height - apple_thickness + 1 , 30 )
186+ gameDisplay .blit (apple_img , (rand_apple_x , rand_apple_y ))
187+
188+ snake_head = list ()
189+ snake_head .append (lead_x )
190+ snake_head .append (lead_y )
191+ snake_list .append (snake_head )
192+
193+ for each in snake_list [:- 2 ]:
194+ if each == snake_head :
195+ game_over = True
196+
197+ if len (snake_list ) > snake_length :
198+ del snake_list [0 ]
199+
200+ snake (snake_list , direction )
201+ score (snake_length - 1 )
202+ pygame .display .update ()
203+
204+ if rand_apple_x <= lead_x < rand_apple_x + apple_thickness :
205+ if rand_apple_y <= lead_y < rand_apple_y + apple_thickness or rand_apple_y <= lead_y + block_size - 1 < \
206+ rand_apple_y + apple_thickness :
207+ rand_apple_x = random .randrange (0 , display_width - apple_thickness + 1 , 30 )
208+ rand_apple_y = random .randrange (0 , display_height - apple_thickness + 1 , 30 )
209+ snake_length += 1
210+
211+ elif rand_apple_y <= lead_y < rand_apple_y + apple_thickness :
212+ if rand_apple_x <= lead_x + block_size - 1 < rand_apple_x + apple_thickness or rand_apple_x <= lead_x < \
213+ rand_apple_x + apple_thickness :
214+ rand_apple_x = random .randrange (0 , display_width - apple_thickness + 1 , 30 )
215+ rand_apple_y = random .randrange (0 , display_height - apple_thickness + 1 , 30 )
216+ snake_length += 1
217+ clock .tick (FPS )
218+
219+ pygame .quit ()
220+ quit ()
221+
222+ game_intro ()
223+ game_loop ()
0 commit comments