网页
资讯
视频
图片
知道
文库
贴吧
地图
采购
进入贴吧
全吧搜索
吧内搜索
搜贴
搜人
进吧
搜标签
日
一
二
三
四
五
六
签到排名:今日本吧第
个签到,
本吧因你更精彩,明天继续来努力!
本吧签到人数:0
一键签到
成为超级会员,使用一键签到
一键签到
本月漏签
0
次!
0
成为超级会员,赠送8张补签卡
如何使用?
点击日历上漏签日期,即可进行
补签
。
连续签到:
天 累计签到:
天
0
超级会员单次开通12个月以上,赠送连续签到卡3张
使用连续签到卡
09月25日
漏签
0
天
it吧
关注:
182,395
贴子:
869,174
看贴
图片
吧主推荐
视频
游戏
1
2
3
下一页
尾页
87
回复贴,共
3
页
,跳到
页
确定
<<返回it吧
>0< 加载中...
【扫盲】俄罗斯方块源码分析(附源码)
只看楼主
收藏
回复
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
一楼度娘
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
众所周知,俄罗斯方块是一款曾经非常火的休闲游戏,就算是现在也以各种形式出现在各个游戏平台,对传统俄罗斯方块增加了各种新功能,如道具功能,在界面上也比最初美观了很多。
对于这个游戏来说,算法来说并不是特别难,但相对与贪吃蛇和扫雷来说还是稍微难一些的。
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
现在我来简单的说一下这个游戏。简单的来说就是通过生成一个随机形状(传统是5个形状),出现后自动下落,玩家可以对其进行左、右和下进行控制,空格加速下落(未实现),上方向键对形状进行旋转,在一个固定大小的矩形内进行码墙一样的工作,码好一行就消除这一行,上面的方块自动下落(未实现),消除1行加固定分数(未实现)。
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这个游戏中最主要的算法,难度有高到低依次是 图形的旋转 图形的自动生成 消除一行,其次还有判断是否和墙相撞和移动(这次依然没有自动下落)
下面说明编写这个游戏的思路:
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(1)第一步我们依然需要一个地图来对方块和墙的位置存储和显示
定义成固定大小 #define ROW 10
#define COL 10
int map[ROW][COL];//其中2代表图形,9代表墙,0代表空地
然后进行初始化(周围一圈是墙)
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
switch(rand()%4)
{
case 0://直线
Block[1].y--;
Block[0].y-=2;
break;
.....依次类推
}
图形生成完之后再进行随机次数的旋转(旋转的算法在下边会说明)
int i=0;
for(i=0;i<rand()%4;i++)
{
Change();//旋转函数
}
这样一个图形就生成了(方法不唯一)
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(2)图形的旋转
这是我认为这个游戏中最难的一部分,我也确实画了好几个小时才得出结论,但是代码却只有不到10行,所以
说图形的旋转是有规律可寻的(可以从旋转前和旋转后行列坐标的变化来考虑,详情请看源代码)。
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(3)左右下的控制和撞墙判断
有了图形之后就应该控制这个图形来进行游戏了,这里很简单,并且可以将其写入一个函数中,对于参数,如果
按的是左 则add_row=0,add_col=-1 依次类推你懂的。
Direction(int add_row,int add_col)
每移动一次都要判断是否和墙壁相交,如果相交要将移动过去的方块再移动回来,以向左为例,在依次移动每一块
方块的时候,判断这个方块是否和墙相交,如果相交,则将已经移动过去的方块再移动回来。
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
int i=0,j=0;
for(i=0;i<4;i++)
{
Block.x+=add_row;
Block.y+=add_col;//移动一块方块
if(map[Block.x][map[Block.y]==9)//9代表墙,如果这块移动之后与墙相交
{
for(j=0;j<=i;j++)
{
//则将这块和这块之前的全部变成原来的状态
}
if(add_col==1)//如果是方向是下,并且撞墙,应该将当前方块位置变成墙,再生成一个新的方块
{
...//当前位置变成墙
Rand_Block();//随机生成方块
}
}
}
如果没有相交,也要改变地图上方块的位置(为了下一次显示),简单的方法就是再调用一次初始化的函数
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(4)消除一行
有两种方法能够判断什么时候消除一行
在这之前我们要知道,消除一行的判断应该在图形块下落到墙上之后
1.从下到上依次判断每一行,如果这一行没有空地,则消除这一行,用循环将这行上面的墙依次下移一行,
直到上边没有墙的那一行停止循环(如果已经没有方块,就不需要再进行下移了),然后再从这一行进行判断
(将循环变量-1)。
2.将每一行的墙的个数用数组保存起来
int full[ROW-2];
每次图形下落到底部的时候,将4个方块的x坐标作为full的下标,然后+1,如果full[n]=COL-2,则
消除这一行,消除方法同上,full数组也许要移动。
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
(5)判断死亡
如果生成的图形和墙相交,死亡
iwtbs8
IT销售
6
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
没人啊
顽固克洛洛
IT新人
1
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
感觉自己好渣
昌维001
CJO
15
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
已加精,多多鼓励发技术贴
巴塞罗那丶异象
IT资讯
5
该楼层疑似违规已被系统折叠
隐藏此楼
查看此楼
这个项目虽然小,却是入门啊!
登录百度账号
扫二维码下载贴吧客户端
下载贴吧APP
看高清直播、视频!
贴吧页面意见反馈
违规贴吧举报反馈通道
贴吧违规信息处理公示