简单AI算法

简单的五子棋算法:

Q2O代表2个棋子 有一边被堵了,

下面的以此类推,每一次下棋都计算能下棋的位置自己的权值,要从4个方向计算,水平,

垂直,45度角,135度角。堵棋是计算对方的权值,两者相加最大值就是下棋的位置。

这个水平我认为还算一般,中等偏下。


Java源代码

package com.what21.chess;
/*
 * 人机对战的算法,对外的接口是getQuan()和getSame(),getQuan()是人机对战是计算出来每个点的权值
 * 取最大的的值作为下棋点,getSame()是用来判断输赢的接口
 * */
public class Computer {

// q代表棋子 O代表空     先设置权值
private static int Q2O=50;
private static int Q2=100;
private static int Q3O=500;
private static int Q3=1000;
private static int Q4O=5000;
private static int Q4=10000;
private static int Q5=50000;
private int a,b,num[][];
int c[][]=new int[2][2];//记录i,j的起始位置


public void trouble()//困难模式
{
Q2O=10;
Q2=100;
Q3O=120;
Q3=1200;
Q4O=1100;
Q4=10000;
Q5=50000;
}
public void easy()//简单模式
{
Q2O=50;
Q2=100;
Q3O=500;
Q3=1000;
Q4O=5000;
Q4=10000;
Q5=50000;
}
public void copyChess(int num1[][])
{
num=new int[15][15];
for(int i=0;i<15;i++)
for(int j=0;j<15;j++)
num[i][j]=num1[i][j];
}


public int getQuan(int i,int j)//每个位置的权值
{
int q=0;
q+=getQuan0(i,j);//4个方向的权值
q+=getQuan90(i,j);
q+=getQuan135(i,j);
q+=getQuan45(i,j);
return q;
}


private int getQuan0(int i,int j)
{
a=1;
b=0;
return getquanALL(i,j);
}
private int getQuan90(int i,int j)
{
a=0;
b=1;
return getquanALL(i,j);
}
private int getQuan135(int i,int j)
{
a=1;
b=-1;
return getquanALL(i,j);
}
private int getQuan45(int i,int j)
{
a=1;
b=1;
return getquanALL(i,j);
}
private void initc(int i,int j)
{
c[0][0]=c[0][1]=i;
c[1][0]=c[1][1]=j;
}
private int getquanALL(int i,int j)//计算自己和对方的权值相加就是最大权值
{
int samechesSnums=0;//相同旗子个数
int samechessNumf=0;
int blankNums=0;
int blankNumf=0;
int q=0,qs=0,qf=0;
initc(i,j);
//计算人的权值
samechesSnums=getSamechessNums(1);//得到棋子的数量
if(c[0][0]>=0&&c[0][0]<=14&&c[1][0]>=0&&c[1][0]<=14)//得到空的数量
if(num[c[0][0]][c[1][0]]==0)blankNums++;

if(c[0][1]>=0&&c[0][1]<=14&&c[1][1]>=0&&c[1][1]<=14)
{
if(num[c[0][1]][c[1][1]]==0)blankNums++;
}
qs=getQuanEqual(samechesSnums,blankNums);

//计算自己的权值
initc(i,j);
samechessNumf=getSamechessNums(2);//得到棋子的数量
if(c[0][0]>=0&&c[0][0]<=14&&c[1][0]>=0&&c[1][0]<=14)//得到空的数量
if(num[c[0][0]][c[1][0]]==0)blankNumf++;

if(c[0][1]>=0&&c[0][1]<=14&&c[1][1]>=0&&c[1][1]<=14)
if(num[c[0][1]][c[1][1]]==0)blankNumf++;
qf=getQuanEqual(samechessNumf,blankNumf);
q=qs+qf;

return q;
}
private int  getSamechessNums(int id) 
//得到棋子的数量
{
int num1=1;
c[0][0]+=a;//右方向
c[1][0]+=b;
while(c[0][0]>=0&&c[0][0]<=14&&num1<5&&c[1][0]>=0&&c[1][0]<=14)
{
if(num[c[0][0]][c[1][0]]!=id)break;
num1++;
c[0][0]+=a;
c[1][0]+=b;
}
//左方向
c[0][1]-=a;
c[1][1]-=b;
while(c[1][1]>=0&&c[1][1]<=14&&num1<5&&c[0][1]>=0&&c[0][1]<=14)
{
if(num[c[0][1]][c[1][1]]!=id)break;
num1++;
c[0][1]-=a;
c[1][1]-=b;
}
return num1;
}
private int getQuanEqual(int chess,int blank)
{


if(chess==2&&blank==1)return Q2O;
else if(chess==2&&blank==2)return Q2;
else if(chess==3&&blank==1)return Q3O;
else if(chess==3&&blank==2)return Q3;
else if(chess==4&&blank==1)return Q4O;
else if(chess==4&&blank==2)return Q4;
else if(chess==5)return Q5;
else return 0;
}
public int getSame(int i,int j,int id)//判断输赢
{
int q=0,k=0;
a=1;b=0;initc(i,j);
k=getSamechessNums(id);
q=q<k?k:q;

a=0;b=1;initc(i,j);
k=getSamechessNums(id);
q=q<k?k:q;


a=1;
b=1;initc(i,j);
k=getSamechessNums(id);
q=q<k?k:q;


a=1;b=-1;initc(i,j);
k=getSamechessNums(id);
q=q<k?k:q;
return q;
}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值