Python 扫雷游戏 完整源代码+图片素材

代码的下载地址
截图
初始化

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

  1. 设计需求

基础功能
实现windows扫雷游戏初级的所有功能
扫雷尺寸99 方格 每个方格尺寸3030
游戏初始化时,随机分布10个地雷
当左键点击雷区任意方格时,则游戏开始
鼠标左键点击为翻开方格,为雷则游戏失败,非雷则显示其周围一圈地雷的数量(0-8)
鼠标右键单击标记为旗帜,此时左键单击无效。
鼠标右键再次单击标记为旗帜的方格,则标记转为问号,表明疑问,此时左键单击有效。
第一步 默认不能踩雷 (如果是雷,强制重新随机分布直至为非雷)

点开一片区域
当左键点击方格时,如果为非雷且其周围一圈的地雷数量为0,则自动翻开其周围一圈的方格,再检测是否还存在数量为0的方格,如有则继续翻开其周围一圈方格,直至没有数量为0的方格为止。(视觉效果上相当于点开一片区域)

当鼠标左键和右键同时单击一块方格时:
1) 未翻开方格点击无效
2) 已翻开方格,获取方格的数字(1-8),然后检测其周围8个方格中
剩余未翻开方格 == 当前方格数字,则自动标记为旗帜
剩余未翻开方格 > 当前方格数字,无动作
剩余未翻开方格中已标记旗帜数量 == 当前方格数字,则自动翻开其它剩余未翻开方格,如果有雷则游戏失败
剩余未翻开方格中已标记旗帜数量 != 当前方格数字,无动作

其它功能
计时器:方格第一步左键翻开之后即开始计时,直至游戏结束(成功或失败)
雷数:每标记一个旗帜则雷数减1,雷数允许为负值
游戏状态:游戏开始为normal脸,游戏成功为smile脸,游戏失败为cry脸。任意时刻点击任意状态的脸都将重置游戏

游戏失败判定:左键翻开方格为雷或者左键右键同时点击自动翻开未翻开方格时有雷则判定游戏失败
游戏成功判定:正确使用旗帜标记出所有地雷,且雷数显示为0(即没有多标旗帜)

  1. 主要功能模块实现思路

1) 如何检测鼠标左键和右键同时按下
设置鼠标每个键(左键,右键,滚轮)的状态位,检测其按下和松开两个状态
当鼠标左键按下且未松开时,检测到右键按下时,则认为两键同时按下
反之同理

2)随机雷分布
通过列表生成式生成二维数组,表示地雷分布的row和line值。
随机生成的二维数组可能存在重复值,所以需要先将列表转换为tuple,再通过set去重
去重后数组可能小于10,所以为简化操作,一开始生成12组数值,如果去重后小于10则重复生成直到生成的去重数组大于10为止。
实际只取前10组数据。
参考代码如下:

#生成大于10个不重复的二维数组,如果数组长度小于10则再次生成直到数组长度大于10为止
num = 0
while num <10:
	random_number_0 = [[random.randint(0,8) for i in range(2)] for j in range(12)]
	#将列表转换为tuple,再通过set去重复数据
	random_number = list(set([tuple(t) for t in random_number_0]))
	num = len(random_number)

3)点开一片区域
利用 递归函数
先获取周围方格的坐标,然后计算周围方格的地雷数量,不为0则显示相应的数字,为0的话,则调用递归函数,继续计算。直至没有数量为0的方格为止

4)左右键同时按下的操作

未翻开方格点击无效
已翻开方格,获取方格的数字(1-8),然后检测其周围8个方格中

  • 剩余未翻开方格 == 当前方格数字,则自动标记为旗帜

  • 剩余未翻开方格 > 当前方格数字,无动作

  • 剩余未翻开方格中已标记旗帜数量 == 当前方格数字,则自动翻开其它剩余未翻开方格,如果有雷则游戏失败

  • 剩余未翻开方格中已标记旗帜数量 != 当前方格数字,无动作

5)第一步就是雷的情况
如果第一次左键单击的方格就是雷,则强制重新执行随机雷分布,并不断检测点击的方格是否仍有地雷,如果还是有雷,则反复执行,直到该点击方格无雷为止

代码的下载地址

  • 6
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
以下是一个简单的扫雷Python小游戏的源代码示例: ```python import random import tkinter as tk GRID_LEN = 10 SIZE = 400 BLOCK_WIDTH = BLOCK_HEIGHT = SIZE // GRID_LEN MINE_COUNT = 99 mine_map = [[random.randint(0, 1) for _ in range(GRID_LEN)] for _ in range(GRID_LEN)] def get_adjacent_mines(game_map, row, col): count = 0 for i in range(max(0, row-1), min(row+2, GRID_LEN)): for j in range(max(0, col-1), min(col+2, GRID_LEN)): if game_map[i][j == 1: count += 1 return count def on_block_click(event): row = int(event.y / (SIZE/GRID_LEN)) col = int(event.x / (SIZE/GRID_LEN)) if mine_map[row][col == 1: canvas.create_text(event.x, event.y, text=str(get_adjacent_mines(mine_map, row, col)), font=("Arial", 20), tags="text") else: # 如果周围没有雷的情况 pass root = tk.Tk() canvas = tk.Canvas(root, width=SIZE, height=SIZE) canvas.pack() for i in range(GRID_LEN): for j in range(GRID_LEN): canvas.create_rectangle(j*BLOCK_WIDTH, i*BLOCK_HEIGHT, (j+1)*BLOCK_WIDTH, (i+1)*BLOCK_HEIGHT, fill="gray") canvas.tag_bind("block", "<Button-1>", on_block_click) root.mainloop() ``` 这个示例代码使用了tkinter库来创建一个简单的扫雷游戏界面。游戏中的方块由灰色矩形表示,点击方块后会根据周围雷数显示相应的数字。该代码使用了随机数生成雷的位置,并根据点击方块的位置判断是否显示数字。你可以根据需要对代码进行修改和扩展来实现更完整扫雷游戏功能。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *3* [Python扫雷游戏代码](https://blog.csdn.net/weixin_42591413/article/details/129491148)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] - *2* [Python游戏:扫雷 (附源码)](https://blog.csdn.net/ZGR_YJJ/article/details/126269701)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT0_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值