c++五子棋悔棋代码(c语言五子棋怎么实现悔棋)
五子棋C语言代码
五子棋C语言代码如下:
#include stdio.h
#include bios.h
#include ctype.h
#include conio.h
#include dos.h
#define CROSSRU 0xbf /*右上角点*/
#define CROSSLU 0xda /*左上角点*/
#define CROSSLD 0xc0 /*左下角点*/
#define CROSSRD 0xd9 /*右下角点*/
#define CROSSL 0xc3 /*左边*/
#define CROSSR 0xb4 /*右边*/
#define CROSSU 0xc2 /*上边*/
#define CROSSD 0xc1 /*下边*/
#define CROSS 0xc5 /*十字交叉点*/
/*定义棋盘左上角点在屏幕上的位置*/
#define MAPXOFT 5
#define MAPYOFT 2
/*定义1号玩家的操作键键码*/
#define PLAY1UP 0x1157/*上移--'W'*/
#define PLAY1DOWN 0x1f53/*下移--'S'*/
#define PLAY1LEFT 0x1e41/*左移--'A'*/
#define PLAY1RIGHT 0x2044/*右移--'D'*/
#define PLAY1DO 0x3920/*落子--空格键*/
/*定义2号玩家的操作键键码*/
#define PLAY2UP 0x4800/*上移--方向键up*/
#define PLAY2DOWN 0x5000/*下移--方向键down*/
#define PLAY2LEFT 0x4b00/*左移--方向键left*/
#define PLAY2RIGHT 0x4d00/*右移--方向键right*/
#define PLAY2DO 0x1c0d/*落子--回车键Enter*/
/*若想在游戏中途退出, 可按 Esc 键*/
#define ESCAPE 0x011b
/*定义棋盘上交叉点的状态, 即该点有无棋子 */
/*若有棋子, 还应能指出是哪个玩家的棋子 */
#define CHESSNULL 0 /*没有棋子*/
#define CHESS1 'O'/*一号玩家的棋子*/
#define CHESS2 'X'/*二号玩家的棋子*/
/*定义按键类别*/
#define KEYEX99v 0/*退出键*/
#define KEYFALLCHESS 1/*落子键*/
#define KEYMOVECURSOR 2/*光标移动键*/
#define KEYINVALID 3/*无效键*/
/*定义符号常量: 真, 假 --- 真为1, 假为0 */
#define TRUE 1
#define FALSE 0
/**********************************************************/
/* 定义数据结构 */
/*棋盘交叉点坐标的数据结构*/
struct point
{
int x,y;
};
或者下面这个:
#include graphics.h
#include stdlib.h
#include stdio.h
#include conio.h
#define N 15
#define B 7
#define STOP -10000
#define OK 1
#define NO 0
#define UP 328
#define DOWN 336
#define LEFT 331
#define RIGHT 333
int a[N+1][N+1];
int zx,zy;
int write=1,biaoji=0;
struct zn{
long sum;
int y;
int x;
}w[N+1][N+1],max,max1;
void cbar(int i,int x,int y,int r);
void map(int a[][]);
int getkey();
int key();
void zuobiao(int x,int y,int i);
int tu(int a[][],int write);
int wtu(int a[][],int write);
int zhineng(int a[][]);
int zh5(int y,int x,int a[][]);
long zzh5(int b[][],int i);
main()
{
int i,j;
int gdriver=DETECT;
int gmode;
initgraph(gdriver,gmode,"");
zx=(N+1)/2;
zy=(N+1)/2;
for(i=1;i=N;i++)
for(j=1;j=N;j++)
a[i][j]=0;
map(a);
i=1;
while(i)
{
int k,n;
k=wtu(a,write);
if(k==STOP) goto end;
map(a);
n=zhineng(a);
if(n==STOP) goto end;
map(a);
}
end:
;
}
int zhineng(int a[N+1][N+1])
{
int i,j;
int k;
max.sum=-1;
for(i=0;i=N;i++)
for(j=0;j+N;j++)
{
w[i][j].sum=0;
w[i][j].x=i;
w[i][j].y=j;
}
for(i=1;i=N-4;i++)
for(j=1;j=N-4;j++)
{
k=zh5(i,j,a);
if(k==STOP) return (STOP);
}
for(i=1;i=N;i++)
for(j=1;j=N;j++)
{
if(max.sumw[i][j].sum)
{
max.sum=w[i][j].sum;
max.y=i;
max.x=j;
}
else if(max.sum==w[i][j].sum)
{
if(((max.y-zy)*(max.y-zy)+(max.x-zx)*(max.x-zx))((i-zy)*(i-zy)+(j-zx)*(j-zx)))
max.sum=w[i][j].sum;
max.y=i;
max.x=j;
}
}
if(a[max.y][max.x]==0)
{
a[max.y][max.x]=-1;
zy=max.y;
zx=max.x;
}
}
int zh5(int y,int x,int a[N+1][N+1])
{
int i,j;
int b[6][6];
long c[13];
long d[6][6];
long temp;
for(i=y;i=y+4;i++)
for(j=x;j=x+4;j++)
b[i+1-y][j+1-x]=a[i][j];
c[1]=b[1][1]+b[1][2]+b[1][3]+b[1][4]+b[1][5];
c[2]=b[2][1]+b[2][2]+b[2][3]+b[2][4]+b[2][5];
c[3]=b[3][1]+b[3][2]+b[3][3]+b[3][4]+b[3][5];
c[4]=b[4][1]+b[4][2]+b[4][3]+b[4][4]+b[4][5];
c[5]=b[5][1]+b[5][2]+b[5][3]+b[5][4]+b[5][5];
c[6]=b[1][1]+b[2][1]+b[3][1]+b[4][1]+b[5][1];
c[7]=b[1][2]+b[2][2]+b[3][2]+b[4][2]+b[5][2];
c[8]=b[1][3]+b[2][3]+b[3][3]+b[4][3]+b[5][3];
c[9]=b[1][4]+b[2][4]+b[3][4]+b[4][4]+b[5][4];
c[10]=b[1][5]+b[2][5]+b[3][5]+b[4][5]+b[5][5];
c[11]=b[1][1]+b[2][2]+b[3][3]+b[4][4]+b[5][5];
c[12]=b[1][5]+b[2][4]+b[3][3]+b[4][2]+b[5][1];
for(i=1;i=12;i++)
{
switch(c[i])
{
case 5:biaoji=1;return(STOP);
case -5:biaoji=-1;return(STOP);
case -4:c[i]=100000;break;
case 4:c[i]=100000;break;
case -3:c[i]=150;break;
case 3:c[i]=150;break;
case -2:c[i]=120;break;
case 2:c[i]=100;break;
case -1:c[i]=1;break;
case 1:c[i]=1;break;
default: c[i]=0;
}
}
for(i=1;i=12;i++)
{
if(c[i]==150)
c[i]+=zzh5(b,i);
}
for(i=1;i=5;i++)
for(j=1;j=5;j++)
d[i][j]=0;
for(i=1;i=5;i++)
for(j=1;j=5;j++)
{
if(i==j) d[i][j]+=c[11];
if((i+j)==6) d[i][j]+=c[12];
d[i][j]+=c[i]+c[j+5];
}
for(i=1;i=5;i++)
for(j=1;j=5;j++)
{
if(b[i][j]!=0)
d[i][j]=-2;
}
max1.sum=-1;
max1.y=0;
max1.x=0;
for(i=1;i=5;i++)
for(j=1;j=5;j++)
{
if(max1.sumd[i][j])
{
max1.sum=d[i][j];
max1.y=i;
max1.x=j;
w[i+y-1][j+x-1].sum+=max1.sum;
}
else if(max1.sum==d[i][j])
{
if(((i+y-1-zy)*(i+y-1-zy)+(j+x-1-zx)*(j+x-1-zx))((max1.y+y-1-zy)*(max1.y+y-1-zy)+(max1.x+x-1-zx)*(max1.x+x-1-zx)))
{
max1.sum=d[i][j];
max1.y=i;
max1.x=j;
}
}
}
}
long zzh5(int b[6][6],int n)
{
int i,j,k,l,m;
switch(n)
{
case 1:i=b[1][1];j=b[1][2];k=b[1][3];l=b[1][4];m=b[1][5];break;
case 2:i=b[2][1];j=b[2][2];k=b[2][3];l=b[2][4];m=b[2][5];break;
case 3:i=b[3][1];j=b[3][2];k=b[3][3];l=b[3][4];m=b[3][5];break;
case 4:i=b[4][1];j=b[4][2];k=b[4][3];l=b[4][4];m=b[4][5];break;
case 5:i=b[5][1];j=b[5][2];k=b[5][3];l=b[5][4];m=b[5][5];break;
case 6:i=b[1][1];j=b[2][1];k=b[3][1];l=b[4][1];m=b[5][1];break;
case 7:i=b[1][2];j=b[2][2];k=b[3][2];l=b[4][2];m=b[5][2];break;
case 8:i=b[1][3];j=b[2][3];k=b[3][3];l=b[4][3];m=b[5][3];break;
case 9:i=b[1][4];j=b[2][4];k=b[3][4];l=b[4][4];m=b[5][4];break;
case 10:i=b[1][5];j=b[2][5];k=b[3][5];l=b[4][5];m=b[5][5];break;
case 11:i=b[1][1];j=b[2][2];k=b[3][3];l=b[4][4];m=b[5][5];break;
case 12:i=b[1][5];j=b[2][4];k=b[3][3];l=b[4][2];m=b[5][1];break;
}
if((i==0j==1k==1l==1m==0))
return (900);
if((i==0j==-1k==-1l==-1m==0))
return(1000);
if((i==0j==0k==1l==1m==1)||(i==1j==1k==1l==0m==0))
return(20);
if((i==0j==0k==-1l==-1m==-1)||(i==-1j==-1k==-1l==0m==0))
return(20);
if((i==-1j==1k==1l==1m==1)||(i==1j==-1k==1l==1m==1)||(i==1j==1k==-1l==1m==1)||(i==1j==1k==1l==-1m==1)||(i==1j==1k==1l==1m==-1))
return(-60);
if((i==1j==-1k==-1l==-1m==-1)||(i==-1j==1k==-1l==-1m==-1)||(i==-1j==1k==-1l==-1m==-1)||(i==-1j==-1k==-1l==1m==-1)||(i==-1j==-1k==-1l==-1m==1))
return(-60);
}
int wtu(int a[N+1][N+1],int write)
{
int i=1;
map(a);
zuobiao(zx,zy,1);
while(i)
{
int k;
k=tu(a,write);
if(k==OK) i=0;
if(k==STOP) return (STOP);
}
}
int getkey()
{
int key,lo,hi;
key=bioskey(0);
lo=key0x00ff;
hi=(key0xff00)8;
return((lo==0) ? hi+256:lo);
}
int key()
{
int k;
k=getkey();
switch(k)
{
case 27: return (STOP);
case 13:
case ' ': return (OK);
case 328: return (UP);
case 336: return (DOWN);
case 331: return (LEFT);
case 333: return (RIGHT);
default: return (NO);
}
}
void zuobiao(int x,int y,int i)
{
int r;
if(i!=0)
{
setcolor(GREEN);
for(r=1;r=5;r++)
circle(75+25*x,25+25*y,r);
}
else
{
if(a[zy][zx]==1)
{
setcolor(8);
for(r=1;r=5;r++)
circle(75+25*x,25+25*y,r);
}
else if(a[zy][zx]==-1)
{
setcolor(WHITE);
for(r=1;r=5;r++)
circle(75+25*x,25+25*y,r);
}
else
{
setcolor(B);
for(r=1;r=5;r++)
circle(75+25*x,25+25*y,r);
setcolor(RED); line(75+25*zx-5,25+25*zy,75+25*x+5,25+25*zy);
line(75+25*zx,25+25*zy-5,75+25*zx,25+25*zy+5);
}
}
}
int tu(int a[N+1][N+1],int write)
{
int k;
re:
k=key();
if(k==OK)
{
if(a[zy][zx]==0)
{
a[zy][zx]=write;
}
else
goto re;
}
if(k==STOP) return(STOP);
if(k==NO) goto re;
if(k==UP)
{
int i,j;
if(zy==1) j=zy;
else j=zy-1;
zuobiao(zx,zy,0);
zuobiao(zx,j,1);
zy=j;
goto re;
}
if(k==DOWN)
{
int i,j;
if(zy==N) j=zy;
else j=zy+1;
zuobiao(zx,zy,0);
zuobiao(zx,j,1);
zy=j;
goto re;
}
if(k==LEFT)
{
int i,j;
if(zx==1) i=zx;
else i=zx-1;
zuobiao(zx,zy,0);
zuobiao(i,zy,1);
zx=i;
goto re;
}
if(k==RIGHT)
{
int i,j;
if(zx==N) i=zx;
else i=zx+1;
zuobiao(zx,zy,0);
zuobiao(i,zy,1);
zx=i;
goto re;
}
}
void cbar(int i,int x,int y,int r)
{
if(i!=0)
{
if(i==1)
setcolor(8);
else if(i==-1)
setcolor(WHITE);
for(i=1;i=r;i++)
{
circle(x,y,i);
}
}
}
void map(int a[N+1][N+1])
{
int i,j;
cleardevice();
setbkcolor(B);
setcolor(RED);
for(i=0;iN;i++)
{
line(100,50+25*i,75+N*25,50+25*i);
line(100+25*i,50,100+25*i,25+N*25);
}
for(i=1;i=N;i++)
for(j=1;j=N;j++)
cbar(a[i][j],75+25*j,25+25*i,10);
}
C++如何用栈实现五子棋的悔棋功能
落子的时候坐标入栈,绘制棋子。
悔棋的时候坐标出栈,把该坐标的棋子抹去。
急~C语言五子棋 清屏.悔棋
1
头文件:includestdilb.h
命令: system("cly");
ps:你保存棋盘的数组有没有清空了?
2
你可以创建两个变量x,y保存上次落子的坐标。悔棋时把他清空就行了。具体的代码要结合你的源文件。就不多说了。而且思考不能代劳。
C/C++五子棋问题,高手请指教
#include?Windows.h
#include?string
#include?list
using?namespace?std;
//函数声明
LRESULT?CALLBACK?WindowProcedure(HWND,UINT,WPARAM,LPARAM);
void?InitChess(); //初始化棋盘
void?ComputerMove(); //电脑落子
bool?CheckChess(); //检查棋盘是否有空余位置
bool?WinCheck(); //胜利检查
int?P(int); //返回某点棋子
int?P(int,?int); //返回某点棋子
int?P2I(int,int); //转换二维索引为一维索引
int?GetN(int?i,int?d); //获取一个棋子的某一个方向上的棋子坐标。
char?ge(int?a,int?p); //判断是己方棋子(1)还是障碍(2,对方棋子或棋盘外围)还是空位(0),a为待判断棋子,p为己方棋子。
int?CountV(int?i,?int?d,?int?pl); //计数一个落子处某个方向上的权重值。
int?GetBest(); //获取最佳落子点
//定义变量
char?szClassName[]?=?"CFive"; //Class?Name
int?chess[225]; //1为玩家棋子,-1为电脑棋子,0为空。
listint?fallen; //已落棋子,用于后期添加悔棋功能。
listint?r; //列表用于保存所有拥有相同最大权值的点用于随机抽取
listint::iterator?it; //迭代器
int?state?=?1; //表示当前状态,1:玩家下棋,2:电脑下棋,3:胜利,4:失败
//画刷
HBRUSH?hbr?=?CreateSolidBrush(0x0000ff); //红色画刷(标记上次落子)
HBRUSH?hbw?=?CreateSolidBrush(0xffffff); //白色画刷(画白棋)
HBRUSH?hbb?=?CreateSolidBrush(0x000000); //黑色画刷(画黑棋)
HPEN?hp?=?CreatePen(PS_SOLID,?1,?0x000000); //1宽度黑色画笔(画棋盘,棋子边框)
HPEN?hp2?=?CreatePen(PS_SOLID,?2,?0x000000); //2宽度黑色画笔(画棋盘边框)
//核心数据,影响整个AI判断
//棋型列表
string?cl[]?=?{"11111",?"011110",?"11110",?"11101",?"11011",?"011100",?"011010",?"11100",?"10110",?"11010",?"10101",?"001100",?"011000",?"010100",?"01100",?"010010",?"11000",?"10100"};
//电脑对应棋型的权重
int?cv[]?=?{1000000,?100000,?2500,?2800,?2600,?3100,?3000,?550,?800,?550,?570,?650,?600,?450,?300,?200,?120,?120};
//玩家对应棋型的权重
int?pv[]?=?{900000,?90000,?2500,?2450,?2600,?2850,?2800,?450,?700,?460,?490,?600,?500,?350,?200,?40,?40,?40};
int?WINAPI?WinMain(HINSTANCE?hThisInstance,
???HINSTANCE?hPrevInstance,
???LPSTR?lpszArgument,
???int?nFunsterStil)
{
HWND?hwnd; //窗口句柄
MSG?messages;
WNDCLASSEX?wincl;
wincl.hInstance?=?hThisInstance;
wincl.lpszClassName?=?szClassName;
wincl.lpfnWndProc?=?WindowProcedure;
wincl.style?=?CS_DBLCLKS;
wincl.cbSize?=?sizeof(WNDCLASSEX);
wincl.hIcon?=?LoadIcon(NULL,?IDI_APPLICATION);
wincl.hIconSm?=?LoadIcon(NULL,?IDI_APPLICATION);
wincl.hCursor?=?LoadCursor(NULL,?IDC_ARROW);
wincl.lpszMenuName?=?NULL;
wincl.cbClsExtra?=?0;
wincl.cbWndExtra?=?0;
wincl.hbrBackground?=??(HBRUSH)COLOR_BACKGROUND; //窗体背景色
InitChess(); //初始化棋盘
if(!RegisterClassEx(wincl))
return?-1; //注册失败
hwnd?=?CreateWindowEx(
0,
szClassName, //窗体类名
"五子棋", //窗体标题
WS_OVERLAPPED|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX, //窗体样式
CW_USEDEFAULT, //左坐标
CW_USEDEFAULT, //顶坐标
340, //宽
360, //高
HWND_DESKTOP, //父窗体
NULL, //菜单
hThisInstance, //实例句柄
NULL
);
ShowWindow(hwnd,?nFunsterStil);
//消息循环
while(GetMessage(messages,NULL,0,0)){
TranslateMessage(messages);
DispatchMessage(messages);
}
return?messages.wParam;
}
LRESULT?CALLBACK?WindowProcedure(HWND?hwnd,?UINT?message,?WPARAM?wParam,?LPARAM?lParam)
{
HDC?hdc; //设备上下文句柄
PAINTSTRUCT?ps;
char?str[3]; //坐标轴上的文字
//x,y分别为相对棋盘的坐标
int?x?=?(LOWORD(lParam)-15)/20;
int?y?=?(HIWORD(lParam)-15)/20;
switch(message)
{
case?WM_DESTROY:
PostQuitMessage(0);
break;
case?WM_PAINT:
hdc?=?BeginPaint(hwnd,?ps);
SetBkMode(hdc,TRANSPARENT);
SelectObject(hdc,hp2);
MoveToEx(hdc,21,21,NULL);
LineTo(hdc,21,308);
LineTo(hdc,308,308);
LineTo(hdc,308,21);
LineTo(hdc,21,21); //棋盘边框
SelectObject(hdc,hp);
SelectObject(hdc,hbb);
Ellipse(hdc,82,82,87,87);
Ellipse(hdc,242,82,247,87);
Ellipse(hdc,242,242,247,247);
Ellipse(hdc,82,242,87,247);
Ellipse(hdc,162,162,167,167);
for(int?i=0;i15;i++){
str[0]=i+65;
TextOut(hdc,i*20+20,5,str,1); //画出字母序号
_ltoa_s(i+1,str,10);
TextOut(hdc,i=9?1:10,i*20+20,str,(i+1)/10+1); //画出数字序号
MoveToEx(hdc,24,i*20+24,NULL);
LineTo(hdc,304,i*20+24);
MoveToEx(hdc,i*20+24,24,NULL);
LineTo(hdc,i*20+24,304); //画出棋盘
}
for(int?i=0;i15;i++) //遍历棋盘,画出棋子
for(int?j=0;j15;j++){
switch(P(i,j)){
case?1: //黑棋
SelectObject(hdc,hbb);
Ellipse(hdc,i*20+15,j*20+15,i*20+18+15,j*20+18+15);
break;
case?-1: //白棋
SelectObject(hdc,hbw);
Ellipse(hdc,i*20+15,j*20+15,i*20+18+15,j*20+18+15);
break;
}
if(!fallen.empty()fallen.back()==P2I(i,j)){
SelectObject(hdc,hbr);
Ellipse(hdc,i*20+19,j*20+19,i*20+10+19,j*20+10+19);
}
}
SelectObject(hdc,CreateFont(30,0,0,0,FW_BLACK,false,false,false,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,"宋体"));
if(state2)TextOut(hdc,100,30,state==3?"玩家获胜!":"电脑获胜!",10);
SelectObject(hdc,CreateFont(20,0,0,0,FW_BLACK,false,false,false,GB2312_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,FIXED_PITCH,"宋体"));
if(state2)TextOut(hdc,105,60,"单击以继续...",13);
EndPaint(hwnd,ps); //结束绘制
if(state==2){ //轮到电脑落子
ComputerMove();
state=WinCheck()?4:1; //更新状态
InvalidateRect(hwnd,NULL,true); //重绘窗体
}
break;
case?WM_LBUTTONUP:
switch(state){
case?3:
case?4:
state=1; //单击以继续
InitChess(); //初始化
InvalidateRect(hwnd,NULL,true); //重绘
break;
case?1:
if(x=0x15y=0y15P(x,y)==0){
chess[x*15+y]=1; //更改棋盘
fallen.push_back(x*15+y); //加入已落棋子列表
state=WinCheck()?3:2;
InvalidateRect(hwnd,NULL,true);
}
}
break;
default:
return?DefWindowProc(hwnd,?message,?wParam,?lParam); //默认消息处理
}
return?0;
}
//初始化棋盘
void?InitChess()
{
for(int?i=0;i225;i++)chess[i]=0; //全部棋子置空
fallen.clear(); //清空已落棋子列表
}
//电脑走棋
void?ComputerMove()
{
int?r=GetBest();
chess[r]=-1;
fallen.push_back(r);
}
//检查棋盘是否有空位
bool?CheckChess()
{
for(int?i=0;i15*15;i++)if(!chess[i])return?true;
return?false;
}
//转换二维索引为一维索引
int?P2I(int?x,int?y)
{
if(x0||y0||x14||y14)return?255;
return?x*15+y;
}
//获取整数的符号
int?sign(int?n)
{
return?n0?1:n0?-1:0;
}
//获取一个棋子的某一个方向上的棋子坐标。方向:1-右;2-右下;3-下;4-左下。其它方向负数。
int?GetN(int?i,int?d) //比如(3,4)的右边为(4,4),不过本函数以一维坐标表示
{
????int?x?=?i?/?15;
????int?y?=?i?%?15;
????switch(abs(d)){
case?1:
return?P2I(x?+?sign(d),?y);
case?2:
????????return?P2I(x?+?sign(d),?y?+?sign(d));
case?3:
????????return?P2I(x,?y?+?sign(d));
case?4:
????????return?P2I(x?-?sign(d),?y?+?sign(d));
default:
????????return?P2I(x,?y);
}
}
//返回某点棋子
int?P(int?x,?int?y)
{
if(x0||y0||x14||y14)
return?3;
else?if(x==-1||x==15||y==-1||y==15)
return?2;
else
return?chess[x*15+y];
}
//返回某点棋子
int?P(int?n)
{
return?P(n?/?15,?n?%?15);
}
//判断是己方棋子(1)还是障碍(2,对方棋子或棋盘外围)还是空位(0),a为待判断棋子,p为己方棋子。
char?ge(int?a,int?p)
{
if(a==p)
return?'1';
else?if(a==-p)
return?'2';
else
return?(char)(a+48);
}
//计数一个落子处某个方向上的权重值。
int?CountV(int?i,?int?d,?int?pl)
{
string?str=""; //用于保存棋型
int?tmp?=?i;
for(int?j=1;j5;j++){ //前4格
tmp=GetN(tmp,-d);
str=ge(P(tmp),pl)+str;
if(P(tmp)==2)break; //遇到阻挡的就退出循环
}
str?+=?'1'; //自身
for(int?j=1;j5;j++){ //后4格
i=GetN(i,d);
str?+=?ge(P(i),pl);
if(P(tmp)==2)break;
}
for(int?j=0;j18;j++) //挨个比较棋型,藉此获得权重值
if(str.find(cl[j])!=str.npos||str.find(string(cl[j].rbegin(),cl[j].rend()))!=str.npos)
return?pl==1?pv[j]:cv[j];
return?0;
}
//计算一个落子处的价值
int?GetValue(int?i)
{
int?n=0;
for(int?j=1;j5;j++){
n+=CountV(i,j,1); //对玩家的价值
n+=CountV(i,j,-1); //对电脑的价值
}
return?n;
}
//获取最优落子点
int?GetBest()
{
int?n=0,tmp; //n保存最大值,tmp临时变量
r.clear();
for(int?i=0;i225;i++){
if(P(i)==0){
tmp=GetValue(i);
if(tmpn){ //如果比已存的数大,就清空列表,并替换值
r.clear();
r.push_back(i);
n=tmp;
}else?if(tmp==n) //如果相等,就添加
r.push_back(i);
if(r.front()=1000000)?return?r.front(); //如果遇到连成5子的就直接选它了
}
}
it=r.begin();
tmp=rand()%r.size();
for(int?i=1;itmp;i++)it++;
return?*it; //随机从列表中返回一个位置
}
//计数一个棋子某个方向上的连子数。i,棋子坐标。d,方向。1-右;2-右下;3-下;4-左下。其它方向负数。
int?Count(int?i,int?d)
{
int?n=i;
int?c=0;
while(P(n)==P(i)){
n=GetN(n,d);
c++;
}
return?c-1;
}
//检查是否连成五子
bool?WinCheck()
{
int?i=fallen.back(); //检查最后一个落子的周围即可
for(int?j=1;j=4;j++) //依次判断4个方向
if(Count(i,j)+Count(i,-j)=4)
return?true;
return?false;
}
上面是完整代码,请参考。