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为全局变量,当点击该按钮时,即加上相应的分值,并显示。

四、总结

  最终的效果为:
  最终效果
  代码共享在这里,听歌识曲。还望各位大佬指点改进。

猜你喜欢

转载自blog.csdn.net/qq_22820121/article/details/81053881