-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathGame.py
executable file
·126 lines (102 loc) · 3.14 KB
/
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
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
# -*- coding: utf-8 -*-
#Copyright (C) 2008 Fábio Cerqueira
import pygame.event
import pygame.display
from pygame.locals import NOFRAME
from pygame import QUIT,KEYDOWN,K_UP,K_DOWN,K_LEFT,K_RIGHT,K_w,K_r,K_z,KMOD_CTRL
from Map import Map
from Character import Character
from sys import exit
from os import environ
environ['SDL_VIDEO_CENTERED'] = '1'
class Game:
"""Classe que representa o jogo"""
def __init__(self):
self.pilha = [] #pilha usada para o desfazer
self.win = False #True caso tenha finalizado o mapa
self.fase = 0 #id do mapa que está em jogo
self.screen = None #Tela principal do jogo
self.map = None #Map em jogo
self.person = None #Personagem
def init(self):
"""Método para iniciar o jogo completo"""
#inicia a janela 'invisível'
self.screen = pygame.display.set_mode((1,1),NOFRAME,32)
#cria uma instancia para o mapa
self.map = Map(self.screen)
pygame.display.set_icon(self.map._getGraf('!'))
#cria personagem
self.person = Character(self.map,self.screen)
#incia mapa self.fase
self.mapInit()
#Comeca o jogo
self.screen = self.update()
#laço principal do jogo
while True:
for event in pygame.event.get():
if event.type == QUIT:
self.exit()
if event.type == KEYDOWN:
#movimentos do personagem
if event.key == K_UP: #cima
self.win,s = self.person.up()
self.pushPilha(s)
elif event.key == K_DOWN: #baixo
self.win,s = self.person.down()
self.pushPilha(s)
elif event.key == K_LEFT: #esquerda
self.win,s = self.person.left()
self.pushPilha(s)
elif event.key == K_RIGHT: #direita
self.win,s = self.person.right()
self.pushPilha(s)
elif event.key == K_w: #ganha
self.win = True
elif event.key == K_r: #reincia o mapa
self.mapInit()
self.screen = self.update()
elif event.key == K_z and pygame.key.get_mods() & KMOD_CTRL: #ctrl + z
self.desfazer()
self.screen = self.update()
pygame.display.flip()
if self.win:
self.fase = (self.fase+1) % 16
self.mapInit()
self.screen = self.update()
#end init
def pushPilha(self,s):
"""Método adiciona o último estado do jogo a pilha do desfazer. Adiciona no máximo 5 estados.
obj.pushPilha(estado)
estado -> (['mapa'],(x,y))
"""
if len(self.pilha) > 5:
del self.pilha[0]
self.pilha.append(s)
def popPilha(self):
"""Método pop do desfazer"""
if len(self.pilha) > 0:
return self.pilha.pop()
return None
def desfazer(self):
"""Recupera os estados salvos na pilha para desfazer o jogo"""
ns = self.popPilha()
if ns:
self.map._str = ns[0]
self.map._pos = ns[1]
self.map.draw()
def mapInit(self):
"""Inicia um mapa"""
#Marca estado com não vitorioso
self.win = False
#zera a pilha do desfazer
self.pilha = []
#define o mapa de inicio
self.map.setID(self.fase)
#desenha o mapa
self.map.draw()
def update(self):
"""Atualiza jogo"""
return self.person.update()
def exit(self):
"""Sai do jogo"""
exit()