游戏开发论坛

 找回密码
 立即注册
搜索
查看: 6113|回复: 18

请教一个好玩的算法,小弟想了好久都没想出来!

[复制链接]

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
发表于 2006-11-7 10:58:00 | 显示全部楼层 |阅读模式
就是在一个棋盘里,有3种颜色的棋子,当我放一个棋子到棋盘里时,它周围相邻跟它颜色相同的棋子都消失了!
      例如在3*3的数组里,(0,0)(0,2)(1,2)(2,2)(2,0)处为黑,(0,1)(2,1)(1,0)处为白,如果在(1,1)处放个白棋子,,(0,1)(2,1)(1,0)处的白棋子连同自己一起消失了!
       小弟先谢过了! [em23]

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2006-11-7 11:51:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

这个应该不是很难阿。

粗略的想了一下。

每次放下一个棋子的时候判断它的上方,下方,左方,右方,如果有颜色和它相同的,那么让这些相同的消失了就行了阿。

剩下的问题就是结构体如何设置了。
设置一种好的结构体,能够事半功倍。


我这里写一种了。

定义棋子结构体,数据成员就一个颜色。

然后定义棋盘上所对应的每一个点的结构体,先取名叫做a了,数据成员包括以下几个:1,bool型变量,当该点有棋子时为真,当没有棋子是为假。2,棋子结构类型的变量,主要是保存当前该点上所落棋子的信息,主要就是颜色。

接下来棋盘结构体,数据成员包括如下:1,棋盘的行数,2棋盘的列数。3,棋盘上所对应的点,这个变量的类型是上面我们定义a结构体,而且是一个数组,大小是棋盘大小,行数*列数,然后再写一个绘制棋盘的函数,该函数根据每个点所对应的bool型变量的真假来绘制每个点。


不过这种方法有一个坏处,算法复杂度太高了。

比如棋盘大小为9*9的,那么每次绘制棋盘的时候都需要把所有的点都遍历一遍,

抛砖引玉了,期待哪位给各更简单的方法。


35

主题

370

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
发表于 2006-11-7 20:41:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

数据结构没有什么别的要求的话,直接用二维数组吧.
下一个棋的时候记录下下的地点和它的颜色,比如它的位置为x,y颜色为a那么检测
for(int i=x-1;i<x+2;i++)
{
         做棋盘边界检测通过执行下面
         for(int j=y-1;j<y+2;j++)
         做棋盘边界检测通过执行下面
         if 数组[j].color=当前棋子颜色
         数组[j]=NULL
        

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2006-11-8 08:52:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

先谢谢了,不好意思,可能是我没有说清楚!
      我的意思是,放棋子的周围,跟他相邻的,颜色一样的连在一起的.
           也就是说,我放一颗棋子(边界除外)有4个相连位置,那四个位置上也有他们自己的相邻位置,要把这些所有的相邻位置上的棋子都消掉,直到其相邻位置颜色为不一样的棋子或者没有棋子位置.
     

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2006-11-8 09:14:00 | 显示全部楼层

Re: Re:请教一个好玩的算法,小弟想了好久都没想出来!

xuxuejun2008: Re:请教一个好玩的算法,小弟想了好久都没想出来!

先谢谢了,不好意思,可能是我没有说清楚!
      我的意思是,放棋子的周围,跟他相邻的,颜色一样的连在一起的...



  [em7]

  [em21]

5

主题

23

帖子

29

积分

注册会员

Rank: 2

积分
29
 楼主| 发表于 2006-11-8 12:00:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

真的不好意思啊!
       打我吧!呵呵!

8

主题

716

帖子

716

积分

高级会员

Rank: 4

积分
716
发表于 2006-11-8 12:40:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

看上去LZ是要做个类似Tetrise like的小游戏

35

主题

370

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
发表于 2006-11-8 13:21:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

我觉的楼主缺乏的不是代码,而是 自己的思考

35

主题

370

帖子

376

积分

中级会员

Rank: 3Rank: 3

积分
376
发表于 2006-11-8 13:22:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

连连看啊  

7

主题

74

帖子

74

积分

注册会员

Rank: 2

积分
74
发表于 2006-11-8 13:26:00 | 显示全部楼层

Re:请教一个好玩的算法,小弟想了好久都没想出来!

函数(x,y)//这里的x,y分别对应棋盘的行数和列数,至于那个代表行数,那个代表列数,就看lz自己习惯了。
{

      这里定义一些临时变量,用来存储x,y点的信息
      if(x,y点的相邻左方有和它相同颜色的点)
      {
          去除x,y点的棋子。//这里去除x,y点的棋子是为了不至于进入无限递归当中,上面定义的临时变量是用来和周围棋子作比较的。下同
          函数(x-1,y);
       }
       if(x,y点的相邻右方有和它相同颜色的点)
      {
          去除x,y点的棋子。
          函数(x+1,y);
       }
      对x,y点上方和下方进行判断,和上面的一样就好了。
      
}

这个函数是在落下一个棋子的时候判断的,递归的判断是否相邻有相同颜色的点。
大致考虑了一下,应该没什么太大的问题。




不过按照你的说法,其实不用这样做也可以的。

因为按照你的说法,在落下新的棋子的之前,棋盘上是不会有相同颜色的棋子相邻的。

所以每次落下一子的时候你只需要判断它的周围相邻的是否和它相同即可了。没必要再去判断其他棋子的相邻是否还有相同的,因为那些棋子的相邻是不会有相同的棋子的。

除非你自己设定的在什么时候开始消除颜色相同的,那样的话,用前面说的那个递归的,否则的话,每落一子,判断其周围4个相邻位置就行了。
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

作品发布|文章投稿|广告合作|关于本站|游戏开发论坛 ( 闽ICP备17032699号-3 )

GMT+8, 2026-1-25 20:48

Powered by Discuz! X3.4

Copyright © 2001-2021, Tencent Cloud.

快速回复 返回顶部 返回列表