MATLAB的GUI小游戏—听歌识曲
这是我用MATLAB的GUI设计的第二个小游戏,基本功能和我之前的一篇博客类似,参见:MATLAB的GUI小游戏—你话我猜。最终效果如图所示:
这是主界面,当单击歌名类别文字左侧的按钮图标时,会跳转至子界面,如图所示:
整个游戏的玩法为:一共分为三个队,当其中一个队获得答题权时(可以和其他小游戏结合起来,比如三个队同时完成一个小游戏,当其中一个队最快完成时,即可答题。),可从5组歌曲类别列表中选择一项,每组歌曲的难度不同,相应的分值也不同。当完成选择时,进入子界面,点击开始,即播放歌曲的伴奏,同时倒计时开始,分值大于20的歌曲倒计时时长为25秒,其余为20秒。当倒计时停止时,停止播放歌曲,答对即可返回至主界面加上相应的分值,同时在曲库中删除该歌曲。进行多轮游戏,分数高者获胜。
本游戏和之前你话我猜的游戏基本类似,但在之前的基础上做了改进和补充。本篇博客只讲解改进和补充的地方。
一、设置界面窗口为可调窗口,并初始化为全屏
在GUI界面中,选择View->Property Inspector,在弹出的对话框中设置Resize为on,即可实现窗口的缩放。若想打开即全屏,则需要在回调函数OutputFcn()中添加代码:
function varargout = Games2_1_OutputFcn(hObject, eventdata, handles)
javaFrame = get(gcf,'JavaFrame');
set(javaFrame,'Maximized',1);
varargout{1} = handles.output;
二、倒计时的另一种显示方法
function Start_Callback(hObject, eventdata, handles)
global class1; global Song_Current;global Song_Select;global Song_Number;
global class1_i;global class1_Len;global Time_1;
Second=Time_1;
set(handles.Song_Name,'string',''); %清空歌曲名字
class1_i=class1_i+1;
if class1_i >0 && class1_i< class1_Len+1 %数组>0时,抽取曲库
Song_Number =class1_i;
Song_Select = class1(1);
class1(1)=[]; %已播放的歌曲删除记录
set(handles.Song_Number,'String',Song_Number); %显示歌曲编号
[Y,FS]=audioread(strcat(num2str(Song_Number),'.mp3')); %播放歌曲
Song_Current = audioplayer(Y,FS); %存储当前播放的歌曲
play(Song_Current); %播放当前的歌曲
end
if class1_i>=class1_Len+1 %数组=0,曲库中的歌曲已全部抽取
set(handles.Song_Number,'string','没有了哦~','fontsize',25);
end
while Second<=Time_1
if ishandle(handles.Second)
set(handles.Second,'string',num2str(Second));
end
pause(1);
Second=Second-1;
if Second==0
stop(Song_Current)
break
end
end
设置Second变量为倒计时的时长,当Second小于等于该时长时,程序暂停一秒,然后Second-1,当Second为0时,停止播放歌曲。
此外要实现每次点击相同的歌曲类别都不能出现之前播放的歌曲,需要删除之前的歌曲。在程序中增加class1(1)=[];,即将选择过的歌曲数组元素删除。
三、主界面的分数统计
function Team1_10_Callback(hObject, eventdata, handles)
global Team1_Score;
Team1_Score=Team1_Score+10;
set(handles.Team1_Score,'string',Team1_Score);
function Team1_15_Callback(hObject, eventdata, handles)
global Team1_Score;
Team1_Score=Team1_Score+15;
set(handles.Team1_Score,'string',Team1_Score);
function Team1_20_Callback(hObject, eventdata, handles)
global Team1_Score;
Team1_Score=Team1_Score+20;
set(handles.Team1_Score,'string',Team1_Score);
设置Score为全局变量,当点击该按钮时,即加上相应的分值,并显示。
四、总结
最终的效果为:
代码共享在这里,听歌识曲。还望各位大佬指点改进。
下一篇: MATLAB的GUI小游戏—你话我猜