-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathSnake-Game.py
104 lines (100 loc) · 5.11 KB
/
Snake-Game.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
import curses
import random
import time
class Game:
def __init__(self, snakeX, snakeY):
self.snakeX = snakeX
self.snakeY = snakeY
self.snakeBody = [[self.snakeY, self.snakeX], [self.snakeY, self.snakeX-1], [self.snakeY, self.snakeX-2]]
self.food = [self.snakeY // 2, self.snakeX // 2] #inital food of snake
self.screenHeight, self.screenWidth = curses.initscr().getmaxyx()
self.window = curses.newwin(self.screenHeight, self.screenWidth, 0, 0) #creates window for me to interact with
self.window.keypad(True) #enables keyboard input
self.window.timeout(100)
self.score = 0
curses.curs_set(0) #removes my cursor
self.initalKey = curses.KEY_RIGHT
self.box = self.window.subwin(self.screenHeight-2,self.screenWidth-2,1,2)
self.box.box()
curses.start_color()
curses.init_pair(1, curses.COLOR_GREEN,curses.COLOR_BLACK)
curses.init_pair(2, curses.COLOR_RED,curses.COLOR_BLACK)
curses.init_pair(3, curses.COLOR_YELLOW,curses.COLOR_BLACK)
self.window.addch(self.food[0],self.food[1],curses.ACS_PI,curses.color_pair(2))
def check_collisions(self):
if (self.snakeBody[0][0] in [1,self.screenHeight - 2]
or self.snakeBody[0][1] in [2,self.screenWidth - 2]
or self.snakeBody[0] in self.snakeBody[1:]):
self.window.clear()
curses.mousemask(1)
gameOverText = f"Game Over! Final Score: {self.score}"
clickToReset = "Click Anywhere to reset the Game"
qToQuit = "Press Q on your keyboard to quit Game"
self.window.addstr(4,self.screenWidth//2 - len(gameOverText)//2, gameOverText,curses.color_pair(3))
self.window.addstr(6,self.screenWidth//2 - len(clickToReset)//2, clickToReset,curses.color_pair(1))
self.window.addstr(8,self.screenWidth//2 - len(qToQuit)//2, qToQuit,curses.color_pair(2))
self.window.refresh()
while True:
curses.noecho()
varKey = self.window.getch()
if varKey == curses.KEY_MOUSE:
_,_mx,_my,_,_ = curses.getmouse()
if 0 <= _mx < self.screenWidth and 0 <= _my <= self.screenHeight:
self.window.clear()
self.window.refresh()
self.__init__(self.snakeX,self.snakeY)
self.main_game()
elif varKey == ord('q'):
self.window.clear()
curses.endwin()
quit()
def main_game(self):
while not self.check_collisions():
scoreText = f"Score: {self.score}"
self.window.addstr(0,self.screenWidth//2 - len(scoreText)//2, scoreText,curses.color_pair(3))
nextKey = self.window.getch()
opposite_directions = {
curses.KEY_RIGHT: curses.KEY_LEFT,
curses.KEY_LEFT: curses.KEY_RIGHT,
curses.KEY_UP: curses.KEY_DOWN,
curses.KEY_DOWN: curses.KEY_UP
}
if nextKey != -1 and nextKey != opposite_directions.get(self.initalKey,None):
self.initalKey = nextKey
newHead = [self.snakeBody[0][0], self.snakeBody[0][1]] #creates a newHead
match self.initalKey: #ain't that cool
case curses.KEY_RIGHT:
newHead[1]+=1
case curses.KEY_LEFT:
newHead[1]-=1
case curses.KEY_UP:
newHead[0]-=1
case curses.KEY_DOWN:
newHead[0]+=1
self.snakeBody.insert(0, newHead) #adds the newHead to 0 index of snake body i.e at first place
self.window.addch(newHead[0],newHead[1], curses.ACS_CKBOARD,curses.color_pair(1)) #this the player's body shape
if self.snakeBody[0] == self.food:
self.food = None
self.score+=1
while self.food is None:
newFood= [
random.randint(1, self.screenHeight - 4),
random.randint(1, self.screenWidth - 4)
]
self.food = newFood if newFood not in self.snakeBody else None
self.window.addch(self.food[0],self.food[1],curses.ACS_PI,curses.color_pair(2))
else:
tail = self.snakeBody.pop()
self.window.addch(tail[0],tail[1], ' ')
'''Above 3 lines gives illusion player is moving actually
its just adding a new block on every r,u,l,d keystrokes detected, '
'but this command deletes everything until player proves it has eaten food '''
if __name__ == '__main__':
INITAL_SCREEN = curses.initscr() #initalizes terminal as pov
screenHeight, screenWidth = INITAL_SCREEN.getmaxyx()
snakeX = screenWidth // 4
snakeY = screenHeight // 2
#added custom values above so players don't go insane and snake is there on the screen
game = Game(snakeX, snakeY)
game.main_game()
curses.endwin()