我想做一个俄罗斯方块来练一下手,请各位高人指教一下算法

lgh2626 2003-02-15 10:09:18
我想做一个俄罗斯方块来练一下手,请各位高人指教一下算法。只说出思路就行不用源代码了。
...全文
78 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
sssxueren 2003-02-18
  • 打赏
  • 举报
回复
早前的主页给del掉了,下面有游戏下载地址,Linux服务器的,所以需要注意大小写。

不能在2000、xp系统下运行,建议在dos环境或者9x下运行

http://www.flyingmagic.com/DownLoad/sp.zip
sssxueren 2003-02-18
  • 打赏
  • 举报
回复
我写的第一个C游戏就是一款俄罗斯方块游戏——《seven puzzles》,带一个很迅猛的AI,水平不怎么样,只考虑当前一个方块,是快攻型的,关于AI的做法,和大伙聊聊吧!

我们大伙玩俄罗斯方块是基于一个什么原则呢?可以数学公式化的一个简单的原则?

如果有兴趣的话,可以先想想,不要急着看下去,因为规则那么简单那么具体化的游戏要想用一个公式来代替它的规则实在不是一件容易事。

首先,我需要提醒大家的是俄罗斯方块还有一个名字,也就是《砌砖》,整齐是最重要的,我定的规则如下:

1、方块的位置越下越好
2、方块之间越紧密越好,也就是方块周围的四个位置的方块数量越多越好
3、消去的方块排数越多越好

各个规则的重要性当然是不同的,至于具体的公式大家很容易写出来。不提了,而我在两年多以前写的游戏,可以到http://ssscomic.yeah.net找到,那是我刚接触编程半年多写出来的东西,再现在看来其实也算不上什么了,一直也没时间写Windows版本,勉强应付着用吧!
sssxueren 2003-02-18
  • 打赏
  • 举报
回复
这是我几年以前写的《Seven Puzzles》(该游戏为DOS版,可在鄙人主页http://ssscomic.yeah.net内找到)里的俄罗斯方块的实现方法,当时接触编程仅半年而已,希望可以给初学者一点帮助。

几乎没有写什么代码,而且后阶段方块旋转、消去方面更是只大致介绍了一点方法,不过应该还是可以让人明白的。

本人才疏学浅,如有不当之处,还望各位多多指教。


世界

世界即游戏进行的场所,在俄罗斯方块里就是MXN个小格子,我们可以使用一数组来表示

BYTE g_byScene[N][M]

其中,N为行数、M为每行格数,左上角为(0,0)

我们可以继续定义

#define SCENE_EMPTY 0

就是当g_byScene[y][x]==0时代表该格为空,可以放入方块,否则当方块落到(y+1,x)时就不可以继续下落

因为后面还有许些功能可能需要用到g_byScene,所以暂时只用定义0值,以后再说。


角色

角色就是玩家可控制的那个东东了,在这里就是由4块小正方体组合成的方块。

大家可以穷举出所有可能的组合

—————————————————
**
**

—————————————————
*
**** 、 *
*
*
—————————————————
** *
** 、**
*
—————————————————
** *
** 、**
*
—————————————————
* * *
*** 、** 、** 、***
* * *
—————————————————
* ** *
*** 、* 、*** 、 *
* * **
—————————————————
* * **
*** 、* 、*** 、 *
** * *
—————————————————

大家还看得清楚吧,由于不能使用图片,所以只好用字符方式,一共7种方块,旋转变化后共有17种。

这些方块都可以置于4X4的空格之中,图简单,我们可以建一个4X4大小的数组,储存方块信息,由于一共有17种,所以应该

#define ELEMENT_NUM_T_MAX 17

BYTE g_byElement[ELEMENT_NUM_T_MAX][4][4]

其中每个数值应该在游戏初始化时定义,这样在游戏中我们就可以通过方块号(0-16)来索引方块了。

为了方便实现旋转,最好按照顺时针变化的顺序将只是方向不同的方块放到一起,我上面的顺序可能有点不对。


方块的下落

我们还需要定义

int g_iX,g_iY; //这是方块坐标,对g_byElement[][][]来说,这个坐标是左上角坐标
BYTE g_byElementCur; //这是当前活动的方块、0-16

然后,写个移动判断函数,就可以简单的游戏了(方块不能转动)

向下移动的主要判断部分,没有进行边界判断,返回false为不可移动、true为可以移动


for(i=0;i<4;i++)
for(j=0;j<4;j++)
{
if(g_byElement[g_byElementCur][i][j]!=SCENE_EMPTY
&&g_byScene[g_iY+i+1][g_iX+j]!=SCENE_EMPTY)
return false;
}

return true;

应该没有写错吧!^^

处理键盘的同时还应该不停的计时,保证方块每一段时间下落一格(g_iY++),直到不能下落为止。


方块的旋转

方块的旋转其实和位图旋转没有关系,只是方块号改变了而已,我刚才将方块按顺时针旋转放在一起,也就是这个原因,我们可以通过g_byElementCur++、g_byElementCur--来实现顺时针或逆时针旋转,当然要做边界的判断。

另外,由于方块旋转后,占用的位置就改变了,所以还需要判断目前位置是否可以旋转,和判断下落的方法差不多。


方块的消去

方块落定后,就应当马上刷新g_byScene[][],并做消去判断,如果某一行可以消去,还应该将该行上的所有g_byScnen[][]值向下移一行,并刷新屏幕。

sweihua 2003-02-17
  • 打赏
  • 举报
回复
网上许多代码的
ZhangYv 2003-02-15
  • 打赏
  • 举报
回复
如果你需要在游戏中加入人工智能可以用A*,重点放在评价函数上此函数也不会难吧。
ZhangYv 2003-02-15
  • 打赏
  • 举报
回复
这个话题好象讨论过挺多次了,先看看旧贴
http://expert.csdn.net/Expert/topic/1098/1098883.xml?temp=.2046015
nichotilikai 2003-02-15
  • 打赏
  • 举报
回复
没有代码光有思路怎么行哩?程序员就是用它来表达自己思想的。我用VC+DirectX写过一个。虽然小,但已经把DX程序的基本架构给搭起来了,用翻页机制。你要是想要的话我可以发给你。
你要是不想要的话,可以找到WINDOWS游戏编程大师技巧那本书,(也许有电子书的下载吧),那本书第一个例子就是个弹球的程序,可以用它熟悉基本的DX游戏程序的架构,再去网上找些俄罗斯方块的程序(我见过的都是MFC,GDI写的),你把两者结合一下就是了。

8,305

社区成员

发帖
与我相关
我的任务
社区描述
游戏开发相关内容讨论专区
社区管理员
  • 游戏开发
  • 呆呆敲代码的小Y
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧