| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 29393 人关注过本帖, 1 人收藏
标题:[原创]Matlab做的俄罗斯方块(含代码)
取消只看楼主 加入收藏
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏(1)
 问题点数:0 回复次数:8 
[原创]Matlab做的俄罗斯方块(含代码)
Se6hMtM9.txt (54.29 KB) [原创]Matlab做的俄罗斯方块(含代码)

做了点修改,解决了有时会不消方块的bug,补全了前面留的功能(键盘自定义设置、储存和载入游戏、高分记录),并在主要代码中加入了注释,便于大家读代码

[此贴子已经被作者于2007-9-9 6:34:20编辑过]



aqWVr7G3.bmp (809.4 KB)
图片附件: 游客没有浏览图片的权限,请 登录注册


gTrKfL2K.txt (28.42 KB) [原创]Matlab做的俄罗斯方块(含代码)

搜索更多相关主题的帖子: 俄罗斯方块 Matlab 代码 定义 键盘 
2006-12-03 22:42
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 

方块用一个line画只能一样颜色,要不同颜色可以用patch,但是速度会慢点


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2006-12-04 12:35
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 

那么多人问Gui的问题,自己给自己顶一下


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-01-12 21:11
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
我还没碰到过不能消的情况,不过有问题也是有可能的,有没有发现是在在什么情况下不能消呢?

OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-05-15 20:35
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
以下是引用swf_2008在2007-5-17 9:36:53的发言:

能不能在方块移除的几句程序后面加些注释,不大看的懂啊.谢谢

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


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-05-20 20:08
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
回复:(h_x0)怎么玩一会就不消了啊 ,还是有点问题吧...

今天终于有机会看到有个朋友在我面前重现这个bug了,确实出现了消不掉的情况,检查了下代码问题出在这:

if length( YData ) == 12

这里,我是判断是否某一行有12个方块,因为方块游戏窗口的宽度刚好够放下12个方块,我玩俄罗斯一般都是按空格丢下方块,所以始终没发现bug,但那个朋友是一直按着往下来玩而不是按空格键的,这就造成当方块落下停止到下一个方块落下之间的时间段上,键盘重复响应,我的方块位置向量被重复累加了(这方块被累加了多次)。

当循环到上面提到的那行代码时候 YData 就可能不只12,甚至有可能是3、40了

现在如果把那行改成 if length( YData ) >= 12 ,那么仍然可以保证当某行填满时会被消除,但是这样的处理仍然会有bug的,有兴趣的话朋友可以思考的会有什么bug


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-08-30 22:11
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
我的理解 varargin是一个代表输入参数的抽象概念,元胞类型,其中每一项代码一个对应的输入参数,如:varargin{2}代码第二个输入参数,
更多信息 help varargin
see also varargout,nargin,nargout

OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-09-04 21:27
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
以下是引用elus在2007-9-6 16:44:40的发言:
改成 if length( YData ) >= 12 bug更严重了,按着下就能消方块了

是的,我说的就是这问题,不过在新改的代码中已经解决了这问题,

NeqSjIV3.txt (54.29 KB)

[此贴子已经被作者于2007-9-9 15:16:45编辑过]


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-09-09 15:13
zhangenter
Rank: 6Rank: 6
等 级:贵宾
威 望:25
帖 子:390
专家分:0
注 册:2006-6-5
收藏
得分:0 
以下是引用appqidetk在2007-9-10 23:15:37的发言:
好多注释阿~基本有40%注释了~~赞~~

呵呵,注释写得很辛苦,我在公司是不写注释出了名的


OldHandle = findobj( \'Name\', \'悲伤\' ) ;if ~isempty(OldHandle),delete(OldHandle) ;end for Time = \'现在\':\'每一天\':\'永远\',set( gco, \'心情\', \'快乐\');end % 这段代码为你天天快乐而存在
2007-09-16 02:55
快速回复:[原创]Matlab做的俄罗斯方块(含代码)
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.025171 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved