-
Notifications
You must be signed in to change notification settings - Fork 3
/
cursegui.py
369 lines (295 loc) · 9.85 KB
/
cursegui.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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
#!/usr/bin/python
# -*- coding: utf-8 -*-
#**************************************************
# SnakePY (Coding party projet)
#**************************************************
#Importation des modules
import curses
import core
from optparse import OptionParser
import sys
#GLOBAL
global config, game
def initCurse():
"""
Fonction permetttant l'initialisation de Curses()
"""
#On initialise notre fenêtre
curses.initscr()
#Couleur active !
curses.start_color()
curses.use_default_colors()
curses.init_pair(1, curses.COLOR_WHITE, -1)
curses.init_pair(2, curses.COLOR_GREEN, -1)
curses.init_pair(3, curses.COLOR_RED, -1)
curses.curs_set(0)
def closeCurse():
"""
Fonction permettant de fermer 'proprement' Curses()
"""
#On détruit les fenêtres curses
curses.endwin()
#On sort du script
exit()
def loadLogo():
"""
Fonction permettant de charger
le logo.
Cette fonction retourne l'ensemble
des lignes contenues dans le fichier
ASCII.art
"""
#On charge le fichier logo
f = open('ASCII.art', 'rb')
#On recupere les lignes
lines = f.readlines()
#On ferme le fichier
f.close()
return lines
def createNewWin(curses):
"""
Fonction permettant de créer une nouvelle
fenêtre Curses()
"""
#On dimensionne notre fenetre
x = config.rawConfig.getint("GLOBAL", "x")
y = config.rawConfig.getint("GLOBAL", "y")
#On créer la fenêtre
win = curses.newwin(x,y,0,0)
#On affecte les différents paramètres a notre fenêtre
win.keypad(1)
win.nodelay(1)
win.border(0)
return win
def destroyWin():
"""
Fonction permettant de détruire les
fenêtres curses
"""
curses.endwin()
def menu():
"""
Fonction permettant l'affichage du menu
"""
#On créer une nouvelle fenetre
win = createNewWin(curses)
#On charge le logo et on l'affiche
logoLines = loadLogo()
i = 1
for line in logoLines:
win.addstr(i, 16, line, curses.color_pair(2))
i+=1
win.border(0)
chooseMenu = 0
#On ajoute les entrées
win.addstr(1, 4, 'SnakePY', curses.color_pair(1))
win.addstr(2, 4, 'Choose option', curses.color_pair(1))
win.addstr(3, 4, '1. Launch game', curses.color_pair(1))
win.addstr(4, 4, '2. Show HighScore', curses.color_pair(1))
win.addstr(5, 4, '3. Credits', curses.color_pair(1))
win.addstr(6, 4, '4. Exit game', curses.color_pair(1))
win.addstr(7, 4, '')
#On effectue une boucle
while chooseMenu != ord('4'):
#On récupere la touche appuyée par l'utilisateur
chooseMenu = win.getch()
#Si il s'agit du 1 ...
if chooseMenu == ord('1'):
#...on lance le jeu
destroyWin()
launchGame()
#Si il s'agit du 2 ...
elif chooseMenu == ord('2'):
#...on affiche le highscore
destroyWin()
showHG()
#Si il s'agit du 3 ...
elif chooseMenu == ord('3'):
#... on affiche les crédits
destroyWin()
showCredits()
#Si on sort de la boucle (4), alors on
#détruit les fenetres
destroyWin()
#On ferme toutes les fenêtres de curses
closeCurse()
def launchGame():
"""
Fonction propre au jeu
"""
# On rejoint la partie
game.join()
#On affecte le nom
game.player.setName(options.name)
#On créer une nouvelle fenetre
win = createNewWin(curses)
#On creer notre premiere pomme...
win.addch(game.apple.coordx, game.apple.coordy, 'O', curses.color_pair(3))
#On indique la direction par defaut du serpent, il ira par defaut a droite
key = curses.KEY_RIGHT
#On effectue une boucle infinie tant que la touche Echap (27) n'est pas
#pressée.
while key != 27:
#On ajoute le score a la ligne 0, colonne 2
#Le score est calcule en recuperant la longueur du serpent actuel
#et en retirant 2 (sa valeur initiale)
win.addstr(0,2,' Joueur : %s Score : %s ' %(game.player.name, str(game.player.score)), curses.color_pair(1))
#On calcul un mouvement de ralentissement dependant de la longueur du
#serpent
win.timeout(180+ ( (len(game.snake.oSnake)-2) % 10- (len(game.snake.oSnake)-2) ) * 3 )
#On 'hook' les touches
getkey = win.getch()
#On recupere la valeur de la touche par defaut
key = key if getkey==-1 else getkey
#Suivant la touche pressée, on modifie les positions de notre serpent
game.snake.move(key)
#On supprime les derniers elements sur lequel le Snake passe
win.addch(game.snake.oSnake[len(game.snake.oSnake)-1][1],
game.snake.oSnake[len(game.snake.oSnake)-1][0],' ')
#On supprime un element du snake pour eviter la collision
if win.inch(game.snake.oSnake[0][1], game.snake.oSnake[0][0]) & 255 == 32:
game.snake.oSnake.pop()
#Si on passe sur un element O
elif win.inch(game.snake.oSnake[0][1],game.snake.oSnake[0][0]) & 255 == ord('O'):
#On ajoute 1 point a notre Joueur
game.player.addPoint()
#On recalcule des nouvelles coordonnees pour la pomme
game.apple.newApple()
#On verifie les nouvelles coordonnees
while game.apple.checkApple(game.snake.oSnake) != True:
game.apple.newApple()
#On l'affiche a l'ecran
win.addch(game.apple.coordx, game.apple.coordy, 'O', curses.color_pair(3))
else:
break
#On affiche une partie de notre Snake
win.addch(game.snake.oSnake[0][1],game.snake.oSnake[0][0],'X', curses.color_pair(2))
#Si on sort de la boucle (GameOver), alors on
#détruit les fenetres
destroyWin()
#A la fin de la partie (game over), on affiche l'écran
showGameOver()
def showGameOver():
"""
Fonction permettant l'affichage du score
"""
#On créer une nouvelle fenetre
win = createNewWin(curses)
#On affiche le texte
win.addstr(1, 4, 'GAME OVER', curses.color_pair(3))
win.addstr(2, 4, 'Your Score', curses.color_pair(1))
win.addstr(3, 4, '%s - %s' %(game.player.name, game.player.score), curses.color_pair(1))
win.addstr(4, 4, 'Press 1 to return previous menu', curses.color_pair(1))
win.addstr(5, 4, '')
#Ajout dans le highscore
game.highscore.addHighScore(game.player.name, game.player.score)
game.highscore.writeHighScore()
key = 0
#Tant que la touche 1 n'est pas pressée...
#while key!= 343 or key!=10:
while key != ord('1'):
#On attend et on 'hook' les touches
key = win.getch()
#Si on sort de la boucle (1), alors on
#détruit les fenetres
destroyWin()
#A la fin de la partie (game over), on affiche l'écran
menu()
def showHG():
"""
Fonction permettant d'afficher le HighScore
"""
#On créer une nouvelle fenetre
win = createNewWin(curses)
#On affiche le texte
win.addstr(1, 4, 'SnakePY HighScore', curses.color_pair(1))
win.addstr(2, 4, 'Press 1 to return previous menu', curses.color_pair(1))
win.addstr(3, 4, '')
#On boucle sur les HighScore
i = 4
#Pour chaque entrée dans le highscore...
for hg in game.highscore.showHighScore():
#On ajoute une ligne
win.addstr(i, 4, "%s -- %s" %(hg[0], hg[1]), curses.color_pair(1))
i+=1
chooseMenu = 0
#Tant que la touche 1 n'est pas pressée...
while chooseMenu!= ord('1'):
#On attend et on 'hook' les touches
chooseMenu = win.getch()
#Si on sort de la boucle (4), alors on
#détruit les fenetres
destroyWin()
#...sinon on sort de la boucle et on affiche de
#de nouveau le menu
menu()
def showCredits():
"""
Fonction permettant d'afficher la page de crédits
"""
def show(win, lines):
i = 4
for j in range(10):
win.addstr(j+4, 4, ' '*(config.rawConfig.getint("GLOBAL", "y") - 8))
for line in lines:
win.addstr(i, 4, line.strip(), curses.color_pair(1))
i += 1
win.refresh()
#On créer une nouvelle fenetre
win = createNewWin(curses)
#On ajoute nos valeurs
win.addstr(1, 4, 'CREDITS', curses.color_pair(1))
win.addstr(2, 4, 'Press 1 to return previous menu', curses.color_pair(1))
win.addstr(3, 4, '')
#On charge le fichier credits
f = open('CREDITS', 'rb')
#On recupere les lignes
lines = f.readlines()
#On récupére le nombre de lignes
countLines = len(lines)
#Calcul nécessaire pour l'affichage des crédits
maxX = 10
current = 0
showLines = []
for line in lines:
showLines.append(line)
#Pour chaque ligne présentes....
show(win, showLines[current:current+maxX])
current+=10
key = 0
#Tant que la touche 1 n'est pas pressée...
while key != ord('1'):
#On attend et on 'hook' les touches
key = win.getch()
if key == curses.KEY_DOWN:
show(win, showLines[current:current+maxX])
current+=10
#Si on sort de la boucle (1), alors on
#détruit les fenetres
destroyWin()
#...sinon on sort de la boucle et on affiche de
#de nouveau le menu
menu()
#-------------------------
#Initialisation du jeu
#-------------------------
#Partie OptParse
parser = OptionParser()
parser.add_option('-n', '--name', dest="name", help="Name", default="Snake", type="string")
(options, args) = parser.parse_args()
#On instancie notre classe Config
config = core.Config()
try:
#On initialise Curses()
initCurse()
#On dimensionne notre fenetre
x = config.rawConfig.getint("GLOBAL", "x")
y = config.rawConfig.getint("GLOBAL", "y")
#On instancie notre partie
game = core.Game(config)
#On affiche le menu
menu()
except:
#On ferme curse
closeCurse()
sys.exit("Error")