from __future__ import print_function import pygame from pygame.locals import * import random VACIA = 0 MINA = 9 UNA = 1 DOS = 2 TRES = 3 CUATRO = 4 CINCO = 5 class Celda: def __init__(self, tipo=VACIA): self.tipo = tipo self.x = 0 self.y = 0 self.destapada = False class Tablero: def __init__(self): self.n = 16 self.m = 16 self.matriz = [] self.numero_minas = 40 self.celdas_destapadas = 0 self.inicializar_tablero() self.colocar_minas() self.computar_minas_vecinas() def inicializar_tablero(self): for i in range(self.n): fila = [] for j in range(self.m): fila.append(Celda()) self.matriz.append(fila) def colocar_minas(self): contador = 0 while contador < self.numero_minas: i = random.randint(0, self.n - 1) j = random.randint(0, self.m - 1) if self.matriz[i][j].tipo == VACIA: self.matriz[i][j].tipo = MINA contador += 1 def computar_minas_vecinas(self): for i in range(self.n): for j in range(self.m): if self.matriz[i][j].tipo == VACIA: tipo_celda_calculado = self.calcular_tipo(i, j) if tipo_celda_calculado >= 3 and (i == 0 or i == self.n - 1 or j == 0 or j == self.m - 1): self.matriz[i][j].tipo = DOS else: self.matriz[i][j].tipo = tipo_celda_calculado def calcular_tipo(self, i, j): contador_minas = 0 if i - 1 >= 0: if self.matriz[i - 1][j].tipo == MINA: contador_minas += 1 if i - 1 >= 0 and j + 1 < self.m: if self.matriz[i - 1][j + 1].tipo == MINA: contador_minas += 1 if j + 1 < self.m: if self.matriz[i][j + 1].tipo == MINA: contador_minas += 1 if i + 1 < self.n and j + 1 < self.m: if self.matriz[i + 1][j + 1].tipo == MINA: contador_minas += 1 if i + 1 < self.n: if self.matriz[i + 1][j].tipo == MINA: contador_minas += 1 if i + 1 < self.n and j - 1 >= 0: if self.matriz[i + 1][j - 1].tipo == MINA: contador_minas += 1 if j - 1 >= 0: if self.matriz[i][j - 1].tipo == MINA: contador_minas += 1 if i - 1 >= 0 and j - 1 >= 0: if self.matriz[i - 1][j - 1].tipo == MINA: contador_minas += 1 return contador_minas def imprimir_tablero(self): for i in range(self.n): for j in range(self.m): print(self.matriz[i][j].tipo, ' ', end='') print() class App: def __init__(self): self._running = True self._display_surf = None self.size = self.weight, self.height = 640, 640 self.clock = pygame.time.Clock() self.tablero = Tablero() print(self.tablero.imprimir_tablero()) def on_init(self): pygame.init() self._display_surf = pygame.display.set_mode(self.size) self._display_surf.fill((255, 255, 255)) self._running = True def on_event(self, event): if event.type == pygame.QUIT: self._running = False def on_loop(self): pass def text_objects(self, text, font): textSurface = font.render(text, True, (0, 0, 0)) return textSurface, textSurface.get_rect() def on_render(self): x = 0 y = 0 for i in range(self.tablero.n): x = 0 for j in range(self.tablero.m): self.tablero.matriz[i][j].x = x self.tablero.matriz[i][j].y = y if self.tablero.matriz[i][j].destapada: smallText = pygame.font.SysFont("comicsansms", 20) textSurf, textRect = self.text_objects(str(self.tablero.matriz[i][j].tipo), smallText) textRect.center = ((x + (40 / 2)), (y + (40 / 2))) self._display_surf.blit(textSurf, textRect) else: pygame.draw.rect(self._display_surf, (140, 240, 130), (x, y, 40, 40), 3) x += 40 y += 40 def on_cleanup(self): pygame.quit() def destapar_celdas(self, i, j): for k in range(8): if i - 1 >= 0: if self.tablero.matriz[i - 1][j].tipo != VACIA and self.tablero.matriz[i - 1][j].tipo != MINA: self.tablero.matriz[i - 1][j].destapada = True elif self.tablero.matriz[i - 1][j].tipo == VACIA: self.destapar_celdas(i - 1, j) if i - 1 >= 0 and j + 1 < self.tablero.m: if self.tablero.matriz[i - 1][j + 1].tipo != VACIA and self.tablero.matriz[i - 1][j + 1].tipo != MINA: self.tablero.matriz[i - 1][j + 1].destapada = True elif self.tablero.matriz[i - 1][j + 1].tipo == VACIA: self.destapar_celdas(i - 1, j + 1) if j + 1 < self.tablero.m: if self.tablero.matriz[i][j + 1].tipo != VACIA and self.tablero.matriz[i][j + 1].tipo != MINA: self.tablero.matriz[i][j + 1].destapada = True elif self.tablero.matriz[i][j + 1].tipo == VACIA: self.destapar_celdas(i, j + 1) def on_execute(self): if self.on_init() == False: self._running = False while (self._running): event = pygame.event.poll() for event in pygame.event.get(): self.on_event(event) if event.type == pygame.QUIT: pygame.quit() quit() if event.type == pygame.MOUSEBUTTONDOWN and event.button == 1: print("You pressed the left mouse button at {}".format(event.pos)) posicion = event.pos y = posicion[0] / 40 x = posicion[1] / 40 self.tablero.matriz[x][y].destapada = True self.on_loop() self.on_render() pygame.display.flip() self.clock.tick(60) self.on_cleanup() if __name__ == "__main__": theApp = App() theApp.on_execute()