[此贴子已经被作者于2007-9-9 6:34:20编辑过]
[此贴子已经被作者于2007-9-9 6:34:20编辑过]
能不能在方块移除的几句程序后面加些注释,不大看的懂啊.谢谢
for num = 1: length( LastBlockYData )
% 对最后一个下来的方块按行搜索
[YData, Index] = find( TotalYData == LastBlockYData(num) ) ;
% 判断是否满12个(满12个为整行,可以消除)
if length( YData ) == 12
% 保存下行号
CompleteLine = [CompleteLine, LastBlockYData(num)] ;
UsefulIndex = [UsefulIndex, Index] ;
end
end
% 处理需要消除的行
if ~isempty( CompleteLine )
% 在所有方块序列中删除这些行
TotalXData( UsefulIndex ) = [] ;
TotalYData( UsefulIndex ) = [] ;
% 得到完成行的数目,得到相应的分数
LineNumber = length( CompleteLine ) ;
ScoreArray = [100 300 600 1000] ;
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 ) ;
% 更新游戏等级(如果需要的话)
UpdateGameLevel( handles.RussiaBlock, CurrentScore + NewScore ) ;
% 处理需要下移的方块
for num = LineNumber : -1 : 1
[YData, Index] = find( TotalYData > LastBlockYData(num) ) ;
% 从下往上,逐行下移一行(20象素)
TotalYData(Index) = TotalYData(Index) - 20 ;
end
end
% 设置新的方块序列
set( handles.BlockHandle, 'XData', TotalXData, 'YData', TotalYData ) ;
end
今天终于有机会看到有个朋友在我面前重现这个bug了,确实出现了消不掉的情况,检查了下代码问题出在这:
if length( YData ) == 12
这里,我是判断是否某一行有12个方块,因为方块游戏窗口的宽度刚好够放下12个方块,我玩俄罗斯一般都是按空格丢下方块,所以始终没发现bug,但那个朋友是一直按着往下来玩而不是按空格键的,这就造成当方块落下停止到下一个方块落下之间的时间段上,键盘重复响应,我的方块位置向量被重复累加了(这方块被累加了多次)。
当循环到上面提到的那行代码时候 YData 就可能不只12,甚至有可能是3、40了
现在如果把那行改成 if length( YData ) >= 12 ,那么仍然可以保证当某行填满时会被消除,但是这样的处理仍然会有bug的,有兴趣的话朋友可以思考的会有什么bug
是的,我说的就是这问题,不过在新改的代码中已经解决了这问题,
[此贴子已经被作者于2007-9-9 15:16:45编辑过]