资源简介
该程序仅为c++语言算法,不包含界面。
行棋记录:包含六个数字 移动前坐标,移动后坐标,释放障碍坐标
输入是回合数和从开始到现在的双方行棋记录,输出是下一步的一条行棋记录。
具体的输入输出请参考北京大学人工智能实验室网站botzone下的维基条目。
由于botzone的时间限制在1秒内,该程序对不同阶段的搜索层数做了限制,可以在create函数的前几行修改限制。
代码片段和文件信息
/* αβ剪枝 + 按层数多层搜索 + 论文估值 */
#include
#include
#include
#include
#define MAX_VAL 65000
#define MIN_VAL -65000
using namespace std;
/*
2
-1 -1 -1 -1 -1 -1
5 0 5 6 2 3
7 5 4 2 7 5
*/
int n;
double val0;
int enddeep;
int a[8][8]={0}; //a现在棋盘 /*空格为0 我方棋子为1 对方棋子为2 障碍为-1*/
int mx[4]my[4]dx[4]dy[4];//我方和敌方的坐标
int sx[8]={10110-1-1-1};
int sy[8]={11-10-110-1};
int ansx1ansx2ansx3ansy1ansy2ansy3;
int create() // 重建现在的棋盘到a 保存敌我坐标到 mx my dx dy
{
cin>>n;
if(n<12) enddeep=1;
else if(n<18) enddeep=2;
else enddeep=3;
int x1y1x2y2x3y3;
cin>>x1>>y1>>x2>>y2>>x3>>y3;
if(x1==-1)
{
if(n==1)
{
cout<<“5 0 5 6 2 3“;
exit(0);
}
a[2][0]=a[5][0]=a[0][2]=a[7][2]=1;
a[0][5]=a[7][5]=a[2][7]=a[5][7]=2;
}
else
{
a[2][0]=a[5][0]=a[0][2]=a[7][2]=2;
a[0][5]=a[7][5]=a[2][7]=a[5][7]=1;
a[x2][y2]=a[x1][y1];
a[x1][y1]=0;
a[x3][y3]=-1;
}
for(int i=1;i<=n*2-2;i++)
{
cin>>x1>>y1>>x2>>y2>>x3>>y3;
a[x2][y2]=a[x1][y1];
a[x1][y1]=0;
a[x3][y3]=-1;
}
int wlink=0dlink=0;
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
if(a[i][j]==1)
{
mx[wlink]=i;
my[wlink]=j;
wlink++;
}
if(a[i][j]==2)
{
dx[dlink]=i;
dy[dlink]=j;
dlink++;
}
}
}
int putout() // debug输出棋盘
{
for(int i=0;i<=7;i++)
{
cout<<“ “;
for(int j=0;j<=7;j++)
{
if(a[j][i]==1) cout<<“M“;
else if(a[j][i]==2) cout<<“D“;
else if(a[j][i]==-1) cout<<“x“;
else cout<<“.“;
}
cout< }
}
int isout(int xint y)// 坐标x.y是否越界 如果越界return 1
{
if(x<0||x>7||y<0||y>7) return 1;
else return 0;
}
////////////////////////////////////////估值
int myking[8][8]diking[8][8]myqueen[8][8]diqueen[8][8]mm;
int bj[8][8];
int queuex[65]queuey[65]qdeep[65]topend;
double value()
{
for(int i=0;i<8;i++)
for(int j=0;j<8;j++)
{
myking[i][j]=diking[i][j]=myqueen[i][j]=diqueen[i][j]=MAX_VAL;
}
double t1=0t2=0p1=0p2=0m=0;
for(int z=0;z<4;z++)
{
memset(bj0sizeof(bj));
top=0;
end=1;
queuex[0]=mx[z];
queuey[0]=my[z];
qdeep[0]=0;
bj[mx[z]][my[z]]=1;
while(top!=end)
{
int x=queuex[top];
int y=queuey[top];
int deep=qdeep[top];
myking[x][y]=min(myking[x][y]deep);
for(int i=0;i<8;i++)
{
if(isout(x+sx[i]y+sy[i])) continue;
if(bj[x+sx[i]][y+sy[i]]) continue;
if(a[x+sx[i]][y+sy[i]]) continue;
queuex[end]=x+sx[i];
queuey[end]=y+sy[i];
qdeep[end]=deep+1;
bj[x+sx[i]][y+sy[i]]=1;
end++;
}
top++;
}
myking[mx[z]][my[z]]=MAX_VAL;
}
for(int z=0;z<4;z++)
{
memset(bj0sizeof(bj));
top=0;
end=1;
queuex[0]=dx[z];
queuey[0]=dy[z];
qdeep[0]=0;
bj[dx[z]][dy[z]]=1;
while(top!=end)
{
int x=queuex[top];
int y=queuey[top];
int deep=qdeep[top];
diking[x][y]=min(diking[x][y]deep);
for(int i=0;i<8;i++)
{
if(isout(x+sx[i]y+sy[i])) co
相关资源
- Bresenham直线算法的C++实现
- 日历记事本C++语言面向对象思想
- C++ Primer Plus(第6版).pdf 中文版高清
- C++编写简单计算器
- 《数据结构(c++描述)》教材习题解
- C++点菜管理系统
- 操作系统文件管理系统c++
- 创建Windows系统服务demo2(c++版)
- C++截图、抓屏程序
- C++ Primer Plus第6版_带书签_高清完整版
- PTP时间同步C++实现
- 边界跟踪算法的实现,图像处理 c++
- C++实现网络嗅探器 规划文档
- 侯捷 C++内存管理
- VC++(VS2008)\“橡皮筋\“CRectTracker类
- vc++6.0DES加密算法+数据加密+文件加密
- C++继承与派生类实验报告
- Thinking in C++ 源代码
- 用DEVC++实现的小型通信录程序带实验
- C++读取WAV格式音频文件
- 个人相册管理系统————VC++
- 软件测试实验报告——三角形问题
- 基于SNMP的网络流量监视系统
- 农夫过河深度遍及c++
- 基于boost.asio库的C++http/https web server
- 车辆信息管理系统C++版
- 用C++ 和opengl实现多个雪人,而且可以
- 将数据保存到excel中
- GPS卫星定位-实时位置计算程序-VC++源
- 使用ifstream和getline读取文件内容[c++
评论
共有 条评论