#!/usr/bin/env python
# -*- coding: utf-8 -*-
#
# Buscaminas.py
# Autor: Roberto Díaz Pérez
import random, os
def cls():
"""Para limpiar la pantalla, detecta el sistema operativo y usa el
comando adecuado"""
if os.name == "nt":
os.system("cls")
elif os.name == "posix":
os.system("clear")
def matriz(i,j,s):
"""Devuelve una matriz de dimensiones i * j rellena de s"""
m=[]
for a in range(i):
m.append([])
for b in range(j):
m[a].append(s)
return(m)
def cont(m,b):
"""Cuenta la cantidad de veces que se repite b en la matriz m"""
c=0
for a in range(len(m)):
c=c+m[a].count(b)
return(c)
def MinSweep(i,j,mines):
"""Función principal"""
campo=matriz(i,j,0)
a=0
#Este while rellena la matriz de minas "*".
while cont(campo,"*") < mines:
campo[random.randint(0,i-1)][random.randint(0,j-1)] = "*"
a += 1
#Este if sirve para que si se pusieron más minas que cuadrados
#disponibles, te lo diga y se reinicie el código.
if mines > (i*j):
print("Has puesto más minas que cuadrados disponibles")
raw_input()
cls()
MinSweep(input("¿Columnas?: "), input("¿Filas?: "), input("¿Minas?: "))
#Esta serie de for pone en cada posición de la matriz que no sea una
#mina el numero de minas que hay alrededor.
for x in range(i):
for y in range(j):
if campo[x][y] != "*":
count=0
for a in [1,0,-1]:
for b in [1,0,-1]:
try:
if campo[x+a][y+b]=="*":
if (x+a>-1 and y+b > -1):
count += 1
except:
pass
campo[x][y]=count
#Se crea la matriz que se le enseña al usuario
campoShow=matriz(i,j,"#")
#A partir de este while, es la "interfaz", aquello que se le muestra
#al usuario.
while True:
try:
printmin(campo,i,j) #Enseña la matriz resuelta, es algo que
#tuve que hacer para que estuviera en el mismo formato que la
#matriz campoShow, dado que la función printmin además de imprimir
#la matriz que se le manda, tambien la modifica.
minasdesc=cont(campoShow,"* ")
cls() #Borramos pantalla
printmin(campoShow,i,j)
#Si las minas restantes por descubrir, y las descubiertas son
#iguales y además, no queda ningún "# " en campoShow, se termina
#el juego
if mines-minasdesc == 0 and campoShow.count("# ") == 0:
break
print("Quedan %i minas" %(mines-minasdesc))
i1=int(raw_input("Fila: "))
j1=int(raw_input("Columna: "))
campoShow=clic(campo,campoShow,i1,j1 ,raw_input("¿Mina? (s/n): ")) #Si el raw_input recibe una "s"
#hará el efecto del click derecho (marcar que ahí hay una mina), en caso contrario, hace click
#izquierdo (arriesgarte a ver si hay mina).
if campoShow[i1-1][j1-1]=="0 ":
#Si el punto en el que aplicamos la función click, es un 0
#automáticamente se aplica click alrededor de ese punto.
for a in [1,0,-1]:
for b in [1,0,-1]:
try:
print((i1+a-1>-1 and j1+b-1 > 0))
if (i1+a-1>-1 and j1+b-1 > 0):
campoShow=clic(campo,campoShow,i1+a,j1+b ,"n")
except:
pass
except:
print("¡Pon bien los datos!")
raw_input()
cls()
printmin(campo,i,j)
print(""" GANASTE!!!!""")
raw_input()
main()
def clic(campo,campoShow,i=1,j=1,mina="n"):
"""Función que simula un click"""
i=int(i)-1
j=int(j)-1
if mina=="s":
campoShow[i][j]="*"
else:
if campo[i][j] == "*" or campo[i][j] =="* ":
cls()
print("BOOM!")
printmin(campo,len(campo),len(campo[0]))
raw_input()
main()
elif campoShow[i][j] != "0 ":
campoShow[i][j]=campo[i][j]
if campoShow[i][j]=="0 ":
for a in [1,0,-1]:
for b in [1,0,-1]:
try:
if (i+a>-1 and j+b > -1):
campoShow=clic(campo,campoShow,i+1+a,j+1+b ,"n")
except:
pass
return(campoShow)
def printmin(campo,i,j):
"""Función que imprime la matriz en un formato agradable para el usuario"""
campoprint=list(campo)
x=range(i+1)
for j in range(i+1):
x[j]=str(x[j])+" "
print "".join(x)
for p in range(len(campoprint)):
for t in range(len(campoprint[0])):
if len(str(campoprint[p][t])) == 1:
campoprint[p][t]=str(campoprint[p][t])+" "
a=[]
print str(p+1)+ " " + "".join(campoprint[p])
def main():
cls()
try:
MinSweep(int(raw_input("¿Columnas?: ")), int(raw_input("¿Filas?: ")), int(raw_input("¿Minas?: ")))
except:
print("Error al introducir los datos")
raw_input()
main()
main()