#include "ai.h"
Ai::Ai(): //构造函数
BOARDSIZE(15),
OUTRANGE(-3),
EMPTY(0),
PLAYER(1),
COMPUTER(2)
{
memset(board, 0, sizeof(board));
}
void Ai::clear()
{
memset(board, 0, sizeof(board));
}
void Ai::computer_first()
{
board[7][7] = COMPUTER;
}
int *Ai::getboard()
{
return board[0];
}
bool Ai::isNull(QPoint cur)
{
int x,y;
x = cur.x();
y = cur.y();
return board[x][y]==0?false:true;
}
const QPoint offset[8]={QPoint(0,-1),QPoint(1,-1),QPoint(1,0),QPoint(1,1),
QPoint(0,1),QPoint(-1,1),QPoint(-1,0),QPoint(-1,-1)};
const std::vector <QPoint> m_offset(offset,offset+8);//获取点时的单位偏移量
int Ai::getPointAt(QPoint p, int dir, int offset)//中心点,方向,偏移量
{
int x = p.x();
int y = p.y();
y = y + offset*m_offset[dir].y();
x = x + offset*m_offset[dir].x();
if(x<0 || y<0 || x>BOARDSIZE || y>BOARDSIZE)
return OUTRANGE;
return board[x][y];
}
int Ai::envaluate(QPoint p, int who)
{
int value = 0;
int opposite=(who==PLAYER)?COMPUTER:PLAYER; // 敌对方是谁
for(int i=0; i<8; i++) // 8个方向
{
//判断是否存在 *11110 ("活四A" 必胜 没办法去赌了)
if(getPointAt(p,i,1) == who && getPointAt(p,i,2) == who
&& getPointAt(p,i,3) == who && getPointAt(p,i,4) == who
&& getPointAt(p,i,5) == EMPTY)
{
value+=400000; // 40万
}
// 判断是否存在 *11112 (死四A) 如果是己方则下子获得胜利,对手的话要竭力去赌
if(getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3) == who &&getPointAt(p,i,4) == who
&& getPointAt(p,i,5) == opposite)
{
value += 400000; // 40万
}
// 判断是否存在 111*1 (死四B)
if(getPointAt(p,i,-1) == who &&getPointAt(p,i,1) == who
&& getPointAt(p,i,2) == who &&getPointAt(p,i,3) == who)
{
value += 400000; // 40万
}
// 判断是否存在 11*11 (死四C)
if(getPointAt(p,i,-2) == who &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who)
{
value += 400000;
}
// 判断是否存在 *1110 (活三A)
if(getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3) == who &&getPointAt(p,i,4) == EMPTY)
{
value += 250000;
}
// 判断是否存在 01*110 (活三B)
if(getPointAt(p,i,-2) == EMPTY &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who
&&getPointAt(p,i,3)==EMPTY)
{
value += 250000;
}
// 判断是否存在 *1112 (死三A)
if(getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3) == who &&getPointAt(p,i,4) == opposite)
{
value += 90000;
}
// 判断是否存在 01*112 (死三B)
if(getPointAt(p,i,-2) == EMPTY &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3)==opposite)
{
value += 90000;
}
// 判断是否存在 011*12 (死三C)
if(getPointAt(p,i,-2) == opposite &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3)==EMPTY)
{
value += 10000;
}
// 判断是否存在 10*11 (死三D)
if(getPointAt(p,i,-2) == who &&getPointAt(p,i,-1) == EMPTY
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == who)
{
value += 9000;
}
// 判断是否存在 1*101 (死三E)
if(getPointAt(p,i,-1) == who &&getPointAt(p,i,1) == who
&& getPointAt(p,i,2) == EMPTY &&getPointAt(p,i,3) == who)
{
value += 9000;
}
// 判断是否存在 2*11102 (死三F)
if(getPointAt(p,i,-1) == opposite &&getPointAt(p,i,1) == who
&& getPointAt(p,i,2) == who &&getPointAt(p,i,3) == who
&& getPointAt(p,i,4)==EMPTY && getPointAt(p,i,5)==opposite)
{
value += 5000;
}
// 判断是否存在 0*1100 (活二A)
if(getPointAt(p,i,-1) == EMPTY &&getPointAt(p,i,1) == who
&& getPointAt(p,i,2) == who &&getPointAt(p,i,3) == EMPTY
&& getPointAt(p,i,4)==EMPTY)
{
value += 6000;
}
// 判断是否存在 01*10 (活二B)
if(getPointAt(p,i,-2) == EMPTY &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == EMPTY)
{
value += 6000;
}
// 判断是否存在 01*010 (活二C)
if(getPointAt(p,i,-2) == EMPTY &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == EMPTY &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3)==EMPTY)
{
value += 4000;
}
// 判断是否存在 0*0112 (死二A)
if(getPointAt(p,i,-1) == EMPTY &&getPointAt(p,i,1) == EMPTY
&& getPointAt(p,i,2) == who &&getPointAt(p,i,3) == who
&& getPointAt(p,i,4)==opposite)
{
value +=100;
}
// 判断是否存在 001*12 (死二B)
if(getPointAt(p,i,-2) == opposite &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == who &&getPointAt(p,i,2) == EMPTY
&& getPointAt(p,i,3)==EMPTY)
{
value +=100;
}
// 判断是否存在 010*12 (死二C)
if(getPointAt(p,i,-2) == opposite &&getPointAt(p,i,-1) == who
&& getPointAt(p,i,1) == EMPTY &&getPointAt(p,i,2) == who
&& getPointAt(p,i,3)==EMPTY)
{
value +=100;
}
// 判断是否存在 1*001 (死二D)
if(getPointAt(p,i,-1) == who && getPointAt(p,i,1) == EMPTY
&& getPointAt(p,i,2) == EMPTY && getPointAt(p,i,3) == EMPTY)
{
value +=100;
}
// 周围如果已有棋子数目比较多的话,适当增加一下权值
value+=(getPointAt(p,i,-1)==who+getPointAt(p,i,-1)==opposite)*25;
}
return value;
}
void Ai::dropChessAt(QPoint a, int player)//下棋
{
int x,y;
x = a.x();
y = a.y();
if(player==COMPUTER)
board[x][y]=COMPUTER;
else
board[x][y]=PLAYER;
}
int Ai::isTimeToAI()//AI回合
{
//判断是否已经结束
for(int r=0; r<BOARDSIZE; r++) // 双层循环遍历棋盘
{
for(int c=0; c<BOARDSIZE;c++)
{
QPoint p=QPoint(r,c);
for(int i=0; i<8; i++) // 8个方向
if(getPointAt(p,i,1) == COMPUTER&&getPointAt(p,i,2) ==COMPUTER&&
getPointAt(p,i,3) == COMPUTER&&getPointAt(p,i,4) ==COMPUTER&&
getPointAt(p,i,5)==COMPUTER
||
getPointAt(p,i,1) == PLAYER&&getPointAt(p,i,2) ==PLAYER&&
getPointAt(p,i,3) == PLAYER&&getPointAt(p,i,4) ==PLAYER&&
getPointAt(p,i,5)==PLAYER)
{
if(getPointAt(p,i,1) ==COMPUTER)
return ComputerWin;
else if(getPointAt(p,i,1) ==PLAYER)
return PlayerWin;
}
}
}
QPoint bestPos1; // 最佳的进攻位置
QPoint bestPos2; // 最佳的防守位置
// 首先,分析采取进攻策略时的情况
// 当前棋盘中采取进攻策略的最高权重max1
int max1 = 0;
for(int r=0; r<BOARDSIZE; r++) //
基于QT的人机对弈五子棋小游戏
需积分: 47 102 浏览量
2020-04-29
16:12:24
上传
评论 4
收藏 11KB RAR 举报
CyrilSterling
- 粉丝: 426
- 资源: 2
最新资源
- #P0015. 全排列 超级简单
- pta题库答案c语言之排序4统计工龄.zip
- pta题库答案c语言之树结构7堆中的路径.zip
- pta题库答案c语言之树结构3TreeTraversalsAgain.zip
- pta题库答案c语言之树结构2ListLeaves.zip
- pta题库答案c语言之树结构1树的同构.zip
- 基于C++实现民航飞行与地图简易管理系统可执行程序+说明+详细注释.zip
- pta题库答案c语言之复杂度1最大子列和问题.zip
- 三维装箱问题(Three-Dimensional Bin Packing Problem,3D-BPP)是一个经典的组合优化问题
- 以下是一些关于Linux线程同步的基本概念和方法.txt
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈