🎮 Как сделать сапера на Python: подробное руководство для начинающих 🐍

Как сделать сапера на Python?

Для создания игры "Сапер" на Python вам понадобится использовать графическую библиотеку Tkinter и некоторые алгоритмы.

Вот простой пример кода, который может вам помочь:

import random
from tkinter import Tk, Button, messagebox

class MinesweeperGame:
    def __init__(self, rows, columns, bombs):
        self.rows = rows
        self.columns = columns
        self.bombs = bombs
        self.flagged_bombs = 0
        self.unopened_cells = rows * columns
        self.field = [[0] * columns for _ in range(rows)]
        self.game_over = False

    def create_field(self):
        bombs_placed = 0
        while bombs_placed < self.bombs:
            x = random.randint(0, self.columns-1)
            y = random.randint(0, self.rows-1)
            if self.field[y][x] != -1:
                self.field[y][x] = -1
                bombs_placed += 1

    def count_nearby_bombs(self, x, y):
        if self.field[y][x] == -1:
            return -1

        count = 0
        for i in range(max(0, y-1), min(self.rows, y+2)):
            for j in range(max(0, x-1), min(self.columns, x+2)):
                if self.field[i][j] == -1:
                    count += 1
        return count

    def open_cell(self, x, y):
        if self.field[y][x] == -1:
            self.game_over = True
            messagebox.showinfo("Game Over", "Вы проиграли!")
            return

        count = self.count_nearby_bombs(x, y)
        self.field[y][x] = count
        self.unopened_cells -= 1

        if count == 0:
            for i in range(max(0, y-1), min(self.rows, y+2)):
                for j in range(max(0, x-1), min(self.columns, x+2)):
                    if self.field[i][j] == 0:
                        self.open_cell(j, i)

        if self.unopened_cells == self.bombs:
            self.game_over = True
            messagebox.showinfo("Game Over", "Вы выиграли!")

    def flag_cell(self, button):
        if self.game_over:
            return

        x, y = button.grid_info()["column"], button.grid_info()["row"]
        if self.field[y][x] == -1:
            self.flagged_bombs += 1
        button.config(text="🚩", state="disabled")

        if self.flagged_bombs == self.bombs:
            self.check_win_condition()

    def check_win_condition(self):
        for row in self.field:
            if -1 in row:
                return

        self.game_over = True
        messagebox.showinfo("Game Over", "Вы выиграли!")

def play_minesweeper(rows, columns, bombs):
    game = MinesweeperGame(rows, columns, bombs)
    game.create_field()

    window = Tk()
    window.title("Сапер")

    for i in range(rows):
        for j in range(columns):
            button = Button(window, width=3, command=lambda x=i, y=j: game.open_cell(x, y), bd=1, relief="raised")
            button.grid(row=i, column=j)

    window.mainloop()

# Пример использования:
play_minesweeper(10, 10, 10)

Вы можете изменять значения аргументов функции play_minesweeper для создания поля нужного размера и количества бомб.

Удачи в создании игры "Сапер" на Python!

Детальный ответ

Как сделать сапера на Python

Сапёр - классическая игра, где целью является открыть все клетки на игровом поле, не попав на мину. В этой статье я расскажу вам, как сделать свою собственную версию сапёра на языке программирования Python. Отлично, давайте начнем!

1. Создание игрового поля

Первым шагом является создание игрового поля для сапера. Мы можем использовать двумерный массив, чтобы представить каждую клетку на поле. В качестве значения каждой клетки мы можем использовать числа, где -1 представляет мину, а другие значения представляют количество мин вокруг клетки.


import random

def create_board(size, num_mines):
    board = [[0] * size for _ in range(size)]
    mines = 0
    
    while mines < num_mines:
        x = random.randint(0, size - 1)
        y = random.randint(0, size - 1)
        
        if board[x][y] != -1:
            board[x][y] = -1
            mines += 1
            
    return board
    

В функции create_board мы создаем пустое игровое поле, заполненное нулями. Затем мы случайным образом расставляем мины на поле и обновляем значения клеток.

2. Отображение игрового поля

Следующим шагом является отображение игрового поля. Мы можем использовать символы для представления состояний клеток. Например, символ "*" может представлять закрытую клетку, а символ "F" может представлять флаг, поставленный игроком.


def display_board(board):
    size = len(board)
    
    for i in range(size):
        for j in range(size):
            if board[i][j] == -1:
                print("*", end=" ")
            else:
                print(board[i][j], end=" ")
                
        print()
    

В функции display_board мы просто проходимся по каждой клетке на поле и выводим соответствующий символ или число.

3. Открытие клеток

Теперь мы должны добавить возможность открывать клетки на поле. Когда игрок открывает клетку, мы проверяем ее значение. Если это мина, игра завершается. Если это число, мы отображаем его. Если это ноль, то рекурсивно открываем все соседние клетки.


def open_cell(board, x, y):
    size = len(board)
    
    if x < 0 or x >= size or y < 0 or y >= size:
        return
    
    if board[x][y] == -1:
        return
    
    if board[x][y] != 0:
        board[x][y] = -2
        return
    
    board[x][y] = -2
    
    open_cell(board, x - 1, y)
    open_cell(board, x + 1, y)
    open_cell(board, x, y - 1)
    open_cell(board, x, y + 1)
    

В функции open_cell мы проверяем границы поля и значение клетки. Если клетка является миной, мы просто возвращаемся. Если значение клетки не является нулем, мы помечаем ее и заканчиваем рекурсию. Если значение равно нулю, мы помечаем клетку и рекурсивно вызываем open_cell для всех соседних клеток.

4. Игровой цикл

Наконец, добавим игровой цикл, который позволит игроку взаимодействовать с игровым полем. Мы будем запрашивать координаты клетки от игрока и выполнять соответствующее действие.


def play_game(size, num_mines):
    board = create_board(size, num_mines)
    
    while True:
        display_board(board)
        
        x = int(input("Введите координату x: "))
        y = int(input("Введите координату y: "))
        
        open_cell(board, x, y)
        
        if board[x][y] == -1:
            print("Вы проиграли!")
            break
            
        if all([all(cell != 0 for cell in row) for row in board]):
            print("Вы выиграли!")
            break
    

В функции play_game мы создаем игровое поле, а затем начинаем игровой цикл. Мы отображаем поле, запрашиваем координаты от игрока и открываем соответствующую клетку. Если игрок попадает на мину, игра завершается и выводится сообщение о проигрыше. Если все клетки открыты, игрок выигрывает и выводится сообщение о победе.

5. Запуск игры

Теперь, чтобы запустить игру, достаточно вызвать функцию play_game с желаемым размером поля и количеством мин:


size = 5
num_mines = 5

play_game(size, num_mines)
    

В этом примере мы создаем поле размером 5x5 с 5-ю минами. Вы можете изменить размер поля и количество мин в соответствии с вашими предпочтениями.

Видео по теме

Игра "Сапер" на Python, создаем игровое поле. Minesweeper in Python Tkinter

✅КАК СОЗДАТЬ "Игру сапёр"На Python🐍🐍🐍

Игра "Сапер" на Python, создаем класс MineSwepper. Minesweeper in Python Tkinter

Похожие статьи:

🔎 Как разбить текст на биграммы в Python: подробный гид и примеры кода

📚 Как прочитать текст в Python: легкий гид для начинающих

🔑 Как ввести массив в питоне в строку через пробел? Изучаем простой способ!

🎮 Как сделать сапера на Python: подробное руководство для начинающих 🐍

Как вызвать косинус в питоне и раскрыть его магическую силу?

👨‍💻 Как стать junior python разработчиком: 5 важных советов, которые нужно знать

Как правильно оформить процедуры в Python 🐍: подробное руководство для начинающих