当前位置: 首页 > news >正文

matlab扫雷小游戏

游戏逻辑与 Windows 经典扫雷一致:左键翻开、右键插旗/取消插旗,自动递归展开空白区域,实时显示剩余雷数。
(界面基于 uifigure + uigridlayout,MATLAB R2019b 及以上版本可直接运行;旧版可用 figure+uicontrol 的兼容版本见文末)


一、运行方式

minesweeper(9,9,10);   % 9×9、10颗雷

二、完整源码

function minesweeper(m,n,k)
% m 行、n 列、共 k 颗雷
%
% 用法示例:
%   minesweeper(9,9,10)      % 初级
%   minesweeper(16,16,40)    % 中级
%   minesweeper(16,30,99)    % 高级% ---------- 1. 参数初始化 ----------
if nargin<3, k=floor(m*n*0.15); end   % 默认15%雷
if k>m*n-9,  error('雷数太多!'); end
rng('shuffle');% 逻辑矩阵: -1 表示雷,>=0 表示周围雷数
board = zeros(m,n);
mineIdx = randperm(m*n,k);
board(mineIdx) = -1;% 计算每个非雷格子的周围雷数
for i = 1:mfor j = 1:nif board(i,j) ~= -1ii = max(i-1,1):min(i+1,m);jj = max(j-1,1):min(j+1,n);board(i,j) = sum(board(ii,jj)==-1);endend
end% 状态矩阵:0=未翻开,1=已翻开,2=插旗
state = zeros(m,n);
gameOver = false;
win      = false;% ---------- 2. GUI ----------
fig = uifigure('Name','MATLAB 扫雷','Resize','off', ...'Position',[500 300 35*n+25 35*m+80]);
uigrid = uigridlayout(fig,[m+1 n],'RowSpacing',1,'ColumnSpacing',1);
uigrid.RowHeight    = repmat({'1x'},m,1);
uigrid.ColumnWidth  = repmat({'1x'},n,1);% 顶部信息
lbFlag = uilabel(fig,'Position',[10 35*m+30 150 25],'FontSize',12);
lbFlag.Text = sprintf('剩余雷数: %d',k);% 按钮网格
btn = gobjects(m,n);
for i = 1:mfor j = 1:nbtn(i,j) = uibutton(uigrid,'Text',' ','FontWeight','bold', ...'BackgroundColor',[.9 .9 .9], ...'FontSize',10,'Tag',[num2str(i),'-',num2str(j)]);btn(i,j).ButtonPushedFcn = @(src,evt) leftClick(src);btn(i,j).ContextMenu = contextMenuCreate(btn(i,j));end
end% ---------- 3. 事件函数 ----------function leftClick(src)if gameOver || win, return; end[i,j] = strtok(src.Tag,'-');i = str2double(i); j = str2double(j(2:end));if state(i,j)==2, return; end   % 插旗格不响应左键reveal(i,j);checkWin;endfunction rightClick(src,~)if gameOver || win, return; end[i,j] = strtok(src.Tag,'-');i = str2double(i); j = str2double(j(2:end));if state(i,j)==1, return; end   % 已翻开不能插旗if state(i,j)==0          % 未翻开→插旗state(i,j)=2;src.Text = '⚑';src.BackgroundColor = [1 .6 .6];elseif state(i,j)==2      % 插旗→取消state(i,j)=0;src.Text = ' ';src.BackgroundColor = [.9 .9 .9];endlbFlag.Text = sprintf('剩余雷数: %d',k-sum(state==2,'all'));endfunction reveal(i,j)if i<1 || i>m || j<1 || j>n || state(i,j)==1, return; endstate(i,j)=1;if board(i,j)==-1           % 踩到雷showAllMines;uialert(fig,'BOOM! 你踩到雷了','游戏结束');gameOver = true;return;end% 更新按钮文字和颜色btn(i,j).Text = num2str(board(i,j));btn(i,j).BackgroundColor = [1 1 1];if board(i,j)==0btn(i,j).Text = ' ';% 递归展开空白for di = -1:1, for dj = -1:1reveal(i+di,j+dj);end, endendendfunction showAllMinesfor i = 1:mfor j = 1:nif board(i,j)==-1btn(i,j).Text = '💣';btn(i,j).BackgroundColor = [1 0 0];endendendendfunction checkWinif gameOver, return; endif all(state(board~=-1)==1)      % 所有非雷已翻开win = true;uialert(fig,'恭喜你,扫雷成功!','胜利');endendfunction cMenu = contextMenuCreate(btnObj)cMenu = uicontextmenu(fig);uimenu(cMenu,'Text','插旗/取消','Separator','on', ...'MenuSelectedFcn', @(src,evt) rightClick(btnObj,src));end
end

三、旧版 MATLAB 兼容版(无 uifigure

如果 MATLAB 版本 < R2019b,用传统 figure + uicontrol 实现,可替换“GUI”段为(其余逻辑不变):

fig = figure('Name','MATLAB 扫雷','NumberTitle','off','MenuBar','none', ...'Resize','off','Position',[500 300 35*n+25 35*m+45]);
btn = zeros(m,n);
for i = 1:mfor j = 1:nh = uicontrol('Style','pushbutton','String',' ','Units','pixels', ...'Position',[35*(j-1)+5 35*(m-i)+5 30 30], ...'FontWeight','bold','FontSize',10, ...'Callback',{@leftClick,i,j});btn(i,j) = h;end
end
% 其余回调函数需对应改为处理句柄,逻辑完全一致,这里略。

参考代码 matlab扫雷小游戏 www.youwenfan.com/contentcsf/22784.html

四、扩展玩法

  1. 计时器:使用 timer 对象记录用时并在标题栏实时刷新。
  2. 难度选择:在 uifigure 顶部加 uidropdown 供用户选初级/中级/高级。
  3. 自定义雷区:加两个 uieditfield 输入行列与雷数,点击“开始”后动态创建按钮。
  4. AI 自动扫雷:把已翻开格子的数字与周围未知格关系建模为约束满足问题,用 MATLAB 的 intlinprog 或逻辑求解器推断必开/必旗格。
http://www.dtcms.com/a/361864.html

相关文章:

  • 计算机组成原理易混知识点
  • Python3环境搭建教程 - 使用Conda工具
  • Chrome 如何清除浏览器缓存
  • MinerU环境部署
  • (Arxiv-2025)HunyuanCustom:一种面向多模态驱动的定制化视频生成架构
  • Cesium 加载桥梁3DTiles数据时,出现部分区域发暗、部分正常的现象
  • 汽车曲柄连杆机构cad+ea113+设计说明书
  • 零跑汽车8月交付57066台,同比增长超88%
  • 微算法科技(NASDAQ:MLGO)张量网络与机器学习融合,MPS分类器助力顶夸克信号识别
  • 后端Web实战-多表操作员工列表查询
  • Java基础第8天总结(map遍历、Stream流)
  • ES6新特性:JavaScript的进化装备箱[特殊字符]
  • 「日拱一码」076 深度学习——自然语言处理NLP
  • vue动态(自适应定位)表格
  • ansible临时命令实验题
  • 自动化运维-ansible中的管理机密
  • Ansible之playbook剧本
  • Docker镜像安全守护神HarborGuard
  • Shell编程入门指南
  • apollo学习之纳什均衡求解最优策略
  • MySQL 中 InnoDB 引擎的事务隔离级别与“可重复读”隔离级别下的 SQL 编写规范
  • 2025 中国算力大会精彩回顾:算力驱动未来,液冷引领革新
  • 从 Oracle 到 TiDB,通过ETL工具,高效实现数据拉通
  • HarvardX TinyML小笔记2(番外3:数据工程)(TODO)
  • 【C++游记】AVL树
  • 通过 select into outfile / load data infile 进行数据导入导出学习笔记
  • 【网络安全入门基础教程】网络安全就业方向(非常详细)零基础入门到精通,收藏这篇就够了
  • three.js+WebGL踩坑经验合集(10.2):镜像问题又一坑——THREE.InstancedMesh的正反面向光问题
  • 亥姆霍兹线圈和放载流线圈
  • 【SpreadJS V18.2 新特性】Table 与 DataTable 双向转换功能详解