Skip to content

Commit 7eb28a2

Browse files
committed
add snake game
1 parent c0b0009 commit 7eb28a2

File tree

1 file changed

+75
-0
lines changed

1 file changed

+75
-0
lines changed

snake-game/snake.py

Lines changed: 75 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,75 @@
1+
import curses
2+
from random import randint
3+
4+
# setup window
5+
curses.initscr()
6+
win = curses.newwin(20, 60, 0, 0) # y,x
7+
win.keypad(1)
8+
curses.noecho()
9+
curses.curs_set(0)
10+
win.border(0)
11+
win.nodelay(1) # -1
12+
13+
# snake and food
14+
snake = [(4, 10), (4, 9), (4, 8)]
15+
food = (10, 20)
16+
17+
win.addch(food[0], food[1], '#')
18+
# game logic
19+
score = 0
20+
21+
ESC = 27
22+
key = curses.KEY_RIGHT
23+
24+
while key != ESC:
25+
win.addstr(0, 2, 'Score ' + str(score) + ' ')
26+
win.timeout(150 - (len(snake)) // 5 + len(snake)//10 % 120) # increase speed
27+
28+
prev_key = key
29+
event = win.getch()
30+
key = event if event != -1 else prev_key
31+
32+
if key not in [curses.KEY_LEFT, curses.KEY_RIGHT, curses.KEY_UP, curses.KEY_DOWN, ESC]:
33+
key = prev_key
34+
35+
# calculate the next coordinates
36+
y = snake[0][0]
37+
x = snake[0][1]
38+
if key == curses.KEY_DOWN:
39+
y += 1
40+
if key == curses.KEY_UP:
41+
y -= 1
42+
if key == curses.KEY_LEFT:
43+
x -= 1
44+
if key == curses.KEY_RIGHT:
45+
x += 1
46+
47+
snake.insert(0, (y, x)) # append O(n)
48+
49+
# check if we hit the border
50+
if y == 0: break
51+
if y == 19: break
52+
if x == 0: break
53+
if x == 59: break
54+
55+
# if snake runs over itself
56+
if snake[0] in snake[1:]: break
57+
58+
if snake[0] == food:
59+
# eat the food
60+
score += 1
61+
food = ()
62+
while food == ():
63+
food = (randint(1,18), randint(1,58))
64+
if food in snake:
65+
food = ()
66+
win.addch(food[0], food[1], '#')
67+
else:
68+
# move snake
69+
last = snake.pop()
70+
win.addch(last[0], last[1], ' ')
71+
72+
win.addch(snake[0][0], snake[0][1], '*')
73+
74+
curses.endwin()
75+
print(f"Final score = {score}")

0 commit comments

Comments
 (0)