利用Matlab制作一款刮刮樂抽獎特效
1.效果展示
程序運行效果如下:

如圖所示,按住鼠標(biāo)不松開并滑動鼠標(biāo),即可刮開圖層:

2.程序原理說明
2.1 獎項設(shè)置
獎項設(shè)置寫在一個cell元胞數(shù)組中,第一列為文本信息,第二列為抽到的概率:
strSet={'520元紅包一個',15/100;
'1314元紅包一個',5/100;
'黑絲水手服',20/100;
'黑絲女仆裝',20/100;
'抱抱×50次',20/100;
'親親×50次',20/100;};
probVal=cell2mat(strSet(:,2)); %提取第二列概率信息
2.2 隨機抽取
我們首先將離散型概率密度函數(shù)轉(zhuǎn)換為概率分布函數(shù):
% 將概率密度函數(shù)轉(zhuǎn)換為概率分布函數(shù)
for i=2:length(probVal)
probVal(i)=probVal(i)+probVal(i-1);
end
例如
概率密度和概率分布如下:
| 概率密度 | 概率分布 |
|---|---|
| 0.15 | 0.15 |
| 0.05 | 0.2 |
| 0.2 | 0.4 |
| 0.2 | 0.6 |
| 0.2 | 0.8 |
| 0.2 | 1 |
則若是我抽到的隨機數(shù)為0.7,0.7在概率分布第四個數(shù)和第五個數(shù)之間,我們就認為我們抽到的是第五個選項。該部分代碼如下:
randNum=rand(); numRange=probVal>randNum; strPos=find(numRange,1);
確定了是第幾個獎項就可以顯示字符串了,用text函數(shù)在坐標(biāo)區(qū)域進行顯示:
text(300,100,strSet{strPos,1},...
'HorizontalAlignment','center','FontSize',60)
2.3繪制圖層
使用image繪制一張顏色為灰色每個位置透明度都為1的圖片:
coverageMat_C=ones(200,600,3).*0.62; coverageMat_A=ones(200,600); coverageHdl=image([0 600],[0 200],coverageMat_C,... ? ? ? ? ? ? ? ? ? 'AlphaData',coverageMat_A);
2.4 滑動鼠標(biāo)刮獎
判斷鼠標(biāo)是否被點擊
假設(shè)我們當(dāng)前figure名為fig,以下設(shè)置是在fig的基礎(chǔ)上設(shè)置,首先我們要判定鼠標(biāo)是否被按住。因此我們設(shè)置一個名為isClicking,并設(shè)置鼠標(biāo)按下和鼠標(biāo)松開兩個回調(diào)函數(shù),當(dāng)鼠標(biāo)點擊時將isClicking設(shè)置為true,當(dāng)鼠標(biāo)松開時isClicking設(shè)置為false。
isClicking=false; set(fig,'WindowButtonDownFcn',@bt_down); function bt_down(~,~),isClicking=true;end set(fig,'WindowButtonUpFcn',@bt_up); function bt_up(~,~),isClicking=false;end
鼠標(biāo)滑動刮獎

該部分代碼:
[xMesh,yMesh]=meshgrid(1:600,1:200);
set(fig,'WindowButtonMotionFcn',@bt_move);
function bt_move(~,~)
if isClicking
mousePos=fig.CurrentPoint;
boolPos=sqrt((xMesh-mousePos(1)).^2+(yMesh-mousePos(2)).^2)<=15;
coverageMat_A(boolPos)=0;
set(coverageHdl,'AlphaData',coverageMat_A)
end
end
3.完整代碼
function scratchCard
strSet={'520元紅包一個',15/100;
'1314元紅包一個',5/100;
'黑絲水手服',20/100;
'黑絲女仆裝',20/100;
'抱抱×50次',20/100;
'親親×50次',20/100;};
probVal=cell2mat(strSet(:,2));
% 將概率密度函數(shù)轉(zhuǎn)換為概率分布函數(shù)
for i=2:length(probVal)
probVal(i)=probVal(i)+probVal(i-1);
end
fig=figure('units','pixels');
fig.Position=[300 80 600 200];
fig.NumberTitle='off';
fig.MenuBar='none';
fig.Resize='off';
fig.Name='刮刮樂';
ax=axes(fig);
ax.Position=[0 0 1 1];
ax.XTick=[];
ax.YTick=[];
ax.ZTick=[];
ax.XLim=[0 600];
ax.YLim=[0 200];
hold(ax,'on')
randNum=rand();
numRange=probVal>randNum;
strPos=find(numRange,1);
text(300,100,strSet{strPos,1},...
'HorizontalAlignment','center','FontSize',60)
coverageMat_C=ones(200,600,3).*0.62;
coverageMat_A=ones(200,600);
[xMesh,yMesh]=meshgrid(1:600,1:200);
coverageHdl=image([0 600],[0 200],coverageMat_C,...
'AlphaData',coverageMat_A);
isClicking=false;
set(fig,'WindowButtonDownFcn',@bt_down);
function bt_down(~,~),isClicking=true;end
set(fig,'WindowButtonUpFcn',@bt_up);
function bt_up(~,~),isClicking=false;end
set(fig,'WindowButtonMotionFcn',@bt_move);
function bt_move(~,~)
if isClicking
mousePos=fig.CurrentPoint;
boolPos=sqrt((xMesh-mousePos(1)).^2+(yMesh-mousePos(2)).^2)<=15;
coverageMat_A(boolPos)=0;
set(coverageHdl,'AlphaData',coverageMat_A)
end
end
end
到此這篇關(guān)于利用Matlab制作一款刮刮樂抽獎特效的文章就介紹到這了,更多相關(guān)Matlab刮刮樂抽獎特效內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Matlab實現(xiàn)黑洞優(yōu)化算法的示例代碼
根據(jù)黑洞現(xiàn)象原理首次提出BH 算法,它在傳統(tǒng)PSO基礎(chǔ)上引入了新的機制,有效地提高了收斂速度并防止了陷入局部極值的情況發(fā)生.本文將用Matlab實現(xiàn)這一算法,需要的可以參考一下2022-06-06
C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說明
這篇文章主要介紹了C++中sln,vcxproj,vcxproj.filters,lib,dll,exe的含義說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-05-05

