1 usuario conectado

Buscaminas textual. Juego en Python

Comparte esto
Python
 
import random

def crear_tablero(filas, columnas, minas):
    tablero = [['-' for _ in range(columnas)] for _ in range(filas)]
    minas_colocadas = 0
    while minas_colocadas < minas:
        fila_aleatoria = random.randint(0, filas - 1)
        columna_aleatoria = random.randint(0, columnas - 1)
        if tablero[fila_aleatoria][columna_aleatoria] != '*':
            tablero[fila_aleatoria][columna_aleatoria] = '*'
            minas_colocadas += 1
    return tablero

def calcular_minas_adyacentes(tablero, fila, columna):
    minas_cerca = 0
    filas = len(tablero)
    columnas = len(tablero[0])
    for i in range(max(0, fila - 1), min(filas, fila + 2)):
        for j in range(max(0, columna - 1), min(columnas, columna + 2)):
            if tablero[i][j] == '*':
                minas_cerca += 1
    return minas_cerca

def revelar_casilla(tablero_oculto, tablero_minas, fila, columna):
    filas = len(tablero_minas)
    columnas = len(tablero_minas[0])
    if not (0 <= fila < filas and 0 <= columna < columnas) or tablero_oculto[fila][columna] != '-':
        return False
    if tablero_minas[fila][columna] == '*':
        tablero_oculto[fila][columna] = '*'
        return True
    else:
        minas_adyacentes = calcular_minas_adyacentes(tablero_minas, fila, columna)
        tablero_oculto[fila][columna] = str(minas_adyacentes)
        if minas_adyacentes == 0:
            for i in range(max(0, fila - 1), min(filas, fila + 2)):
                for j in range(max(0, columna - 1), min(columnas, columna + 2)):
                    revelar_casilla(tablero_oculto, tablero_minas, i, j)
        return False

def mostrar_tablero_oculto(tablero):
    for fila in tablero:
        print(' '.join(fila))

def jugar_buscaminas():
    filas = 10
    columnas = 10
    minas = 15
    tablero_minas = crear_tablero(filas, columnas, minas)
    tablero_oculto = [['-' for _ in range(columnas)] for _ in range(filas)]
    juego_terminado = False

    print("¡Bienvenido al Buscaminas Textual!")
    print(f"Tablero: {filas}x{columnas}, Minas: {minas}")
    mostrar_tablero_oculto(tablero_oculto)

    while not juego_terminado:
        try:
            fila_seleccionada = int(input("Introduce la fila (0-{}): ".format(filas - 1)))
            columna_seleccionada = int(input("Introduce la columna (0-{}): ".format(columnas - 1)))

            if not (0 <= fila_seleccionada < filas and 0 <= columna_seleccionada < columnas):
                print("¡Coordenadas fuera de rango!")
                continue

            if tablero_oculto[fila_seleccionada][columna_seleccionada] != '-':
                print("¡Casilla ya revelada!")
                continue

            if revelar_casilla(tablero_oculto, tablero_minas, fila_seleccionada, columna_seleccionada):
                print("¡BOOM! ¡Has pisado una mina! ¡Fin del juego!")
                juego_terminado = True
            else:
                mostrar_tablero_oculto(tablero_oculto)
                minas_restantes = minas
                casillas_sin_mina = 0
                for r in range(filas):
                    for c in range(columnas):
                        if tablero_oculto[r][c] == '-':
                            casillas_sin_mina += 1
                if casillas_sin_mina == 0:
                    print("¡Felicidades! ¡Has despejado todas las casillas sin minas!")
                    juego_terminado = True

        except ValueError:
            print("¡Entrada inválida! Introduce números enteros para fila y columna.")
        except IndexError:
            print("¡Coordenadas fuera de rango!")

    print("\nTablero con minas:")
    mostrar_tablero_oculto(tablero_minas) # Revela la ubicación de las minas al final

if __name__ == "__main__":
    jugar_buscaminas()

¿Cómo funciona el código?

  1. crear_tablero(filas, columnas, minas): Crea un tablero 2D lleno de '-', y luego coloca aleatoriamente el número especificado de minas ('*').
  2. calcular_minas_adyacentes(tablero, fila, columna): Cuenta el número de minas que son adyacentes a una casilla dada.
  3. revelar_casilla(tablero_oculto, tablero_minas, fila, columna):
    • Si la casilla ya está revelada o fuera de los límites, no hace nada.
    • Si la casilla contiene una mina en tablero_minas, revela la mina en tablero_oculto y devuelve True (juego terminado).
    • Si no es una mina, calcula el número de minas adyacentes y lo muestra en tablero_oculto.
    • Si no hay minas adyacentes, revela recursivamente las casillas vecinas.
  4. mostrar_tablero_oculto(tablero): Muestra el estado actual del tablero oculto al jugador.
  5. jugar_buscaminas(): La función principal del juego:
    • Define las dimensiones del tablero y el número de minas.
    • Crea el tablero de minas y el tablero oculto.
    • Pide al jugador que introduzca las coordenadas de la casilla que desea revelar.
    • Valida la entrada del jugador.
    • Llama a revelar_casilla() para intentar revelar la casilla.
    • Comprueba si el jugador ha pisado una mina o ha despejado todas las casillas sin minas.
    • Termina el juego cuando se gana o se pierde.
    • Al final, revela la ubicación de todas las minas.

Cómo jugar:

  1. Guarda este código en un archivo con extensión .py (por ejemplo, buscaminas_textual.py).
  2. Abre una terminal o símbolo del sistema.
  3. Navega al directorio donde guardaste el archivo.
  4. Ejecuta el script con el comando: python buscaminas_textual.py
  5. Introduce las coordenadas de fila y columna para revelar las casillas. El objetivo es revelar todas las casillas que no contienen minas sin pisar ninguna. Los números indican cuántas minas hay adyacentes a esa casilla.