因为它用的是超级计算机,而不是普通的电脑,一秒有数万次的运算的能力,比人脑不知快多少倍,所以能超过人也是很正常的。
希望对你有所帮助,祝你快乐~~
我是学计算机的,呵呵,其实这个问题很有趣的呢^_^中国的象棋我还不是很清楚,我目前所知道的最牛的机子名叫【深蓝】,战胜了国际象棋大师【卡斯帕罗夫】,详细资料如下
http://www.wst.net.cn/history/5.11/10.htm
其实,计算机本身是没有只能的,之所以他能够拥有下棋的能力,是因为我们预先教会了他,通过程序语言,实现了我们跟计算机之前的对话,就好像我们告诉他:
如果别人走马,你就走马,如果别人走象,你就走象一样……
在计算机中,是通过程序语言来实现的,格式是
if......then......
else if......then.......
就跟上面的如果怎么样就怎么样是一样的了,这样计算机就懂得在不同情况下如何处理了哦^_^
希望姐姐的解释还比较清晰^_^
【补充来了】^_^
思路1,平均每方每步可有35种走法。50回合。
思路2,棋盘上90个点,各点可走的点。如车可以走到任意一点。
按照思路一的算法 往多了算
一盘棋有50回合,也就是100步,每步有50种变化
一共的变化数就是50的100次方
就算少算一点
一盘棋有20回合,也就是40步,每步10种变化
一共的变化数是10的40次方
这个数也足够大了,就是1后面跟着40个0
【也就是说,别人走了一步以后,你有多少种可能的走法,计算机会去计算,然后择优录取】
给你个算法吧,我们实验课上经常做这些^_^
#include "StdAfx.h"
#include "Calculate.h"
#include "MantisChessThink.h"
#include "string.h"
#include "stdio.h"
/*************************************************************************
把Think重新包装一下,进行坐标变换,希望以后其他人的算法的接口都采用这个函数
这样的编译出来的DLL可以直接替换原来的CChessThinker.dll
timespan是思考的限定时间,以毫秒为单位,时间不同可能导致不同的思考策略。
本程序中的算法没有使用这一变量。
**************************************************************************/
BOOL Calculate(char* map,int timespan,int&x1,int&y1,int&x2,int&y2)
{
//BOOL Thinking(int tmap[11][12],POINT tmanposition[32],int &tside,int &resultman, POINT &resultpoint)
int tmap[11][12]
POINT manpoint[32]
int side=(int)map[0]-48
int resultman=32
POINT resultpoint={0,0}
for (int i = 0i <11i++)
{
for (int j = 0j <12j++)
{
tmap[i][j] = 32
}
}
for (int i = 0i <32i++)
{
manpoint[i].x=0
manpoint[i].y=0
}
int length=(int)strlen(map)
int index = 1
while (index <length)
{
int x =1 + ((int)map[index + 0]-48)//thinking的x从1到9
int y = 10 - ((int)map[index + 1]-48)//thinking的y从10到1
int color = (int)map[index + 2]-48//0-RED,1-BLAVK
int type = (int)map[index + 3]-48//0-6
int manIndex=0
if (color==0)
{
switch (type)
{
case 0:
manIndex=0
break
case 1:
if (manpoint[1].x==0) manIndex=1
else manIndex=2
break
case 2:
if (manpoint[3].x==0) manIndex=3
else manIndex=4
break
case 3:
if (manpoint[5].x==0) manIndex=5
else manIndex=6
break
case 4:
if (manpoint[7].x==0) manIndex=7
else manIndex=8
break
case 5:
if (manpoint[9].x==0) manIndex=9
else manIndex=10
break
case 6:
if (manpoint[11].x==0) manIndex=11
else if (manpoint[12].x==0) manIndex=12
else if (manpoint[13].x==0) manIndex=13
else if (manpoint[14].x==0) manIndex=14
else manIndex=15
break
}
}
else
{
switch (type)
{
case 0:
manIndex=16
break
case 1:
if (manpoint[17].x==0) manIndex=17
else manIndex=18
break
case 2:
if (manpoint[19].x==0) manIndex=19
else manIndex=20
break
case 3:
if (manpoint[21].x==0) manIndex=21
else manIndex=22
break
case 4:
if (manpoint[23].x==0) manIndex=23
else manIndex=24
break
case 5:
if (manpoint[25].x==0) manIndex=25
else manIndex=26
break
case 6:
if (manpoint[27].x==0) manIndex=27
else if (manpoint[28].x==0) manIndex=28
else if (manpoint[29].x==0) manIndex=29
else if (manpoint[30].x==0) manIndex=30
else manIndex=31
break
}
}
manpoint[manIndex].x=x
manpoint[manIndex].y=y
tmap[x][y]=manIndex
index += 4
}
//ShowInt(side)
//ShowInt(resultman)
//ShowInt(resultpoint.x)
//ShowInt(resultpoint.y)
BOOL b=Think( tmap,manpoint,side,resultman,resultpoint)
if (b)
{
x1=manpoint[resultman].x-1
y1=10-manpoint[resultman].y
x2=resultpoint.x-1
y2=10-resultpoint.y
}
return b
//return FALSE
}
BOOL test(char* x1)
{
return FALSE
}
void ShowInt(int i)
{
char buf[256]
sprintf(buf,"%d",i)
MessageBox(NULL,buf,"test",0)
}
void ShowString(char * t)
{
MessageBox(NULL,t,"test",0)
}
/ CChessThink.cpp : 定义 DLL 应用程序的入口点。
//
#include "stdafx.h"
#ifdef _MANAGED
#pragma managed(push, off)
#endif
BOOL APIENTRY DllMain( HMODULE hModule,
DWORD ul_reason_for_call,
LPVOID lpReserved
)
{
return TRUE
}
#ifdef _MANAGED
#pragma managed(pop)
#endif
Calculate.h
void ShowInt(int i)
void ShowString(char * t)
BOOL Calculate(char* map,int timespan,int&x1,int&y1,int&x2,int&y2)
MantisChessDef.h
const int MW=32,SW=1//MW-棋子宽度SW-棋子间隔的一半
const int BWA=MW+SW*2//BWA-棋格宽度
const int XBW=BWA*9,YBW=BWA*10//棋盘的长宽
const int MAN=0//人
const int COM=1//计算机
const int RED=0//红方
const int BLACK=1//黑方
const int RED_K=0//红帅
const int RED_S=1//仕
const int RED_X=2//相
const int RED_M=3//马
const int RED_J=4//车
const int RED_P=5//炮
const int RED_B=6//兵
const int BLACK_K=7//黑将
const int BLACK_S=8//士
const int BLACK_X=9//象
const int BLACK_M=10//马
const int BLACK_J=11//车
const int BLACK_P=12//炮
const int BLACK_B=13//卒
//以下是全局函数定义:
//把棋子序号转换为对应图标的序号
const int ManToIcon[33]= {0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6
,7,8,8,9,9,10,10,11,11,12,12,13,13,13,13,13,-1}
//棋子类型与图标的序号相同
#define ManToType ManToIcon
const int ManToType7[33]= {0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6
,0,1,1,2,2,3,3,4,4,5,5,6,6,6,6,6,-1}
//随即函数,返回小于n的随机整数
int rnd(const int&n)
//给出棋子序号!!,判断是红是黑
const int SideOfMan[33]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0
,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,1,-1}
const int _defaultmap[11][12]=
{
// [0][1][2][3][4][5][6][7][8][9][10][11]
{32,32,32,32,32,32,32,32,32,32,32,32},//[0]
{32,32,32,32,32,32,32,32,32,32,32,32},//[1]
{32,32,32,32,32,32,32,32,32,32,32,32},//[2]
{32,32,32,32,32,32,32,32,32,32,32,32},//[3]
{32,32,32,32,32,32,32,32,32,32,32,32},//[4]
{32,32,32,32,32,32,32,32,32,32,32,32},//[5]
{32,32,32,32,32,32,32,32,32,32,32,32},//[6]
{32,32,32,32,32,32,32,32,32,32,32,32},//[7]
{32,32,32,32,32,32,32,32,32,32,32,32},//[8]
{32,32,32,32,32,32,32,32,32,32,32,32},//[9]
{32,32,32,32,32,32,32,32,32,32,32,32}//[10]
}
const int FistOfSide[2]={0,16}
const int LastOfSide[2]={15,31}
const int MAXMOVE = 1000
struct MOVEHISTORY
{
int count
int man[MAXMOVE]
POINT from[MAXMOVE]
POINT to[MAXMOVE]
int betaken[MAXMOVE]
}
#include "StdAfx.h"
#include "MantisChessDef.h"
#include "MantisChessThink.h"
//-------------下面几项可以调试智能模块---------------------------
#define S_WIDTH 8
#define S_DEPTH 6
// 将 士 象 马 车 炮 兵
const int base[7]= {300,400,300,600, 1000,600,300}//平均价值
const int range[7]= {0 , 0, 0, 20, 10, 0, 50}//价值的变动范围
const int contactpercent1=20//防守的重视程度
const int contactpercent2=25//进攻的重视程度
/******************************************************************
例:把马设为平均价值200,变动范围±13%应设base[3]=200,range[3]=13
*******************************************************************/
//-----------------------------------------------------------------
const int BV1[7]=//基本价值
{
base[0]-base[0]*range[0]/100,
base[1]-base[1]*range[1]/100,
base[3]-base[2]*range[2]/100,
base[3]-base[3]*range[3]/100,
base[4]-base[4]*range[4]/100,
base[5]-base[5]*range[5]/100,
base[6]-base[6]*range[6]/100
}
const int BV2[7]=//活跃度
{
2*base[0]*range[0]/100/4,
2*base[1]*range[1]/100/4,
2*base[2]*range[2]/100/4,
2*base[3]*range[3]/100/8,
2*base[4]*range[4]/100/17,
2*base[5]*range[5]/100/17,
0,
}
const int BV3[5]=//兵在不同位置的价值附加
{
0*2*base[6]*range[6]/100/4,
1*2*base[6]*range[6]/100/4,
2*2*base[6]*range[6]/100/4,
3*2*base[6]*range[6]/100/4,
4*2*base[6]*range[6]/100/4,
}
#define NORED(i,j) (SideOfMan[tmap[i][j]]!=0)
#define NOBLACK(i,j) (SideOfMan[tmap[i][j]]!=1)
#define NOMAN(i,j) (tmap[i][j]==32)
//兵卒在不同位置的价值,数字越大价值越高
const int ManBPlus[2][12][11]=
{
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0},
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
},
{
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0},
{ 0, 0, 0, 1, 0, 0, 0, 1, 0, 0, 0},
{ 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 0},
{ 0, 1, 2, 3, 3, 3, 3, 3, 2, 1, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 1, 2, 3, 4, 4, 4, 3, 2, 1, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
{ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
}
}
//-------------------------------------------
static void ContactV(int tmap[11][12],POINT tmanposition[32],int &tside,int activity[32],int contact[32][32])
/******************************************************************
Mantis_QuickSort:对走法列表进行快速排序
参数:
A: 关键值
chessman: 待排序的棋子列表
targetpoint: 待排序的目标点列表
low,high: QuickSort上下限
返回值: 无
******************************************************************/
void Mantis_QuickSort(int A[],int chessman[],POINT targetpoint[],int low,int high)
{
int pivot
int pivot_man
POINT pivot_point
int scanUp,scanDown
int mid,k
POINT point
if(high-low<=0)
{
return
}
else
{
if(high-low==1)
{
if(A[high]>A[low])
{
k=A[high]
A[high]=A[low]
A[low]=k
k=chessman[high]
chessman[high]=chessman[low]
chessman[low]=k
point=targetpoint[high]
targetpoint[high]=targetpoint[low]
targetpoint[low]=point
return
}
}
}
mid=(low +high)/2
pivot=A[mid]
pivot_man=chessman[mid]
pivot_point=targetpoint[mid]
k=A[mid]
A[mid]=A[low]
A[low]=k
k=chessman[mid]
chessman[mid]=chessman[low]
chessman[low]=k
point=targetpoint[mid]
targetpoint[mid]=targetpoint[low]
targetpoint[low]=point
scanUp =low+1
scanDown = high
do{
while(scanUp<=scanDown &&A[scanUp]>=pivot)
scanUp++
while(pivot>A[scanDown])
scanDown--
if(scanUp<scanDown)
{
k=A[scanUp]
A[scanUp]=A[scanDown]
A[scanDown]=k
k=chessman[scanUp]
chessman[scanUp]=chessman[scanDown]
chessman[scanDown]=k
point=targetpoint[scanUp]
targetpoint[scanUp]=targetpoint[scanDown]
targetpoint[scanDown]=point
}
}while(scanUp<scanDown)
A[low]=A[scanDown]
A[scanDown]=pivot
chessman[low]=chessman[scanDown]
chessman[scanDown]=pivot_man
targetpoint[low]=targetpoint[scanDown]
targetpoint[scanDown]=pivot_point
if(low<scanDown-1)
Mantis_QuickSort(A,chessman,targetpoint,low,scanDown-1)
if(scanDown+1<high)
Mantis_QuickSort(A,chessman,targetpoint,scanDown+1,high)
}
/******************************************************************
Value: 估值函数
参数:
tmap: 各棋位状态
tmanposition: 32棋子的坐标
tside: 轮到哪一放走
返回值: 局面的价值
******************************************************************/
int Value(int tmap[11][12],POINT tmanposition[32],int &tside)
{
static int k
static int ManExtValue[32]
static int ManBaseValue[32]
static int ManContact[32][32]
static int BeAteCount[32]
static BOOL OwnSee[32]
ZeroMemory(ManContact,sizeof(int)*32*32)
ZeroMemory(ManBaseValue,sizeof(int)*32)
ZeroMemory(ManExtValue,sizeof(int)*32)
ZeroMemory(BeAteCount,sizeof(int)*32)
ZeroMemory(OwnSee,sizeof(int)*32)
int maxvalue=0
int i,j
ContactV(tmap,tmanposition,tside,ManBaseValue,ManContact)
//己方将军
for(i=FistOfSide[tside]i<=LastOfSide[tside]i++)
{
if(ManContact[i][FistOfSide[!tside]])
{
maxvalue=9700
return maxvalue
}
}
for(i=0i<32i++)
{
k=ManToType7[i]
ManBaseValue[i]=BV1[k]+ManBaseValue[i]*BV2[k]
switch(k)
{
case 6: ManBaseValue[i]+=BV3[ ManBPlus[SideOfMan[i]][tmanposition[i].y][tmanposition[i].x] ]
break
}
}
for(i=0i<32i++)
{
for(j=0j<32j++)
{
if(ManContact[i][j])
{
if(SideOfMan[i]==SideOfMan[j])
{
BeAteCount[j]++
if(!OwnSee[j])
{
ManExtValue[i]+=ManBaseValue[j]*contactpercent1/100//己方
OwnSee[j]=TRUE
}
}
else
{
ManExtValue[i]+=ManBaseValue[j]*contactpercent2/100//对方
BeAteCount[j]--
}
}
}
}
for(i=FistOfSide[tside]i<=LastOfSide[tside]i++)
{
if(tmanposition[i].x)maxvalue+=ManBaseValue[i]+ManExtValue[i]
}
static BOOL flag
flag=FALSEk=32
for(i=FistOfSide[!tside]i<=LastOfSide[!tside]i++)
{
if(tmanposition[i].x)maxvalue-=ManBaseValue[i]+ManExtValue[i]
//对方将军
if(ManContact[i][FistOfSide[tside]])
{
flag=TRUE
k=i
break
}
}
if(flag&&BeAteCount[k]>=0)//被将,所将军的棋子不能被吃掉
{
j=0
for(i=FistOfSide[tside]i<=LastOfSide[tside]i++)
{
if(BeAteCount[i]<0 &&ManBaseValue[i]>j)
j=ManBaseValue[i]
}
maxvalue -=j
}
else
{
j=0
for(i=FistOfSide[!tside]i<=LastOfSide[!tside]i++)
{
if(BeAteCount[i]<0 &&ManBaseValue[i]>j)
j=ManBaseValue[i]
}
maxvalue +=j
}
return maxvalue
}
/******************************************************************
EnumList: 列出所有走法
参数:
tmap: 各棋位状态
tmanposition: 32棋子的坐标
tside: 轮到哪一放走
chessman: 指向棋子列表的指针(存放结果)
move: 指向棋子所走到位置的指针,与chessman一起组成走法列表
(存放结果)
count: 走法的总数(存放结果)
返回值: “照相”返回TRUE,否则返回FALSE
******************************************************************/
BOOL EnumList(int tmap[11][12],POINT tmanposition[32],int &tside,int *chessman,POINT *move,int &count)
{
#define ADD(man,tx,ty) {chessman[count]=manmove[count].x=txmove[count].y=tycount++if(tmap[tx][ty]==FistOfSide[!tside])goto _NOKING}
static int i,j,n,x,y
static BOOL flag
count=0
for(n=FistOfSide[tside]n<=LastOfSide[tside]n++)
{
x=tmanposition[n].x
if(!x)continue
y=tmanposition[n].y
switch(n)
{
case 0:
if(tmanposition[0].x==tmanposition[16].x) //将帅在同一列
{
flag=FALSE
for(j=tmanposition[16].y+1j<tmanposition[0].yj++)
{
if(tmap[x][j]!=32)
{
flag=TRUE
break
}
}
if (!flag)
{
ADD(0,x,tmanposition[16].y)
}
}
j=y+1if(j<=10 &&NORED(x,j)) ADD(0,x,j)
j=y-1if(j>=8 &&NORED(x,j)) ADD(0,x,j)
i=x+1if(i<=6 &&NORED(i,y)) ADD(0,i,y)
i=x-1if(i>=4 &&NORED(i,y)) ADD(0,i,y)
break
case 16:
if(tmanposition[0].x==tmanposition[16].x) //将帅在同一列
{
flag=FALSE
for(j=tmanposition[16].y+1j<tmanposition[0].yj++)
{
if(tmap[x][j]!=32)
{
flag=TRUE
break
}
}
if (!flag)
{
ADD(16,x,tmanposition[0].y)
}
}
j=y+1if(j<=3 &&NOBLACK(x,j)) ADD(16,x,j)
j=y-1if(j>=1 &&NOBLACK(x,j)) ADD(16,x,j)
i=x+1if(i<=6 &&NOBLACK(i,y)) ADD(16,i,y)
i=x-1if(i>=4 &&NOBLACK(i,y)) ADD(16,i,y)
break
case 1:
case 2:
i=x+1j=y+1if(i<=6 &&j<=10 &&NORED(i,j)) ADD(n,i,j)
i=x+1j=y-1if(i<=6 &&j>=8 &&NORED(i,j)) ADD(n,i,j)
i=x-1j=y+1if(i>=4 &&j<=10 &&NORED(i,j)) ADD(n,i,j)
i=x-1j=y-1if(i>=4 &&j>=8 &&NORED(i,j)) ADD(n,i,j)
break
case 17:
case 18:
i=x+1j=y+1if(i<=6 &&j<=3 &&NOBLACK(i,j)) ADD(n,i,j)
i=x+1j=y-1if(i<=6 &&j>=1 &&NOBLACK(i,j)) ADD(n,i,j)
i=x-1j=y+1if(i>=4 &&j<=3 &&NOBLACK(i,j)) ADD(n,i,j)
i=x-1j=y-1if(i>=4 &&j>=1 &&NOBLACK(i,j)) ADD(n,i,j)
break
case 3:
case 4:
i=x+2j=y+2if(i<=9 &&j<=10 &&NORED(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
i=x+2j=y-2if(i<=9 &&j>=6 &&NORED(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
i=x-2j=y+2if(i>=1 &&j<=10 &&NORED(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
i=x-2j=y-2if(i>=1 &&j>=6 &&NORED(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
break
case 19:
case 20:
i=x+2j=y+2if(i<=9 &&j<=5 &&NOBLACK(i,j)) if(NOMAN(x+1,y+1)) ADD(n,i,j)
i=x+2j=y-2if(i<=9 &&j>=1 &&NOBLACK(i,j)) if(NOMAN(x+1,y-1)) ADD(n,i,j)
i=x-2j=y+2if(i>=1 &&j<=5 &&NOBLACK(i,j)) if(NOMAN(x-1,y+1)) ADD(n,i,j)
i=x-2j=y-2if(i>=1 &&j>=1 &&NOBLACK(i,j)) if(NOMAN(x-1,y-1)) ADD(n,i,j)
break
case 5:
case 6:
i=x+1
if(NOMAN(i,y))
{
i=x+2j=y+1if(i<=9 &&j<=10 &&NORED(i,j)) ADD(n,i,j)
i=x+2j=y-1if(i<=9 &&j>=1 &&NORED(i,j)) ADD(n,i,j)
}
i=x-1
if(NOMAN(i,y))
{
i=x-2j=y+1if(i>=1 &&j<=10 &&NORED(i,j)) ADD(n,i,j)
i=x-2j=y-1if(i>=1 &&j>=1 &&NORED(i,j)) ADD(n,i,j)
}
j=y+1
if(NOMAN(x,j))
{
i=x+1j=y+2if(i<=9 &&j<=10 &&NORED(i,j)) ADD(n,i,j)
i=x-1j=y+2if(i>=1 &&j<=10 &&NORED(i,j)) ADD(n,i,j)
}
j=y-1
if(NOMAN(x,j))
{
i=x+1j=y-2if(i<=9 &&j>=1 &&NORED(i,j)) ADD(n,i,j)
i=x-1j=y-2if(i>=1 &&j>=1 &&NORED(i,j)) ADD(n,i,j)
}
break
case 21:
case 22:
i=x+1
if(NOMAN(i,y))
{
i=x+2j=y+1if(i<=9 &&j<=10 &&NOBLACK(i,j)) ADD(n,i,j)
i=x+2j=y-1if(i<=9 &&j>=1 &&NOBLACK(i,j)) ADD(n,i,j)
}
i=x-1
if(NOMAN(i,y))
{
i=x-2j=y+1if(i>=1 &&j<=10 &&NOBLACK(i,j)) ADD(n,i,j)
i=x-2j=y-1if(i>=1 &&j>=1 &&NOBLACK(i,j)) ADD(n,i,j)
}
j=y+1
if(NOMAN(x,j))
{
i=x+1j=y+2if(i<=9 &&j<=10 &&NOBLACK(i,j)) ADD(n,i,j)
i=x-1j=y+2if(i>=1 &&j<=10 &&NOBLACK(i,j)) ADD(n,i,j)
}
j=y-1
if(NOMAN(x,j))
{
i=x+1j=y-2if(i<=9 &&j>=1 &&NOBLACK(i,j)) ADD(n,i,j)
i=x-1j=y-2if(i>=1 &&j>=1 &&NOBLACK(i,j)) ADD(n,i,j)
}
break
case 7:
case 8:
i=x+1
while(i<=9)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NORED(i,y)) ADD(n,i,y)
break
}
i++
}
i=x-1
while(i>=1)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NORED(i,y)) ADD(n,i,y)
break
}
i--
}
j=y+1
while(j<=10)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NORED(x,j)) ADD(n,x,j)
break
}
j++
}
j=y-1
while(j>=1)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NORED(x,j)) ADD(n,x,j)
break
}
j--
}
break
case 23:
case 24:
i=x+1
while(i<=9)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NOBLACK(i,y)) ADD(n,i,y)
break
}
i++
}
i=x-1
while(i>=1)
{
if (NOMAN(i,y)) ADD(n,i,y)
else
{
if(NOBLACK(i,y)) ADD(n,i,y)
break
}
i--
}
j=y+1
while(j<=10)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NOBLACK(x,j)) ADD(n,x,j)
break
}
j++
}
j=y-1
while(j>=1)
{
if (NOMAN(x,j)) ADD(n,x,j)
else
{
if(NOBLACK(x,j)) ADD(n,x,j)
break
}
j--
}
break
case 9:
case 10:
i=x+1flag=FALSE
while(i<=9)
{
if(NOMAN(i,y))
{
if(!flag) ADD(n,i,y)
}
else
{
if(!flag)flag=TRUE
else
{
if(NORED(i,y)) ADD(n,i,y)
break
}
}
i++
}
i=x-1flag=FALSE
while(i>=1)
{
if(NOMAN(i,y))
{
if(!flag) ADD(n,i,y)
}
else
{
if(!flag)flag=TRUE
else
{
if(NORED(i,y)) ADD(n,i,y)
break
}
}
i--
}
j=y+1flag=FALSE
while(j<=10)
{
if(NOMAN(x,j))
{
if(!flag) ADD(n,x,j)
【我是学c++的】呵呵,加了注释,你应该能明白一点^_^