0
点赞
收藏
分享

微信扫一扫

Python实现扫雷游戏(附带源码)

pipu 2024-03-21 阅读 14

需求:

  • 玩家可以选择游戏难度,即雷区大小和地雷数量。
  • 玩家可以通过点击格子来打开格子,如果格子上有地雷,则游戏结束;如果格子没有地雷,则显示周围八个格子的地雷数。
  • 玩家可以通过右键标记地雷,如果标记正确,则该格子会显示为红色。
  • 玩家可以通过双击打开周围八个格子,如果周围八个格子都没有地雷,则会自动打开所有安全格子。

代码示例:

Python

import random

class Minesweeper():

    def __init__(self, width, height, mines):
        """初始化游戏

        Args:
            width: 雷区宽度
            height: 雷区高度
            mines: 地雷数量

        Returns:
            None
        """

        self.width = width
        self.height = height
        self.mines = mines

        # 初始化雷区
        self.board = [[0 for _ in range(width)] for _ in range(height)]

        # 布雷
        self.plant_mines()

        # 初始化游戏状态
        self.game_over = False
        self.win = False

    def plant_mines(self):
        """布雷

        Args:
            None

        Returns:
            None
        """

        # 随机生成地雷位置
        mine_positions = random.sample([(i, j) for i in range(self.height) for j in range(self.width)], self.mines)

        # 将地雷位置标记为 1
        for i, j in mine_positions:
            self.board[i][j] = 1

    def open_cell(self, i, j):
        """打开格子

        Args:
            i: 格子的行号
            j: 格子的列号

        Returns:
            None
        """

        # 如果游戏结束,则不执行任何操作
        if self.game_over or self.win:
            return

        # 如果格子已经被打开,则不执行任何操作
        if self.board[i][j] != 0:
            return

        # 如果格子是地雷,则游戏结束
        if self.board[i][j] == 1:
            self.game_over = True
            print("游戏结束!")
            return

        # 递归打开周围八个格子
        self.open_around_cells(i, j)

        # 判断是否胜利
        if self.check_win():
            self.win = True
            print("恭喜你,你赢了!")

    def open_around_cells(self, i, j):
        """递归打开周围八个格子

        Args:
            i: 格子的行号
            j: 格子的列号

        Returns:
            None
        """

        # 遍历周围八个格子
        for di in range(-1, 2):
            for dj in range(-1, 2):
                # 判断格子是否越界
                if 0 <= i + di < self.height and 0 <= j + dj < self.width:
                    # 如果格子没有被打开,则递归打开
                    if self.board[i + di][j + dj] == 0:
                        self.board[i + di][j + dj] = -1
                        self.open_around_cells(i + di, j + dj)

    def check_win(self):
        """判断是否胜利

        Args:
            None

        Returns:
            True if win, False otherwise
        """

        # 遍历所有格子
        for i in range(self.height):
            for j in range(self.width):
                # 如果格子是地雷,且没有被标记,则游戏未结束
                if self.board[i][j] == 1 and not self.is_cell_flagged(i, j):
                    return False

        # 所有格子都已打开或标记,则游戏胜利
        return True

    def is_cell_flagged(self, i, j):
        """判断格子是否被标记

        Args:
            i: 格子的行号
            j: 格子的列号

        Returns:
            True if flagged, False otherwise
        """

        # TODO: 实现格子标记功能

        return False

    def print_board(self):
        """打印雷区

        Args:
            None

        Returns:
            None
        """

        for i
举报

相关推荐

0 条评论