0效果展示
程式運行效果如下:

如圖所示,按住滑鼠不松開并滑動滑鼠,即可刮開圖層:

1程式原理說明
1.1 獎項設定
獎項設定寫在一個cell元胞陣列中,第一列為文本資訊,第二列為抽到的概率:
strSet={'520元紅包一個',15/100;
'1314元紅包一個',5/100;
'黑絲水手服',20/100;
'黑絲女仆裝',20/100;
'抱抱×50次',20/100;
'親親×50次',20/100;};
probVal=cell2mat(strSet(:,2)); %提取第二列概率資訊
1.2 隨機抽取
我們首先將離散型概率密度函式轉換為概率分布函式:
% 將概率密度函式轉換為概率分布函式
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 |
則若是我抽到的亂數為0.7,0.7在概率分布第四個數和第五個數之間,我們就認為我們抽到的是第五個選項,該部分代碼如下:
randNum=rand();
numRange=probVal>randNum;
strPos=find(numRange,1);
確定了是第幾個獎項就可以顯示字串了,用text函式在坐標區域進行顯示:
text(300,100,strSet{strPos,1},...
'HorizontalAlignment','center','FontSize',60)
1.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);
1.4 滑動滑鼠刮獎
判斷滑鼠是否被點擊
假設我們當前figure名為fig,以下設定是在fig的基礎上設定,首先我們要判定滑鼠是否被按住,因此我們設定一個名為isClicking,并設定滑鼠按下和滑鼠松開兩個回呼函式,當滑鼠點擊時將isClicking設定為true,當滑鼠松開時isClicking設定為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
滑鼠滑動刮獎
該部分代碼:
[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
2完整代碼
function scratchCard
strSet={'520元紅包一個',15/100;
'1314元紅包一個',5/100;
'黑絲水手服',20/100;
'黑絲女仆裝',20/100;
'抱抱×50次',20/100;
'親親×50次',20/100;};
probVal=cell2mat(strSet(:,2));
% 將概率密度函式轉換為概率分布函式
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
各個獎項和概率都可以自己設定,還不快來試試?
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/293780.html
標籤:其他
