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;j x-SIZE*5/12&&x1 y-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 总结
以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对毛票票的支持。如果你想了解更多相关内容请查看下面相关链接