Advertisement
Guest User

Buscaminas.py

a guest
Nov 8th, 2012
4,569
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. #!/usr/bin/env python
  2. # -*- coding: utf-8 -*-
  3. #
  4. #   Buscaminas.py
  5. #   Autor: Roberto Díaz Pérez
  6.  
  7. import random, os
  8.  
  9. def cls():
  10.     """Para limpiar la pantalla, detecta el sistema operativo y usa el
  11.     comando adecuado"""
  12.     if os.name == "nt":
  13.         os.system("cls")
  14.     elif os.name == "posix":
  15.         os.system("clear")
  16.  
  17. def matriz(i,j,s):
  18.     """Devuelve una matriz de dimensiones i * j rellena de s"""
  19.     m=[]
  20.     for a in range(i):
  21.         m.append([])
  22.         for b in range(j):
  23.             m[a].append(s)
  24.     return(m)
  25.    
  26. def cont(m,b):
  27.     """Cuenta la cantidad de veces que se repite b en la matriz m"""
  28.     c=0
  29.     for a in range(len(m)):
  30.         c=c+m[a].count(b)
  31.     return(c)
  32.  
  33. def MinSweep(i,j,mines):
  34.     """Función principal"""
  35.     campo=matriz(i,j,0)
  36.     a=0
  37.     #Este while rellena la matriz de minas "*".
  38.     while cont(campo,"*") < mines:
  39.         campo[random.randint(0,i-1)][random.randint(0,j-1)] = "*"
  40.         a += 1
  41.         #Este if sirve para que si se pusieron más minas que cuadrados
  42.         #disponibles, te lo diga y se reinicie el código.
  43.         if mines > (i*j):
  44.             print("Has puesto más minas que cuadrados disponibles")
  45.             raw_input()
  46.             cls()
  47.             MinSweep(input("¿Columnas?: "), input("¿Filas?: "), input("¿Minas?: "))
  48.     #Esta serie de for pone en cada posición de la matriz que no sea una
  49.     #mina el numero de minas que hay alrededor.
  50.     for x in range(i):
  51.         for y in range(j):
  52.             if campo[x][y] != "*":
  53.                 count=0
  54.                 for a in [1,0,-1]:
  55.                     for b in [1,0,-1]:
  56.                         try:
  57.                             if campo[x+a][y+b]=="*":
  58.                                 if (x+a>-1 and y+b > -1):
  59.                                     count += 1
  60.                         except:
  61.                             pass
  62.                 campo[x][y]=count
  63.     #Se crea la matriz que se le enseña al usuario
  64.     campoShow=matriz(i,j,"#")
  65.     #A partir de este while, es la "interfaz", aquello que se le muestra
  66.     #al usuario.
  67.     while True:
  68.         try:
  69.             printmin(campo,i,j) #Enseña la matriz resuelta, es algo que
  70.             #tuve que hacer para que estuviera en el mismo formato que la
  71.             #matriz campoShow, dado que la función printmin además de imprimir
  72.             #la matriz que se le manda, tambien la modifica.
  73.             minasdesc=cont(campoShow,"* ")
  74.             cls() #Borramos pantalla
  75.             printmin(campoShow,i,j)
  76.             #Si las minas restantes por descubrir, y las descubiertas son
  77.             #iguales y además, no queda ningún "# " en campoShow, se termina
  78.             #el juego
  79.             if mines-minasdesc == 0 and campoShow.count("# ") == 0:
  80.                 break
  81.             print("Quedan %i minas" %(mines-minasdesc))
  82.             i1=int(raw_input("Fila: "))
  83.             j1=int(raw_input("Columna: "))
  84.             campoShow=clic(campo,campoShow,i1,j1 ,raw_input("¿Mina? (s/n): ")) #Si el raw_input recibe una "s"
  85.             #hará el efecto del click derecho (marcar que ahí hay una mina), en caso contrario, hace click
  86.             #izquierdo (arriesgarte a ver si hay mina).
  87.             if campoShow[i1-1][j1-1]=="0 ":
  88.                 #Si el punto en el que aplicamos la función click, es un 0
  89.                 #automáticamente se aplica click alrededor de ese punto.
  90.                 for a in [1,0,-1]:
  91.                     for b in [1,0,-1]:
  92.                         try:
  93.                             print((i1+a-1>-1 and j1+b-1 > 0))
  94.                             if (i1+a-1>-1 and j1+b-1 > 0):
  95.                                 campoShow=clic(campo,campoShow,i1+a,j1+b ,"n")
  96.                         except:
  97.                             pass
  98.         except:
  99.             print("¡Pon bien los datos!")
  100.             raw_input()
  101.     cls()
  102.     printmin(campo,i,j)
  103.     print(""" GANASTE!!!!""")
  104.     raw_input()
  105.     main()
  106.        
  107. def clic(campo,campoShow,i=1,j=1,mina="n"):
  108.     """Función que simula un click"""
  109.     i=int(i)-1
  110.     j=int(j)-1
  111.     if mina=="s":
  112.         campoShow[i][j]="*"
  113.     else:
  114.         if campo[i][j] == "*" or campo[i][j] =="* ":
  115.             cls()
  116.             print("BOOM!")
  117.             printmin(campo,len(campo),len(campo[0]))
  118.             raw_input()
  119.             main()
  120.         elif campoShow[i][j] != "0 ":
  121.             campoShow[i][j]=campo[i][j]
  122.             if campoShow[i][j]=="0 ":
  123.                 for a in [1,0,-1]:
  124.                     for b in [1,0,-1]:
  125.                         try:
  126.                             if (i+a>-1 and j+b > -1):
  127.                                 campoShow=clic(campo,campoShow,i+1+a,j+1+b ,"n")
  128.                         except:
  129.                             pass
  130.     return(campoShow)
  131.                
  132.                
  133. def printmin(campo,i,j):
  134.     """Función que imprime la matriz en un formato agradable para el usuario"""
  135.     campoprint=list(campo)
  136.     x=range(i+1)
  137.     for j in range(i+1):
  138.         x[j]=str(x[j])+" "
  139.     print "".join(x)
  140.     for p in range(len(campoprint)):
  141.         for t in range(len(campoprint[0])):
  142.             if len(str(campoprint[p][t])) == 1:
  143.                 campoprint[p][t]=str(campoprint[p][t])+" "
  144.         a=[]
  145.         print str(p+1)+ " " + "".join(campoprint[p])   
  146.        
  147. def main():
  148.     cls()
  149.     try:
  150.         MinSweep(int(raw_input("¿Columnas?: ")), int(raw_input("¿Filas?: ")), int(raw_input("¿Minas?: ")))
  151.     except:
  152.         print("Error al introducir los datos")
  153.         raw_input()
  154.         main()
  155.  
  156. main()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement