Java五子棋AI实现代码
思路:
- ①五子棋界面的实现
- ②交互下棋的实现
- ③重绘
- ④AI,实现人机对战
五子棋和简单AI的实现:
首先将五子棋的界面写出来。
首先我们写一个接口类,定义好棋盘的数据(目的是方便修改)。
publicinterfaceConfig{
publicstaticfinalintX0=50;//左上角起点X值
publicstaticfinalintY0=50;//左上角起点Y值
publicstaticfinalintROWS=15;//横向线数
publicstaticfinalintCOLUMNS=15;//纵向线数
publicstaticfinalintCHESSSIZE=40;//棋子直径
publicstaticfinalintSIZE=50;//单元格大小
}
再来写五子棋的界面。写界面的方法和画图板是一样的。
publicclassFiveChessUIextendsJFrameimplementsConfig{
staticFiveChessUIfcUI=newFiveChessUI();
publicstaticvoidmain(String[]args){
fcUI.initUI();
}
privateint[][]chesses=newint[ROWS][COLUMNS];//创建一个二维数组用来标记棋盘上的位置
/**
*初始化五子棋窗体的方法
*/
publicvoidinitUI(){
ChessListenerlistener=newChessListener(chesses,fcUI);
this.setTitle("五子棋v1.0");
this.setSize(900,800);//设置界面尺寸
this.setResizable(false);//界面不可改变大小
this.setLocationRelativeTo(null);//设置界面居中
this.setDefaultCloseOperation(3);//设置退出进程
BorderLayoutbl=newBorderLayout();//设置界面布局为窗体式布局
this.setLayout(bl);
JPaneljp=newJPanel();
jp.setPreferredSize(newDimension(100,0));
this.add(jp,BorderLayout.EAST);
String[]name={"重新开始","黑棋先下","白棋先下","悔棋","人机对战","人人对战"};
for(inti=0;i
监听器类代码如下:
importjava.awt.Graphics;
importjava.awt.event.ActionEvent;
importjava.awt.event.ActionListener;
importjava.awt.event.MouseAdapter;
importjava.awt.event.MouseEvent;
importjava.util.HashMap;
importjavax.swing.ImageIcon;
importjavax.swing.JOptionPane;
publicclassChessListenerextendsMouseAdapterimplementsConfig,ActionListener{
publicGraphicsgr;
privateintcount=0;//计数器
privateint[][]chesses;//创建一个二维数组用来存放棋子的坐标
privateStringname;
privateintt,r;
privateintcl=0,AI=2;
privateinti,j,x,y,z=0,w=0,zz=0,ww=0;
privateFiveChessUIfc;//声明FiveChessUI类的一个对象
privateintsetX[]=newint[ROWS*COLUMNS];//创建一维数组setX[]
privateintsetY[]=newint[ROWS*COLUMNS];//创建一维数组setY[]
privateint[][]chessValue=newint[ROWS][COLUMNS];
privateintindex=0;//创建数组的下标
HashMaphm=newHashMap();//创建权值表
publicChessListener(int[][]chesses,FiveChessUIfc){
this.fc=fc;
this.chesses=chesses;
//权值设置,这个需要自己慢慢调,小编写的一般,AI有时会出问题
hm.put("1",20);
hm.put("11",60);
hm.put("111",200);
hm.put("1111",1000);
hm.put("-1",20);
hm.put("-1-1",60);
hm.put("-1-1-1",200);
hm.put("-1-1-1-1",1000);
hm.put("1-1",20);
hm.put("11-1",30);
hm.put("111-1",80);
hm.put("1111-1",1000);
hm.put("-11",20);
hm.put("-111",30);
hm.put("-1111",80);
hm.put("-11111",1000);
hm.put("1-1",20);
hm.put("-1-11",30);
hm.put("-1-1-11",80);
hm.put("-1-1-1-11",1000);
hm.put("1-1",20);
hm.put("1-1-1",30);
hm.put("1-1-1-1",80);
hm.put("1-1-1-1-1",1000);
}
publicvoidmouseReleased(MouseEvente){
//得到鼠标事件发生的时候光标的位置
intx1=e.getX();
inty1=e.getY();
//按行遍历棋盘,坐标(i,j)
for(j=0;jx-SIZE*5/12&&x1y-SIZE*5/12
&&y1=0;i--){
if(chesses[i][y]==chesses[x][y]){
count1++;
}else
break;
}
for(intj=y+1;j=0;j--){
if(chesses[x][y]==chesses[x][j]){
count2++;
}else
break;
}
for(inti=x+1,j=y+1;i=0&&j>=0;i--,j--){
if(chesses[i][j]==chesses[x][y]){
count3++;
}else
break;
}
for(inti=x,j=y;i=0;i++,j--){
if(chesses[i][j]==chesses[x][y]){
count4++;
}else
break;
}
for(inti=x-1,j=y+1;i>=0&&j=5||count2>=5||count3>=5||count4>=5){
count=0;
if(cl==0){
JOptionPane.showMessageDialog(null,"黑棋赢!");
for(inti=0;i=0){
index--;
if(index<0){
index=0;
}
x=setX[index];
y=setY[index];
if(chesses[x][y]==1){
chesses[x][y]=0;
count=0;
}
if(chesses[x][y]==-1){
chesses[x][y]=0;
count=1;
}
if(chesses[t][r]==-1){
chesses[t][r]=0;
count=1;
}
fc.repaint();
}
}
publicvoidAI(){
for(inti=0;i=0;k--){
if(chesses[k][j]==0){
break;
}else{
if(color==0){//右边第一颗棋子
color=chesses[k][j];//保存颜色
code+=chesses[k][j];//保存棋局
}elseif(chesses[k][j]==color){//右边第二,第三同颜色棋子
code+=chesses[k][j];//保存棋局
}else{//右边不同颜色
code+=chesses[k][j];
break;
}
}
}
//根据code取出hm对应的权值
Integervalue2=hm.get(code);
if(value2!=null){
chessValue[i][j]+=value2;
}
//向上方向
code="";
color=0;
for(intk=j-1;k>=0;k--){
if(chesses[i][k]==0){
break;
}else{
if(color==0){//右边第一颗棋子
color=chesses[i][k];//保存颜色
code+=chesses[i][k];//保存棋局
}elseif(chesses[i][k]==color){//右边第二,第三同颜色棋子
code+=chesses[i][k];//保存棋局
}else{//右边不同颜色
code+=chesses[i][k];
break;
}
}
}
//根据code取出hm对应的权值
Integervalue3=hm.get(code);
if(value3!=null){
chessValue[i][j]+=value3;
}
//向下方向
code="";
color=0;
for(intk=j+1;k=0&&k=0&&k=0&&k>=0;l--,k--){
if(chesses[k][l]==0){
break;
}else{
if(color==0){//右边第一颗棋子
color=chesses[k][l];//保存颜色
code+=chesses[k][l];//保存棋局
}elseif(chesses[k][l]==color){//右边第二,第三同颜色棋子
code+=chesses[k][l];//保存棋局
}else{//右边不同颜色
code+=chesses[k][l];
break;
}
}
}
//根据code取出hm对应的权值
Integervalue8=hm.get(code);
if(value8!=null){
chessValue[i][j]+=value8;
}
//左上方向
code="";
color=0;
for(intk=i+1,l=j+1;k
总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接