📄 matlab-russian.txt
字号:
% 根据行数产生得分
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 + -