這幾天做實驗好累,今天終於有時間來繼續做自己的掃雷小遊戲了,經過一番調試,終於完成了自己地掃雷小遊戲。
下面是掃雷小遊戲的最終版:
這是我自己實現的第一個小遊戲,在整個過程中,遇到了一些問題,不過最終還是解決了,自己也感覺收穫滿滿 。下面我將自己實現的代碼貼出來供大家學習:
主函數:
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);
希望大家也可以實現自己的掃雷小遊戲~