当前位置:主页 > 软件编程 > C代码 >

Matlab实现别踩白块小游戏的示例代码

时间:2023-02-10 10:12:59 | 栏目:C代码 | 点击:

游戏效果

游戏说明

‘A’,‘S’,‘D’,F’按键代表四条通路(点击S开始),按错按钮或黑块接触底限均为失败。

完整代码

分两个m文件,应放在同一文件夹

pianoKeys.m(主函数)

function pianoKeys
%======================%========
[v1,notes,fs]=getMusic;%读取音乐
%======================%========

fig=uifigure;
fig.Position=[10 50 4*90 4*150];
fig.NumberTitle='off';
fig.MenuBar='none';
fig.Resize='off';
fig.Name='pianoKeys';

ax=uiaxes(fig);
ax.Position=[-22 -15 4*90+36 4*150+40];
ax.XLim=[0 4*90];
ax.YLim=[0 4*150];
ax.XColor=[0 0 0];
ax.YColor=[0 0 0];
ax.Box='on';
ax.XTick=0:90:360;
ax.YTick=[0 600];
ax.XGrid='on';
ax.GridColor=[0 0 0];
ax.GridAlpha=1;
ax.Toolbar.Visible='off';

%==========================================================================

blockList(1)=drawBlock(changeData(1),0,{'开始';'游戏'},v1{1});
noDeleteList=1:4;
newBlockY=600;
newBlockNum=5;
startFlag=0;
gameOver=0;
for i=2:4
    x=changeData(i);
    blockList(i)=drawBlock(x,(i-1)*150,'',v1{i});
end


%==========================================================================
set(fig,'KeyPressFcn',@keyPressFcn) 
%==========================================================================
fps=10;
PKtimer=timer('ExecutionMode', 'fixedRate', 'Period',1/fps, 'TimerFcn', @pianoGame);
start(PKtimer)
%==========================================================================

function pianoGame(~,~)
    if startFlag
        if newBlockY<=600&&newBlockNum<=length(v1)
            tempX=changeData(newBlockNum);
            blockList(newBlockNum)=drawBlock(tempX,newBlockY,'',v1{newBlockNum});
            noDeleteList=[noDeleteList,newBlockNum];
            newBlockNum=newBlockNum+1;
            newBlockY=newBlockY+150;
        end
        for ii=noDeleteList
            blockList(ii).Position(2)=blockList(ii).Position(2)-150/8;
        end
        newBlockY=newBlockY-150/8;
        if (~isempty(noDeleteList))&&blockList(noDeleteList(1)).Position(2)<-10
            gameOverFcn(1);
            gameOver=1;
            %tempStr=blockList(noDeleteList(1)).UserData;
            %sound(notes.(tempStr),fs)
            %delete(blockList(noDeleteList(1)))
            %noDeleteList(1)=[];
        end
    end
end

    function gameOverFcn(coe)
        sound([notes.do0f,notes.do1f,notes.do2f,notes.do2f],fs)
        switch coe
            case 1
                blockList(noDeleteList(1)).BackgroundColor=[0.6 0 0];
                blockList(noDeleteList(1)).Text={'游戏';'失败'};
                startFlag=0;
            otherwise
                object=uilabel(fig);
                object.Text={'游戏';'失败'};
                object.Position=[coe,0+3-18.75,90,150];
                object.FontSize=26;
                object.FontWeight='bold';
                object.FontColor=[1 1 1];
                object.BackgroundColor=[0.6 0 0];
                object.HorizontalAlignment='center';
                
        end      
    end

function keyPressFcn(~,event)
    switch event.Key
        case 'a',xPos=0+3;
        case 's',xPos=90+3;
        case 'd',xPos=180+3;
        case 'f',xPos=270+3;
        otherwise,xPos=-1;
    end
    if (~isempty(noDeleteList))&&blockList(noDeleteList(1)).Position(1)==xPos&&gameOver==0
        tempStr=blockList(noDeleteList(1)).UserData;
        sound(notes.(tempStr),fs)
        delete(blockList(noDeleteList(1)))
            if noDeleteList(1)==1
                startFlag=1;
            end
        noDeleteList(1)=[];
    elseif blockList(noDeleteList(1)).Position(1)~=xPos&&xPos~=-1&&gameOver==0&&startFlag==1
        startFlag=0;
        gameOverFcn(xPos);
        gameOver=1;   
    end
    
end
%==========================================================================
    function x=changeData(sort)
        note=v1{sort};
        switch note(1)
            case 'd',x=0;
            case 'r',x=0;
            case 'm',x=90;
            case 'f',x=90;
            case 's',x=180;
            case 'l',x=180;
            case 't',x=270;
            case 'b',x=270;
        end
    end

    function object=drawBlock(x,y,string,note)
        object=uilabel(fig);
        object.Text=string;
        object.Position=[x+3,y+3,90,150];
        object.FontSize=26;
        object.FontWeight='bold';
        object.FontColor=[1 1 1];
        object.BackgroundColor=[0 0 0];
        object.HorizontalAlignment='center';     
        object.UserData=note;
    end
end

getMusic.m(用于获取音乐数据)

function [v1,notes,fs]=getMusic
% Most shining national wind//最炫民族风 on Matlab
% The Modification is from "canon", not by me

fs = 44100; % sample rate
dt = 1/fs;

T16 = 0.125;

t16 = 0:dt:T16;
[~,k] = size(t16);

t4 = linspace(0,4*T16,4*k);
t8 = linspace(0,2*T16,2*k);

[~,i] = size(t4);
[~,j] = size(t8);

% Modification functions
mod4=(t4.^4).*exp(-30*(t4.^0.5));
mod4=mod4*(1/max(mod4));
mod8=(t8.^4).*exp(-50*(t8.^0.5));
mod8=mod8*(1/max(mod8));
mod16=(t16.^4).*exp(-90*(t16.^0.5));
mod16=mod16*(1/max(mod16));

f0 = 2*146.8; % reference frequency

ScaleTable = [2/3 3/4 5/6 15/16 ...
1 9/8 5/4 4/3 3/2 5/3 9/5 15/8 ...
2 9/4 5/2 8/3 3 10/3 15/4 4 ...
1/2 9/16 5/8];

% 1/4 notes
notes.do0f = mod4.*cos(2*pi*ScaleTable(21)*f0*t4);
notes.re0f = mod4.*cos(2*pi*ScaleTable(22)*f0*t4);
notes.mi0f = mod4.*cos(2*pi*ScaleTable(23)*f0*t4);

notes.fa0f = mod4.*cos(2*pi*ScaleTable(1)*f0*t4);
notes.so0f = mod4.*cos(2*pi*ScaleTable(2)*f0*t4);
notes.la0f = mod4.*cos(2*pi*ScaleTable(3)*f0*t4);
notes.ti0f = mod4.*cos(2*pi*ScaleTable(4)*f0*t4);
notes.do1f = mod4.*cos(2*pi*ScaleTable(5)*f0*t4);
notes.re1f = mod4.*cos(2*pi*ScaleTable(6)*f0*t4);
notes.mi1f = mod4.*cos(2*pi*ScaleTable(7)*f0*t4);
notes.fa1f = mod4.*cos(2*pi*ScaleTable(8)*f0*t4);
notes.so1f = mod4.*cos(2*pi*ScaleTable(9)*f0*t4);
notes.la1f = mod4.*cos(2*pi*ScaleTable(10)*f0*t4);
notes.tb1f = mod4.*cos(2*pi*ScaleTable(11)*f0*t4);
notes.ti1f = mod4.*cos(2*pi*ScaleTable(12)*f0*t4);
notes.do2f = mod4.*cos(2*pi*ScaleTable(13)*f0*t4);
notes.re2f = mod4.*cos(2*pi*ScaleTable(14)*f0*t4);
notes.mi2f = mod4.*cos(2*pi*ScaleTable(15)*f0*t4);
notes.fa2f = mod4.*cos(2*pi*ScaleTable(16)*f0*t4);
notes.so2f = mod4.*cos(2*pi*ScaleTable(17)*f0*t4);
notes.la2f = mod4.*cos(2*pi*ScaleTable(18)*f0*t4);
notes.ti2f = mod4.*cos(2*pi*ScaleTable(19)*f0*t4);
notes.do3f = mod4.*cos(2*pi*ScaleTable(20)*f0*t4);
notes.blkf = zeros(1,i);

% 1/8 notes
notes.do0e = mod8.*cos(2*pi*ScaleTable(21)*f0*t8);
notes.re0e = mod8.*cos(2*pi*ScaleTable(22)*f0*t8);
notes.mi0e = mod8.*cos(2*pi*ScaleTable(23)*f0*t8);

notes.fa0e = mod8.*cos(2*pi*ScaleTable(1)*f0*t8);
notes.so0e = mod8.*cos(2*pi*ScaleTable(2)*f0*t8);
notes.la0e = mod8.*cos(2*pi*ScaleTable(3)*f0*t8);
notes.ti0e = mod8.*cos(2*pi*ScaleTable(4)*f0*t8);
notes.do1e = mod8.*cos(2*pi*ScaleTable(5)*f0*t8);
notes.re1e = mod8.*cos(2*pi*ScaleTable(6)*f0*t8);
notes.mi1e = mod8.*cos(2*pi*ScaleTable(7)*f0*t8);
notes.fa1e = mod8.*cos(2*pi*ScaleTable(8)*f0*t8);
notes.so1e = mod8.*cos(2*pi*ScaleTable(9)*f0*t8);
notes.la1e = mod8.*cos(2*pi*ScaleTable(10)*f0*t8);
notes.tb1e = mod8.*cos(2*pi*ScaleTable(11)*f0*t8);
notes.ti1e = mod8.*cos(2*pi*ScaleTable(12)*f0*t8);
notes.do2e = mod8.*cos(2*pi*ScaleTable(13)*f0*t8);
notes.re2e = mod8.*cos(2*pi*ScaleTable(14)*f0*t8);
notes.mi2e = mod8.*cos(2*pi*ScaleTable(15)*f0*t8);
notes.fa2e = mod8.*cos(2*pi*ScaleTable(16)*f0*t8);
notes.so2e = mod8.*cos(2*pi*ScaleTable(17)*f0*t8);
notes.la2e = mod8.*cos(2*pi*ScaleTable(18)*f0*t8);
notes.ti2e = mod8.*cos(2*pi*ScaleTable(19)*f0*t8);
notes.do3e = mod8.*cos(2*pi*ScaleTable(20)*f0*t8);
notes.blke = zeros(1,j);

% 1/16 notes
notes.do0s = mod16.*cos(2*pi*ScaleTable(21)*f0*t16);
notes.re0s = mod16.*cos(2*pi*ScaleTable(22)*f0*t16);
notes.mi0s = mod16.*cos(2*pi*ScaleTable(23)*f0*t16);

notes.fa0s = mod16.*cos(2*pi*ScaleTable(1)*f0*t16);
notes.so0s = mod16.*cos(2*pi*ScaleTable(2)*f0*t16);
notes.la0s = mod16.*cos(2*pi*ScaleTable(3)*f0*t16);
notes.ti0s = mod16.*cos(2*pi*ScaleTable(4)*f0*t16);
notes.do1s = mod16.*cos(2*pi*ScaleTable(5)*f0*t16);
notes.re1s = mod16.*cos(2*pi*ScaleTable(6)*f0*t16);
notes.mi1s = mod16.*cos(2*pi*ScaleTable(7)*f0*t16);
notes.fa1s = mod16.*cos(2*pi*ScaleTable(8)*f0*t16);
notes.so1s = mod16.*cos(2*pi*ScaleTable(9)*f0*t16);
notes.la1s = mod16.*cos(2*pi*ScaleTable(10)*f0*t16);
notes.tb1s = mod16.*cos(2*pi*ScaleTable(11)*f0*t16);
notes.ti1s = mod16.*cos(2*pi*ScaleTable(12)*f0*t16);
notes.do2s = mod16.*cos(2*pi*ScaleTable(13)*f0*t16);
notes.re2s = mod16.*cos(2*pi*ScaleTable(14)*f0*t16);
notes.mi2s = mod16.*cos(2*pi*ScaleTable(15)*f0*t16);
notes.fa2s = mod16.*cos(2*pi*ScaleTable(16)*f0*t16);
notes.so2s = mod16.*cos(2*pi*ScaleTable(17)*f0*t16);
notes.la2s = mod16.*cos(2*pi*ScaleTable(18)*f0*t16);
notes.ti2s = mod16.*cos(2*pi*ScaleTable(19)*f0*t16);
notes.do3s = mod16.*cos(2*pi*ScaleTable(20)*f0*t16);
notes.blks = zeros(1,k);

% Melody by Schau_mal 
part0={'mi1f' 'la0e' 'la0e' 'do1f' 'mi1f' ...
're1e' 're1s' 'mi1s' 're1e' 'do1e' 're1e' 'do1e' 'la0f' ...
'mi1f' 'la0e' 'la0e' 'do1f' 'mi1f' ...
'so1e' 're1s' 'mi1s' 're1e' 'do1e' 're1e' 'do1e' 'ti0e' 'so0e' ...
'mi1f' 'la0e' 'la0e' 'do1f' 'mi1f' ...
're1e' 're1s' 'mi1s' 're1e' 'do1e' 're1e' 'do1e' 'la0e' 'so0e' ...
'mi1f' 'la0e' 'la0e' 'do1f' 'mi1f' ...
'so1e' 'mi1e' 'blkf' 'blkf' 'blkf' };

part1={'la0f' 'la0e' 'so0e' 'la0f' 'la0e' 'do1e' ...
'do1f' 're1e' 'do1e' 'la0f' 'la0f' ...
'do1f' 'do1e' 'so0e' 'do1e' 're1e' 'mi1e' 'so1e' ...
'so1e' 'mi1e' 're1f' 'mi1f' 'mi1f' ...
'la1e' 'la1e' 'la1e' 'so1e' 'mi1e' 'mi1f' 'do1e' ...
'la0e' 'la0e' 'la0e' 'mi1e' 're1s' 'mi1s' 're1e' 're1f' ...
'mi1e' 'mi1e' 'so1e' 'mi1e' 're1e' 'mi1e' 're1e' 'do1e' ...
'la0f' 'so0f' 'la0f' 'la0f' ...
};

part2={'mi1e' 'mi1e' 'so1e' 'mi1e' 'mi1e' 'so1e' 'so1e' 'la1e' ... 
'do2e' 'la1e' 'so1f' 'la1s' 'do2s' 'la1e' 'la1f' ...
'la0f' 'la0e' 'so0e' 'la0f' 'do1f' ...
're1e' 'mi1s' 're1s' 'do1e' 're1e' 'mi1f' 'mi1f' ...
'la0e' 'la1e' 'la1e' 'so1e' 're1e' 'mi1s' 're1s' 'do1e' 're1e' ...
'mi1f' 'mi1f' 'blke' 'blke' 'blkf' ...
'do1e' 'la0e' 'la0e' 'do1e' 're1f' 'so0e' 'so0e' ...
'mi1e' 'so1e' 'mi1e' 're1e' 'do1f' 'do1f' ...
'la0e' 'do1e' 're1e' 'mi1e' 're1e' 'do1e' 'so0e' 'mi0e' ...
'la0f' 'la0f' 'blke' 'blke' 'blkf' ...
};

part3={'la0f' 'la0e' 'so0e' 'la0f' 'do1f' ...
're1e' 'mi1s' 're1s' 'do1e' 're1e' 'mi1f' 'mi1f' ...
'la0e' 'la1e' 'la1e' 'so1e' 're1e' 'mi1s' 're1s' 'do1e' 're1e' ...
'mi1f' 'mi1f' 'blke' 'blke' 'blkf' ...
'do1e' 'la0e' 'la0e' 'do1e' 're1f' 'so0e' 'so0e' ...
'mi1e' 'so1e' 'mi1e' 're1e' 'do1f' 'do1e' 'do1e' ...
'la0e' 'do1e' 're1e' 'mi1e' 'so1e' 'mi1e' 'mi1e' 'so1e' ...
'la1f' 'la1f' 'la1f' 'la1f' ...
};

part4={'la1e' 'la1s' 'la1s' 'la1e' 'la1e' 'la1e' 'la1s' 'so1s' 'mi1e' 're1e' ...
're1e' 're1s' 're1s' 'mi1e' 'mi1s' 'so1s' 'mi1e' 'mi1s' 're1s' 'do1e' 'do1s' 'la0s' ...
'la0f' 'la0e' 'so0e' 'la0f' 'la0e' 'do1e' ...
're1e' 'mi1s' 're1s' 'do1e' 're1e' 'mi1f' 'mi1f' ...
'la1e' 'so1e' 'mi1e' 're1e' 'so1e' 'mi1e' 're1e' 'do1e' ...
'do1f' 'do1f' 'la0s' 'do1s' 're1s' 'mi1s' 're1s' 'do1s' 'la0s' 'do1s'};

part5={'do2e' 'do2s' 'do2s' 'la1e' 'la1s' 'la1s' 'so1e' 'so1s' 'so1s' 'mi1e' 'mi1s' 'mi1s' ...
're1e' 'mi1s' 're1s' 'do1e' 'la0s' 'so0s' 'la0s' 'so0s' 'do1s' 're1s' 'mi1s' 'so1s' 'la1s' 're2s' ...
'do2f' 'do2f' 'blks' 'blks' 'blks' 'blks' 'do1e' 're1e' ...
'mi1f' 'mi1f' 'mi1f' 'so1e' 'mi1e' ...
'la1f' 'la1f' 'la1e' 'do1e' 'so1e' 'mi1e' ...
're1f' 're1e' 're1s' 're1s' 're1e' 're1e' 'do1e' 're1e' ...
'mi1f' 'mi1e' 'mi1s' 'mi1s' 'mi1e' 're1s' 'do1s' 'ti0e' 'do1s' 're1s' ...
'mi1f' 'mi1f' 'mi1f' 'so1e' 'mi1e' ...
'do2f' 'la1f' 'la1f' 'la1e' 'do1e' ...
're1f' 'so1f' 'so1f' 'la1f' ...
'ti1f' 'ti1f' 'ti1f' 'ti1f' ...
};

part6={'blkf' 'blkf' 'mi1e' 'so1e' 'mi1e' 'so1e' ...
'mi1f' 'la0e' 'la0s' 'la0s' 'do1f' 'la0e' 'mi1s' 'la0s' ...
'do1e' 'do1s' 'do1s' 're1e' 'do1s' 're1s' 'mi1f' 'mi1f' ...
'mi1f' 'la0e' 'la0s' 'la0s' 'so1f' 're1e' 're1s' 're1s' ...
'mi1f' 'mi1f' 'mi1s' 're1s' 'do1s' 'la0s' 'mi0s' 're0s' 'mi0s' 'so0s' ...
'do1f' 'la0e' 'la0s' 'la0s' 're1f' 'so0e' 'so0s' 'so0s' ...
'mi0f' 'so0e' 'so0s' 'so0s' 'do1f' 'do1f' ...
'la0f' 'do1e' 'do1s' 'la0s' 'mi1e' 'mi1s' 'mi1s' 're1e' 're1s' 'mi1s' ...
};

% Combination, v1 is complete version, v2 is simple version.
v1 = [part0 part1 part1 part2 part3 part4 part0 part1 part1 part2 part3 part5 part3 part6 part3];
%v2 = [part0 part1 part1 part2 part3 part5 part3 part6 part3];
end

您可能感兴趣的文章:

相关文章