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