围棋打谱软件中自动提子功能的实现,C/C++源码
本文首发地址:http://blog.csdn.net/liigo/archive/2009/09/22/4582018.aspx
转载请注明出处:http://blog.csdn.net/liigo
作者:liigo, 2009/09/22
在下围棋时,当一个棋子落到棋盘上,它会对周围对方棋子的死活产生影响,如果对方棋子没有气了(死了),必须从棋盘上拿掉(提子)。这个过程体现到围棋软件中,就需要通过程序代码判断某一个棋子或某一片棋子的死活状态,进而把死掉的棋子从棋盘上移除。
进一步分析的话,刚落下的棋子,只可能威胁到周围与其紧临的上下左右方向的四个对方棋子(也可能是三个或两个,如在边角的话),而这四个方向上的对方棋子,可能是孤立的一个棋子,也可能是多个棋子相连的一片棋子(一块棋)。要判断一块棋是否还活着,需要逐个检查这块棋中的每一个棋子:如果其中某个棋子旁边没有棋子,说明这块棋至少还有一口气,因而确定它还没有死;如果检查完这块棋中的所有棋子,始终不能找到一口气,可以确定这整块棋都死掉了。看上去这是一个需要采用递归处理的情况。递归处理整块棋时,切记需要记录已经处理过的棋子,不能重复处理同一个棋子,否则可能会导致循环递归、死递归的情况发生。一旦确定了棋子的生死,从棋盘上拿掉它是很容易的事情,只是在程序中做一些标记而已。
注意,我(liigo)这里说的某块棋“还活着”,并不等同于围棋术语中的“已做活”,而只是表示这块棋“暂时还没有死”,至于将来会不会死,不在现在的处理范围之内。别忘了,我们的目标是“如果棋子死了,把它从棋盘上拿掉”,既然还没死(或没死绝),又何必管它呢(如果非要提前提子,反而违反围棋规则了)。
以下C/C++源代码,实现了上面说到的自动提子功能。
//处理刚落下的子对周边对方子的死活影响
void processLiving(int row, int col)
{
StoneColor color = m_board[row-1][col-1];
assert(color != SC_BLANK);
StoneColor otherColor = (color == SC_BLACK ? SC_WHITE : SC_BLACK);
if(m_killedStones[m_stoneIndex] == NULL)
m_killedStones[m_stoneIndex] = new BufferedMem(20);
BufferedMem* pKilledStones = m_killedStones[m_stoneIndex];
pKilledStones->Empty();
//如果周边是对方的子, 则检查其死活情况, 死了的拿掉
BufferedMem stoneIndexList;
if(row>1 && m_board[row-1-1][col-1]==otherColor && checkL
相关文档:
n 用标识符代表一个常量,称为符号常量。 n 符号常量与变量不同,它的值在其作用域内不能改变,也不能再被赋值。 n 使用符号常量的好处是: Ø 含义清楚; Ø 能做到“一改全改”。 --话说:不知道c里面有没有全局变量的东东,有的话,这两个的实际用处有啥子区别呢?看看再说 数据结构+算法=程序 终于知道这 ......
最近在网上查了好多关于C播放wav这方面的资料,调试半天也没有结果,搜到一个编译好的EXE文件能播放,没有源代码,反汇编不了,谁能指点一下。。。。。以下两种代码段:
#include <stdio.h>
#include <dos.h>
/* wav文件结构 */
typedef struct WaveData
{
unsigned long sample_le ......
栈:函数调用的时候,在栈中保存局部变量和函数参数等。当函数返回时,自动清除栈。
自由存储区:也称为堆(heap),可以看作大量的内存段。通过 new 操作符分配的内存在堆中。程序结束之前不自动清除自由存储区。需要由程序来负责释放(delete)。
1.
对指向栈上内存的指针调用delete会导致程序Crash。
2.
new 进 ......
#include "stdio.h"
#include "math.h"
#include "time.h"
#define INTERVAL 1 定义宏的时间间隔为1秒
//
void On_Time() //每一秒激发的事件
{
printf("now=%s\n","JJK");
}
void Timer() //时钟的函数
{ time_t newclk,oldclk;
while(1)
&nb ......
新人刚开始玩最好建个免费号先熟悉下游戏,先把新手教程做玩,教程要慢慢做,把每一步教的都学到。我强烈BS做完教程还不会完说教程不好的人,以前我完欧服都是做完教程就能开始完了,我还是用的金山快译2002的,嘎嘎。
言归正传,新人做完教程最后的2个任务手上该有10W多了(最后的那个代理人任务不做教程也可以直接做), ......