⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 matlab-russian.txt

📁 用MATLAB软件实现的一个经典游戏
💻 TXT
📖 第 1 页 / 共 4 页
字号:
                % 根据行数产生得分
                NewScore = ScoreArray(LineNumber) ;
                % 提取旧分数
                CurrentScore = getappdata( handles.RussiaBlock, 'CurrentScore' ) ;
                % 提取界面分数显示的字符串
                TextString = get( handles.ScoreText, 'String' ) ;
                % 更新得分
                TextString{2} = CurrentScore + NewScore ;  
                set( handles.ScoreText, 'String', TextString ) ;
                % 保存新分数
                setappdata( handles.RussiaBlock, 'CurrentScore', CurrentScore + NewScore ) ;
                
                % 可能达到了最高记录
                UpdateHighScore( handles.RussiaBlock, CurrentScore + NewScore ) ;
                
                % 可能需要增加游戏难度
                UpdateGameLevel( handles.RussiaBlock, CurrentScore + NewScore ) ;
                
                % 处理需要下移的方块,从后往前移
                for num = LineNumber : -1 : 1
                    [YData, Index] = find( TotalYData > LastBlockYData(num) ) ;
                    TotalYData(Index) = TotalYData(Index) - 20 ;
                end
                
                % 给一个状态,因为这次有一个方块清除行为
                setappdata( handles.RussiaBlock, 'ClearBlock', 1) ;
            end
            % 更新界面上的方块
            set( handles.BlockHandle, 'XData', TotalXData, 'YData', TotalYData ) ;   
        end
        
        % 游戏运行后处理的总方块数目
        BlockNumber = getappdata( handles.RussiaBlock, 'BlockNumber' ) ;
        TextString = get( handles.BlockNumText, 'String' ) ;
        TextString{2} = BlockNumber + 1 ;    
        set( handles.BlockNumText, 'String', TextString ) ;
        setappdata( handles.RussiaBlock, 'BlockNumber', BlockNumber + 1 ) ;    
        
        % 当前处理方块
        TempBlockPos.LeftStep = 0 ;
        TempBlockPos.DownStep = 0 ;
        setappdata( handles.RussiaBlock, 'TempBlockPos', TempBlockPos ) ;               
        
        % 一个状态,用于判断方块是否落底,初始为1,当为0时表示到底
        Status = 1;
        
        % 随机产生一个方块
        [BlockXArray,BlockYArray] = Com_GetBlock( h ) ;
        set( handles.TempBlock, 'XData', BlockXArray, 'YData', BlockYArray ) ;
    else
        Status = 0 ;
        StartType = 'NewStart' ;
    end
    
    % 游戏等级
    GameLevel = getappdata( handles.RussiaBlock, 'GameLevel' ) ;
    
    % 得到需要暂停的时间
    PauseTime = GetPauseTimeByGameLevel( GameLevel ) ;
    
    % 确保方块没有落到底,而且界面也没被关闭
    while( Status & ishandle( h ) )
        % 当按空格键直接下落时,不进入暂停
        if(PauseTime) ~= 0
            pause( PauseTime )
        end
        % 一定时间后进行一次下移
        Status = test_MoveBlock( h, 'Down' ) ;
    end
end



% -------------------------------------------------------------------------
function KeyPress_Callback( h )
% 响应键盘事件

% 得到所有句柄
handles = guidata( h ) ;

% 如果点了暂停了,不处理
PauseState = get( handles.PauseTool, 'State' ) ;
if strcmp( PauseState, 'on' ) 
    return
end

% 用户设置的前后左右和直接下落键
BoardConfig = getappdata( handles.RussiaBlock, 'BoardConfig' ) ;

% 用户设置的前后左右和直接下落键
Left = BoardConfig.Left ;
Right = BoardConfig.Right ;
Down = BoardConfig.Down ;
Change = BoardConfig.Change ;
Drop = BoardConfig.Drop ;


% 得到键信息
CurrentKey = get( handles.RussiaBlock, 'CurrentKey' ) ;

switch CurrentKey
    case Left
        % 左移
        test_MoveBlock( h, 'Left' ) ;
    case Right
        % 右移
        test_MoveBlock( h, 'Right' ) ;
    case Down
        % 下移
        test_MoveBlock( h, 'Down' ) ;
    case Change
        % 变形
        test_MoveBlock( h, 'Change' ) ;
    case Drop
        % 直接丢下
        test_MoveBlock( h, 'Drop' ) ;        
    otherwise
        return ;
end


% -------------------------------------------------------------------------
function  BoardConfig = GetDefaultBoardConfig ;

% 默认的前后左右
BoardConfig.Left = 'leftarrow' ;
BoardConfig.Right = 'rightarrow' ;
BoardConfig.Down = 'downarrow' ;
BoardConfig.Change = 'uparrow' ;
BoardConfig.Drop = 'space' ;

    
% -------------------------------------------------------------------------
function WindowColor_Callback( h )
% 设置窗口背景颜色

handles = guidata( h ) ;

% 旧颜色 
CurrentColor = get( handles.MainAxes, 'Color' ) ;
% 颜色设置工具
NewColor = uisetcolor( CurrentColor, '请选择窗口颜色' ) ;

if length( NewColor ) == 0
    % 没有设置颜色
    return;
else
    % 更新颜色
    set( handles.MainAxes, 'Color', NewColor ) ;
end


% -------------------------------------------------------------------------
function WindowPicture_Callback( h )
% 图片设置

handles = guidata( h ) ;

% 选择图片文件
[PictureFile, Path] = uigetfile( {'*.jpg; *.bmp'},'请选择图片' );

if isnumeric( PictureFile )
    % 没有选择图片文件
    return ;
else
    %     if length( PictureFile ) > 31
    %         errordlg( '文件名过长,读取失败' ) ;
    %     end
    try
        % 读图片文件
        Picture = imread( [Path, PictureFile] ) ;
        
        % 图片矩阵上下翻转(因为图片矩阵的原点在左上角,而matlab坐标轴的原点在左下角)
        for num = 1: size( Picture, 3 )
            ValidPicture(:, :, num) = flipud( Picture(:,:,num) ) ;
        end
        
        % 坐标轴范围
        AxesXLim = get( handles.MainAxes, 'XLim' ) ;
        AxesYLim = get( handles.MainAxes, 'YLim' ) ;
        
        % 得到所有方块的句柄
        BlockHandle = findobj( handles.MainAxes, 'Style', 'line' ) ;
        % 清除轴上除了方块以外的所有图形子句柄
        cla( BlockHandle ) ;
        
        % 图片的大小
        ImageXLimit = size(Picture, 2) ;
        ImageYLimit = size(Picture, 1) ;
                
        if diff( AxesXLim ) < size(Picture, 2) | diff( AxesYLim ) < size(Picture, 1) 
            % 超出坐标轴范围,压缩显示
            XScale = diff( AxesXLim ) / size(Picture, 2) ;
            YScale = diff( AxesYLim ) / size(Picture, 1) ;
            % 取较小比例压缩
            Scale = min( XScale, YScale ) ;
            ImageXLimit = size(Picture, 2) * Scale ;
            ImageYLimit = size(Picture, 1) * Scale ;
        end
        
        ImageXData(1) = AxesXLim(1) + (diff( AxesXLim ) - ImageXLimit) / 2 + 1;
        ImageXData(2) = ImageXData(1) + ImageXLimit - 1;
        ImageYData(1) = AxesYLim(1) + (diff( AxesYLim ) - ImageYLimit) / 2 + 1;
        ImageYData(2) = ImageYData(1) + ImageYLimit - 1;
                
        % 图片显示
        image( ValidPicture, 'Parent', handles.MainAxes, 'Hittest', 'off', ...
            'XData',ImageXData,'YData',ImageYData, 'Tag', 'MainImage' );
        % 保存到内存
        setappdata( handles.RussiaBlock, 'ImageData', ValidPicture ) ;
    catch
        ErrorString = sprintf( ['读取图片失败,错误信息为:\n',lasterr] ) ;
        errordlg( ErrorString ) ;
    end
end


% -------------------------------------------------------------------------
function BlockColor_Callback( h )
% 方块颜色设置

handles = guidata( h ) ;

% 旧颜色
CurrentColor = getappdata( handles.RussiaBlock, 'BlockColor' ) ;
if isempty( CurrentColor )
   % 提取默认颜色
    CurrentColor = GetDefaultBlockColor ;    
    setappdata( handles.RussiaBlock, 'BlockColor', CurrentColor ) ;
end

% 颜色设置工具
NewColor = uisetcolor( CurrentColor, '请选择方块颜色' ) ;

if length( NewColor ) == 0
    % 没有设置颜色
    return;
else
    % 设置颜色
    setappdata( handles.RussiaBlock, 'BlockColor', NewColor ) ;
    set( handles.BlockHandle, 'MarkerFaceColor', NewColor ) ;
    set( handles.TempBlock, 'MarkerFaceColor', NewColor ) ; 
    set( handles.NextBlock, 'MarkerFaceColor', NewColor ) ;
end



% ------------------------------------------------------------------------
function Default_Callback( h )
% 恢复默认

handles = guidata( h ) ;

% 得到方块默认颜色和轴的默认背景颜色
BlockColor = GetDefaultBlockColor ;
AxesColor = GetDefaultMainAxesColor ;

% 更新到图形句柄
set( handles.MainAxes, 'Color', AxesColor ) ;
set( handles.BlockHandle, 'MarkerFaceColor', BlockColor ) ;
set( handles.TempBlock, 'MarkerFaceColor', BlockColor ) ;
set( handles.NextBlock, 'MarkerFaceColor', BlockColor ) ;


% -------------------------------------------------------------------------
function PauseGame_Callback( h )
% 暂停(快截菜单上的按钮)

handles = guidata( h ) ;

% 取得暂停快截按钮的状态
ToolState = get( handles.PauseTool, 'State' ) ;

if strcmp( ToolState, 'on' )
    % 快截栏上暂停按钮按下,界面上暂停按钮也设置为按下
    set( handles.PauseButton, 'Value', 1 ) ;
    % 暂停,等待激活
    waitfor( handles.PauseTool, 'State', 'off' ) ;
else
    % 快截栏上暂停按钮按下,界面上暂停按钮也设置为按下
    set( handles.PauseButton, 'Value', 0 ) ;
end


% -------------------------------------------------------------------------
function ButtonPauseGame_Callback( h )
% 界面上的暂停按钮

handles = guidata( h ) ;

% 得到按钮值,0为弹起状态,1为按下状态
ToggleButtonValue = get( h, 'Value' ) ;

if ToggleButtonValue == 0
    % 改变按钮状态
    set( h, 'Value', 1 ) ;
    % 更新按钮显示
    set( h, 'String', '继续' ) ;
    % 更新快截栏上按钮的状态
    set( handles.PauseTool, 'State', 'on' ) ;
    % 暂停,等待激活
    waitfor( handles.PauseTool, 'State', 'off' ) ;
else
    % 改变按钮状态
    set( h, 'Value', 0 ) ;
    % 更新按钮显示
    set( h, 'String', '暂停' ) ;
    % 更新快截栏上按钮的状态
    set( handles.PauseTool, 'State', 'off' ) ;
    % 将当前控件句柄设置为轴(不设置的话是在这按钮上,在matlab7.0之前的版本,按钮对象不能响应键盘事件)
    set( handles.RussiaBlock, 'CurrentObject', handles.MainAxes ) ;
end


% ------------------------------------------------------------------------
function CloseFigure_Callback( h )
% 关闭界面

handles = guidata( h ) ;

% 提取界面设置的信息
BlockColor = getappdata( handles.RussiaBlock, 'BlockColor' ) ;
MainAxesColor = get( handles.MainAxes, 'Color' ) ;
MainAxesImageHandle = findobj( handles.MainAxes, 'Type', 'image' ) ;
if ~isempty( MainAxesImageHandle )
    MainAxesImage.Property.Tag = get( MainAxesImageHandle, 'Tag' );
    MainAxesImage.Property.Hittest = get( MainAxesImageHandle, 'Hittest' );
    MainAxesImage.Property.XData = get( MainAxesImageHandle, 'XData' );
    MainAxesImage.Property.YData = get( MainAxesImageHandle, 'YData' );
    MainAxesImage.ImageData = getappdata( handles.RussiaBlock, 'ImageData' ) ;
else
    MainAxesImage.ImageData = [] ;
end

% 对界面设置的信息做保存
save ColorInfo.mat BlockColor MainAxesColor MainAxesImage

% 保存最高成绩
SetHighScorePlayerName( h ) ;
ScoreInfo = getappdata( handles.RussiaBlock, 'ScoreInfo' ) ;
save ScoreInfo.mat ScoreInfo

% 用户设置的前后左右和直接下落键
BoardConfig = getappdata( handles.RussiaBlock, 'BoardConfig' ) ;
save BoardConfig.mat BoardConfig

delete( handles.RussiaBlock ) ;



% -------------------------------------------------------------------------
function Color = GetDefaultBlockColor

% 兰色
Color = [0 0 1] ;


% -------------------------------------------------------------------------
function Color = GetDefaultMainAxesColor

% 白色
Color = [1 1 1] ;


% ----------------------------------------------------------------
function [BlockXArray, BlockYArray] = Com_GetBlock( varargin )
% 随机生成方块

global BlockIndex ;

BlockXArray = [] ;
BlockYArray = [] ;

handles = guidata( varargin{1} ) ;

if nargin == 1
    % 提取前面上次得到方块时保存的提示窗内的方块,这次将应用于主轴进行操作
    BlockArray = getappdata( handles.RussiaBlock, 'BlockArray' ) ;
    % 随机领取一个1到24的序号,用序号去对应方块
    BlockIndex = ceil( rand(1) * 24 ) ;
else % nargin == 2
    % 序号是通过外部输入的情况(方块变形的时候),获得序号
    BlockIndex = varargin{2} ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -