MATLAB製作GUI—掃雷遊戲的實現(完整版)

這幾天做實驗好累,今天終於有時間來繼續做自己的掃雷小遊戲了,經過一番調試,終於完成了自己地掃雷小遊戲。

下面是掃雷小遊戲的最終版:

這是我自己實現的第一個小遊戲,在整個過程中,遇到了一些問題,不過最終還是解決了,自己也感覺收穫滿滿 。下面我將自己實現的代碼貼出來供大家學習:

主函數:

function SaoLeiGaming(tmp)

%This is the SaoLei game,that we used to played in our childhood.
%Author:等等登登-ande
%Email:[email protected]

global NumButton Plusboom HBOX data

if nargin==0
    tmp = 'inital';
    NumButton = 6;
end
switch(tmp)
    case 'inital'
        fullsizescreen = get(0,'ScreenSize');%獲取屏幕的大小以及右下角座標
        H = figure('name','掃雷_zd',...
            'position',[fullsizescreen(3)/3,fullsizescreen(4)/3,80+35*NumButton,80+35*NumButton],...
            'Menubar','none');%創建函數句柄H
        menu1 = uimenu(H,'Text','&Game');%在H函數句柄上創建菜單Game
        uimenu(menu1,'Text','&NewGame','Accelerator','M',...
            'CallBack',[mfilename,'(''quit'');',mfilename]);%在菜單Game下創建子菜單NewGame
        uimenu(menu1,'Text','&Quit','Accelerator','Q',...
            'CallBack',[mfilename,'(''quit'')']);%在菜單Game下創建子菜單Quit
        HBOX = zeros(NumButton);
        for i = 1:NumButton
            for j = 1:NumButton
                HBOX(i,j) = uicontrol(H,'Style','pushbutton',...
                    'FontWeight','bold','FontSize',10,...
                    'position',[40+35*(i-1),40+35*(NumButton-j),35,35],...
                    'tag',num2str([j,i]),...
                    'tooltipstring','This is not boom!',...
                    'ButtondownFcn','RightKey',...
                    'CallBack','LeftKey');%創建NumBotton*NumBotton個格子
            end 
        end
    case 'quit'
        closereq
end
%設置炸彈
boom = zeros(NumButton);
%每行隨機設置一個炸彈
for i = 1:NumButton
    boom(randi(NumButton),i)=1;
end 
%對數據進行擴展
Plusboom = zeros(NumButton+2,NumButton+2);
Plusboom(2:end-1,2:end-1) = boom;

左鍵觸發函數:

function LeftKey
%左鍵觸發函數

global Plusboom HBOX NumButton cdata

cdata = readdata;
[labelx,labely] = find(Plusboom == 1);
pos = get(gco,'tag');
posx = str2double(pos(1))+1;
posy = str2double(pos(4))+1;
All_posx = [posx-1,posx,posx+1];
All_posy = [posy-1,posy,posy+1];

label = [labelx,labely];
length_label = length(label);
pox = [posx,posy];
Judge = ismember(label,pox,'row');
Judge_one = find(Judge==1);
if length(Judge_one)==0
    All_boom=sum(sum(Plusboom(All_posx,All_posy)));%注意這裏的x,y代表的行列,容易搞錯。
    if All_boom == 0
    [pox1 poy1]=findzeros(posy-1,posx-1);
    for j=1:length(pox1-1)
        set(HBOX(poy1(j),pox1(j)),'string','.','Fontsize',15,'foregroundcolor','b');
    end
    elseif All_boom == 1
        set(gco,'String',num2str(All_boom),'FontSize',15,'foregroundcolor','r');
    elseif All_boom == 2
        set(gco,'string',num2str(All_boom),'FontSize',15,'foregroundcolor','b');
    elseif All_boom == 3
        set(gco,'string',num2str(All_boom),'Fontsize',15,'foregroundcolor','k');
    else
        set(gco,'string',num2str(All_boom),'Fontsize',15,'foregroundcolor','g');
    end
else
    for i = 1:NumButton
    set(HBOX (labely(i)-1,labelx(i)-1), 'cdata' ,cdata);
    end
end

右鍵觸發函數:

function RightKey
%右鍵觸發函數
content = get(gco,'String');
if(isempty(content))
    set(gco,'String','L');
elseif(isequal(content,'L'))
    set(gco,'String','?');
elseif(isequal(content,'?'))
    set(gco,'String','');
end

尋零函數:

function [pox poy]=findzeros(x,y)

%當格子周圍地雷爲0時,尋找周圍同樣地雷數爲0的格子
global Plusboom
Kernel = ones(3);
boom = Plusboom(2:end-1,2:end-1);
map = conv2(boom,Kernel);
Fmap = map(2:end-1,2:end-1);

Boundariy = bwboundaries(~Fmap,4);
label = 0;
length1 = length(Boundariy);
for i=1:length1
    tmp = Boundariy{i};
    for j=1:length(tmp)
        if (tmp(j,1)==y && tmp(j,2)==x)
            label = i;
            break
        end
    end
end
if label~=0
    P = Boundariy{label};
    pox = P(:,1);
    poy = P(:,2);
else
    pox = [];
    poy = [];
end

數據讀取函數:

function cdata = readdata
%讀取地雷圖片
pic = imread('地雷.jpg');
cdata = imresize(pic,0.03);

希望大家也可以實現自己的掃雷小遊戲~

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章