Java利用权值法实现简单AI五子棋

前言

利用权值法实现简单的人机五子棋,没有利用博弈树等高深的方法。而且里面的权值判断法都是本人自己设定的,只是基本实现了自动下棋功能,而且时不时会有几步臭棋。

效果图


图片有点大    基本上要实现的功能就是如图所示

实现步骤

UI过程:

1.首先是要将棋盘画出来 再添加按钮,再加监听

所要用到的API类:JFrame  BorderLayout  JPanel  MouseListener  MouseEvent

Graphics  Color   数组

代码示例:

import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
public class GobangMain extends JPanel implements GobangConfig{    //界面的实现

	public static void main(String[] args) {
		GobangMain pa=new GobangMain();              //实例化界面对象
		pa.showUI();
	}

	public void setarray(int [][]array) {            //预先对数组初始化(数组用于记录棋子   0 空   1黑子   2白子
		for(int i=0;i<array.length;i++)
			for(int j=0;j<array[0].length;j++) {
				array[i][j]=0;
			}
	}
	public void showUI() {
		JFrame frame=new JFrame();             //实例化窗体  以及对窗体的一些设置
		frame.setTitle("五子棋");
		frame.setSize(980,840);
		frame.setResizable(false);
		frame.setDefaultCloseOperation(3);
		frame.setLocationRelativeTo(null);
		this.setPreferredSize(new Dimension(840,840));
		this.setBackground(Color.LIGHT_GRAY);
		JButton b1=new JButton("悔棋");                  //添加按钮
		JButton b4=new JButton("开始新游戏");
		JLabel L=new JLabel();
		frame.add(L,BorderLayout.EAST);
		L.setLayout(new FlowLayout());
		frame.add(this,BorderLayout.CENTER);
		frame.setVisible(true);
		
		GobangListener go=new GobangListener(this);
		this.addMouseListener(go);
		setarray(chessArray);
		L.setPreferredSize(new Dimension(140,840) );
		b1.setPreferredSize(new Dimension(100,60));
		b4.setPreferredSize(new Dimension(100,60));
		L.add(b4);
		L.add(b1);
		JRadioButton box1=new JRadioButton("人机对战");
		JRadioButton box2=new JRadioButton("玩家对战");
		L.add(box1);
		L.add(box2);
		b4.addActionListener(go);                   //给按钮添加监听
		b1.addActionListener(go);
		box1.addActionListener(go);                //给JRadioButton 添加监听
		box2.addActionListener(go);
	}
	public void paint(Graphics g) {     //利用重绘,保证棋盘以及棋子不会消失
		super.paint(g);
		for(int i=0;i<=chessArray.length;i++) {             //重绘画出线条
			g.drawLine(X, Y+i*SIZE, X+COLUMN*SIZE, Y+i*SIZE);
			g.drawLine(X+i*SIZE, Y, X+i*SIZE, Y+ROW*SIZE);
		}
		Draw(chessArray,g);
	}
	public void Draw(int [][]array,Graphics g){          //对棋子的重绘过程
		for(int i=0;i<array.length;i++)
			for(int j=0;j<array[0].length;j++) {
				if(array[i][j]==1) {
					g.setColor(Color.BLACK);
					g.fillOval(i*SIZE+X-QSIZE/2, j*SIZE+Y-QSIZE/2, QSIZE, QSIZE);
				}
				else if(array[i][j]==2) {
					g.setColor(Color.WHITE);
					g.fillOval(i*SIZE+X-QSIZE/2, j*SIZE+Y-QSIZE/2, QSIZE, QSIZE);
				}
			}
	}
}

可以看到这里我们继承了GobangConfig接口  先来看看这个接口

public interface GobangConfig {

	public static final int X=20,Y=20,SIZE=50, ROW = 15, COLUMN = 15,QSIZE=40;
	public static final int [][]chessArray=new int [ROW][COLUMN];
	public static final int [][]weightArray=new int [ROW][COLUMN];    //权值数组,每个点的权值分数存储
}

这里我们利用此接口设置了棋盘行列 ROW COLUMN,棋子大小QSIZE  画出来之后每个格子的大小SIZE  ,X Y 为开始画棋盘时离界面边缘的距离

到这里,界面就可以出现了,现在窗体上面已经出现了棋盘,按钮等组件

接下来  自然就是要在棋盘上面画出棋子,这里我们就用到了监听

废话少说,直接上代码:

package 五子棋1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.util.HashMap;

import javax.imageio.ImageIO;
import javax.swing.JLabel;

public class GobangListener extends MouseAdapter implements GobangConfig,ActionListener{

	static HashMap<String,Integer> map = new HashMap<String,Integer>();           //定义了两个HashMap 键值对,分别用于对电脑和玩家的棋进行对应的评分
	static {
		map.put("012",10);      //眠1
		map.put("210",10);      //眠1
		map.put("010",40);      //活1
		map.put("0110",100);      //活2
		map.put("0112",50);      //眠2
		map.put("2110",50);      //眠2
		map.put("01110",4500);     //活3
		map.put("01112",500);     //眠3
		map.put("21110",500);     //眠3
		map.put("011112",3500);    //眠四
		map.put("211110",3500);    //眠四
		map.put("011110",5500);    //活四
		map.put("21112",80);      //死三
		map.put("211112",100);     //死四
		map.put("2112",60);
		map.put("0111110",20000);   //活五
		map.put("2111110",20000);   //眠五
		map.put("0111112",20000);
	}
	
	static HashMap<String,Integer> map2 = new HashMap<String,Integer>();
	static {
		map2.put("012",15);      //眠1
		map2.put("210",15);      //眠1
		map2.put("010",55);      //活1
		map2.put("0110",150);      //活2
		map2.put("0112",70);      //眠2
		map2.put("2110",70);      //眠2
		map2.put("01110",6000);     //活3
		map2.put("01112",800);     //眠3
		map2.put("21110",800);     //眠3
		map2.put("011112",9000);    //眠四
		map2.put("211110",9000);    //眠四
		map2.put("011110",20000);    //活四
		map2.put("21112",200);       //
		map2.put("211112",500);     //
		map2.put("2112",30);       //
	}
	
	public GameOver1 robotwin=new GameOver1();      //实例化窗口对象,用于游戏结束后弹出此提示窗口
	public GameOver2 peoplewin=new GameOver2();
	public GobangMain pa;                         //将GobangMain 传到监听,用于调用重绘
	public Graphics2D g;
	private int flag;                             //用于记录当前棋子   黑棋1 白棋2
	public GobangListener(GobangMain pa) {         //传入GobangMain  重写构造函数
		this.pa=pa;
	}
	private int [] hr=new int [150];             //用于记录每次下棋的行位置(用于多次悔棋时使用)
	private int [] hc=new int [150];             //用于记录每次下棋的列位置(用于多次悔棋时使用)
	private int hui=0;                           //记录下棋步数(悔棋时利用)
	private String name="wu";                   //用于记录点击"开始新游戏"之前的状态 
	private String name2;                        
	public void actionPerformed(ActionEvent e) {
		name2=name;                        //用name2记录点击按钮之前的状态
		name=e.getActionCommand();
		if(name.equals("悔棋")&&(name2.equals("玩家对战"))) {
			int m=hr[hui-1];
			int n=hc[hui-1];
			flag=chessArray[m][n];
			chessArray[m][n]=0;
			pa.paint(g);
			hui--;
			name=name2;
		}
		if(name.equals("悔棋")&&(name2.equals("人机对战"))) {
			int m1=hr[hui-1];
			int n1=hc[hui-1];
			int m2=hr[hui-2];
			int n2=hc[hui-2];
			chessArray[m1][n1]=0;
			chessArray[m2][n2]=0;
			pa.paint(g);
			hui=hui-2;
			name=name2;
		}
		if(name.equals("开始新游戏")) {
			for(int i=0;i<chessArray.length;i++)
				for(int j=0;j<chessArray[0].length;j++)
					chessArray[i][j]=0;
			pa.paint(g);
			hui=0;
			flag=1;
			name=name2;
		}
		if(name.equals("玩家对战")) flag=1;
		if(name.equals("人机对战")) setvalue();
	}
	
	public void setvalue() {                       //对棋盘地势象征性地打分(避免电脑先下棋子时下到棋盘边缘)
		weightArray[7][6]=7;
		weightArray[7][7]=10;
		weightArray[7][8]=7;
		weightArray[8][6]=7;
		weightArray[8][7]=7;
		weightArray[8][8]=7;
		weightArray[6][6]=7;
		weightArray[6][7]=7;
		weightArray[6][8]=7;
	}
	
	public void mouseClicked(MouseEvent e) {
		if(g==null) {
			Graphics g1=pa.getGraphics();
			g=(Graphics2D) g1;
			g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
					RenderingHints.VALUE_ANTIALIAS_ON);// 开启画笔抗锯齿
		}
			int x=e.getX();         //获取点击位置
			int y=e.getY();
			if(name.equals("玩家对战")) Wanjia(x,y);                //若之前点击"玩家对战" 则调用Wanjia()
			if(name.equals("人机对战")) Renji1(x,y);               //若之前点击"人机对战"  则调用Renji1()
	}
	
	public void Wanjia(int x,int y) {
		int r=(x+SIZE/2-X)/SIZE;           //运算得到对应点在数组上的位置
	    int c=(y+SIZE/2-Y)/SIZE;           
	    hr[hui]=r;                       //将数组上的这点存储起来,悔棋时利用
	    hc[hui]=c;
	    hui++;
	    if((chessArray[r][c]==0)&&(flag==1)) {
	    	g.setColor(Color.BLACK);
	    	g.fillOval(r*SIZE+X-QSIZE/2, c*SIZE+Y-QSIZE/2, QSIZE, QSIZE);    //点击之后,将棋子画在离点击点最近的交叉点上(读者自行琢磨其中的运算)
		    chessArray[r][c]=1;            									//下了黑子之后  对应数组值为1
		    flag=2;                        									//flag=2   在这里用于表示下一个子应是白子
		    Check(chessArray[r][c],r,c);   									//根据下的这个棋子来判断是否游戏结束 调用Check 函数
	    }
	    if((chessArray[r][c]==0)&&(flag==2)) {
	    	g.setColor(Color.WHITE);
	    	g.fillOval(r*SIZE+X-QSIZE/2, c*SIZE+Y-QSIZE/2, QSIZE, QSIZE);
		    chessArray[r][c]=2;
		    flag=1;
		    Check(chessArray[r][c],r,c);
	    }
	}
	
	public void Renji1(int x,int y) {    //人机对战时执行此函数 
		int r=(x+SIZE/2-X)/SIZE;//x       
	    int c=(y+SIZE/2-Y)/SIZE;//y
	    hr[hui]=r;
	    hc[hui]=c;
	    hui++;
	    System.out.println(getvalue(1,2)+"最初分数"+getvalue(2,1));
	    if(chessArray[r][c]==0) {                                  //此小段为玩家下的子
		    g.setColor(Color.WHITE);
	    	g.fillOval(r*SIZE+X-QSIZE/2, c*SIZE+Y-QSIZE/2, QSIZE, QSIZE);
	    	chessArray[r][c]=2;
		    Check(chessArray[r][c],r,c);
	    }
	    System.out.println(getvalue(1,2)+"玩家下子之后"+getvalue(2,1));
		Renji2();                                                        //调用Renji2 函数(此时正式根据权值判断  再下棋)
		System.out.println(getvalue(1,2)+"电脑下子之后"+getvalue(2,1));
	}
	
	public void Renji2() {
		int max=0;
		int mi=0,mj=0;
		for(int j=0;j<chessArray.length;j++)
			for(int i=0;i<chessArray[0].length;i++) {   //getvalue(1,2)  为站在电脑方面对整个棋局评分   getvalue(2,1)为站在玩家方面对整个棋局评分
				if(chessArray[i][j]==0) {              //当这点无子时
					int getqian,gethou;                
					getqian=getvalue(1,2)-getvalue(2,1);  //电脑的权值 减去 玩家的权值   此值越大对电脑越有利  越小对玩家越有利
					chessArray[i][j]=1;                 //先假设下在该点,然后算出相应的权值
					gethou=getvalue(1,2)-getvalue(2,1);
					weightArray[i][j]=gethou-getqian;
					chessArray[i][j]=0;                  //之前为假设情况,将该点的值还原
				}
				else weightArray[i][j]=0;
			}
		for(int i=0;i<chessArray.length;i++)
			for(int j=0;j<chessArray[0].length;j++) {       //找出weight数组中的最大值,并让电脑在该点下棋子
				if(weightArray[i][j]>max) {
					max=weightArray[i][j];
					mi=i;
					mj=j;
				}
			}
		g.setColor(Color.BLACK);                                //电脑在权值最大点处下棋
    	g.fillOval(mi*SIZE+X-QSIZE/2, mj*SIZE+Y-QSIZE/2, QSIZE, QSIZE);
    	hr[hui]=mi;
	    hc[hui]=mj;
	    hui++;
	    chessArray[mi][mj]=1;
	    Check(chessArray[mi][mj],mi,mj);
	}
	
	public int getvalue(int flag1,int flag2) {    //getvalue(1,2)为计算电脑权值    getvalue(2,1) 为计算玩家权值
		int zvalue=0;   
		String code;
		Integer value;
		Integer value1;
		int []flags=new int[8];
		for(int j=0;j<chessArray.length;j++)
			for(int i=0;i<chessArray[0].length;i++) {
				if(chessArray[i][j]==flag1) {
					
					if(i+4<chessArray.length) {                          //将中间有个空的活四与其他分开统计  1011
						if(chessArray[i+1][j]==0&&chessArray[i+2][j]==flag1&&chessArray[i+3][j]==flag1&&chessArray[i+4][j]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[0]=1;
						}
						else if(chessArray[i+1][j]==flag1&&chessArray[i+2][j]==0&&chessArray[i+3][j]==flag1&&chessArray[i+4][j]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if(j+4<chessArray.length) {
						if(chessArray[i][j+1]==0&&chessArray[i][j+2]==flag1&&chessArray[i][j+3]==flag1&&chessArray[i][j+4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[1]=1;
						}
						else if(chessArray[i][j+1]==flag1&&chessArray[i][j+2]==0&&chessArray[i][j+3]==flag1&&chessArray[i][j+4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if(i-4>0) {
						if(chessArray[i-1][j]==0&&chessArray[i-2][j]==flag1&&chessArray[i-3][j]==flag1&&chessArray[i-4][j]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[2]=1;
						}
						else if(chessArray[i-1][j]==flag1&&chessArray[i-2][j]==0&&chessArray[i-3][j]==flag1&&chessArray[i-4][j]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if(j-4>0) {
						if(chessArray[i][j-1]==0&&chessArray[i][j-2]==flag1&&chessArray[i][j-3]==flag1&&chessArray[i][j-4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[3]=1;
						}
						else if(chessArray[i][j-1]==flag1&&chessArray[i][j-2]==0&&chessArray[i][j-3]==flag1&&chessArray[i][j-4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if((i+4<chessArray.length)&&(j+3<chessArray.length)) {
						if(chessArray[i+1][j+1]==0&&chessArray[i+2][j+2]==flag1&&chessArray[i+3][j+3]==flag1&&chessArray[i+4][j+4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[4]=1;
						}
						else if(chessArray[i+1][j+1]==flag1&&chessArray[i+2][j+2]==0&&chessArray[i+3][j+3]==flag1&&chessArray[i+4][j+4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if((i-4>0)&&(j-4>0)) {
						if(chessArray[i-1][j-1]==0&&chessArray[i-2][j-2]==flag1&&chessArray[i-3][j-3]==flag1&&chessArray[i-4][j-4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[5]=1;
						}
						else if(chessArray[i-1][j-1]==flag1&&chessArray[i-2][j-2]==0&&chessArray[i-3][j-3]==flag1&&chessArray[i-4][j-4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if((i+4<chessArray.length)&&(j-4>0)) {
						if(chessArray[i+1][j-1]==0&&chessArray[i+2][j-2]==flag1&&chessArray[i+3][j-3]==flag1&&chessArray[i+4][j-4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[6]=1;
						}
						else if(chessArray[i+1][j-1]==flag1&&chessArray[i+2][j-2]==0&&chessArray[i+3][j-3]==flag1&&chessArray[i+4][j-4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					if((j+4<chessArray.length)&&(i-4>0)) {
						if(chessArray[i-1][j+1]==0&&chessArray[i-2][j+2]==flag1&&chessArray[i-3][j+3]==flag1&&chessArray[i-4][j+4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
							flags[7]=1;
						}
						else if(chessArray[i-1][j+1]==flag1&&chessArray[i-2][j+2]==0&&chessArray[i-3][j+3]==flag1&&chessArray[i-4][j+4]==flag1) {
							if(flag1==1) zvalue=zvalue+3499;
							else zvalue=zvalue+10000;
						}
					}
					
					
					
					if(i+3<chessArray.length) {                          //将中间有个空的活三与其他分开统计  1011
						if(chessArray[i+1][j]==0&&chessArray[i+2][j]==flag1&&chessArray[i+3][j]==flag1&&flags[0]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[0]=1;
						}
					}
					if(j+3<chessArray.length) {
						if(chessArray[i][j+1]==0&&chessArray[i][j+2]==flag1&&chessArray[i][j+3]==flag1&&flags[1]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[1]=1;
						}
					}
					if(i-3>0) {
						if(chessArray[i-1][j]==0&&chessArray[i-2][j]==flag1&&chessArray[i-3][j]==flag1&&flags[2]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[2]=1;
						}
					}
					if(j-3>0) {
						if(chessArray[i][j-1]==0&&chessArray[i][j-2]==flag1&&chessArray[i][j-3]==flag1&&flags[3]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[3]=1;
						}
					}
					if((i+3<chessArray.length)&&(j+3<chessArray.length)) {
						if(chessArray[i+1][j+1]==0&&chessArray[i+2][j+2]==flag1&&chessArray[i+3][j+3]==flag1&&flags[4]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[4]=1;
						}
					}
					if((i-3>0)&&(j-3>0)) {
						if(chessArray[i-1][j-1]==0&&chessArray[i-2][j-2]==flag1&&chessArray[i-3][j-3]==flag1&&flags[5]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[5]=1;
						}
					}
					if((i+3<chessArray.length)&&(j-3>0)) {
						if(chessArray[i+1][j-1]==0&&chessArray[i+2][j-2]==flag1&&chessArray[i+3][j-3]==flag1&&flags[6]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[6]=1;
						}
					}
					if((j+3<chessArray.length)&&(i-3>0)) {
						if(chessArray[i-1][j+1]==0&&chessArray[i-2][j+2]==flag1&&chessArray[i-3][j+3]==flag1&&flags[7]!=1) {
							if(flag1==1) zvalue=zvalue+3300;
							else zvalue=zvalue+5500;
							flags[7]=1;
						}
					}
					
					
					
					if(i>0) {                                         //水平方向判断————————————
						if(chessArray[i-1][j]==flag1) code="3";        //避免重复判断
						if(chessArray[i-1][j]==0) code="0";
						else code="2";
					}
					else {          //处于边界位置时
						code="2";
					}
					for(int ti=i;ti<chessArray.length;ti++) {
						if(chessArray[ti][j]==flag1) code=code+"1";   //向右为1时
						else if(chessArray[ti][j]==flag2) {           //向右为2时
							code=code+"2";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
						else {                                   //向右为0时
							code=code+"0";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
							
						}
					}
					
					if(j>0) {                                           //竖直方向判断
						if(chessArray[i][j-1]==flag1) code="3";
						if(chessArray[i][j-1]==0) code="0";
						else code="2";
					}
					else code="2";
					for(int tj=j;tj<chessArray[0].length;tj++) {
						if(chessArray[i][tj]==flag1) code=code+"1";
						else if(chessArray[i][tj]==flag2) {    //向下为2停止
							code=code+"2";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
						else {                                   //向下为0停止
							code=code+"0";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
					}
					
					
					if(i>0&&j>0) {                                     //斜向右下判断 
						if(chessArray[i-1][j-1]==flag1) code="3";
						else if(chessArray[i-1][j-1]==flag2) code="2";
						else code="0";
					}
					else code="2";
					int ti=i,tj=j;
					int min=(chessArray.length-ti)<(chessArray[0].length-tj)? (chessArray.length-ti):(chessArray[0].length-tj);
					for(int m=0;m<min;m++) {
						if(chessArray[i+m][j+m]==flag1) code=code+"1";
						else if(chessArray[i+m][j+m]==0) {
							code=code+"0";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
						else if(chessArray[i+m][j+m]==flag2) {
							code=code+"2";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
					}
					
					if((chessArray.length-i-1)>0&&j>0) {                                     //斜向左下判断
						if(chessArray[i+1][j-1]==flag1) code="3";
						else if(chessArray[i+1][j-1]==flag2) code="2";
						else code="0";
					}
					else code="2";
					ti=i;
					tj=j;
					min=ti<(chessArray[0].length-tj)? ti:(chessArray[0].length-tj);
					for(int m=0;m<min;m++) {
						if(chessArray[i-m][j+m]==flag1) code=code+"1";
						else if(chessArray[i-m][j+m]==0) {
							code=code+"0";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
						else if(chessArray[i-m][j+m]==flag2) {
							code=code+"2";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
						else if(chessArray[i-m][j+m]==0) {
							code=code+"0";
							if(flag1==1)  value= map.get(code);
							else value= map2.get(code);
							if(value!=null){//判断value是否不为null
								zvalue=zvalue+value;//累加权值
							}
							break;
						}
					}
				}
			}
		return zvalue;
	}
	
	
	public void Check(int f,int x,int y) {           //在某点下子后,判断是否游戏结束
		int count=0;
		for(int i=y;i>=0;i--){      //纵向
			if(chessArray[x][i]==f) count++;
			else break;
		}
		for(int i=y+1;i<chessArray.length;i++) {
			if(chessArray[x][i]==f) count++;
			else break;
		}
		if(count==5) {
			if(f==1) robotwin.setUI();
			else peoplewin.setUI();
			
		}
		else {
			count=0;
			for(int i=x;i>=0;i--){      //横向
				if(chessArray[i][y]==f) count++;
				else break;
			}
			for(int i=x+1;i<chessArray.length;i++) {
				if(chessArray[i][y]==f) count++;
				else break;
			}
			if(count==5) {
				if(f==1) robotwin.setUI();
				else peoplewin.setUI();
					}	
			else {      //左上到右下
				count=0;
				int min1=(ROW-y)<(COLUMN-x)? ROW-y:COLUMN-x;
				for(int i=0;i<=min1;i++) {
					if(chessArray[x+i][y+i]==f) count++;
					else break;
				}
				int min2=x<y? x:y;
				for(int i=1;i<=min2;i++) {
					if(chessArray[x-i][y-i]==f) count++;
					else break;
				}
				if(count==5) {
					if(f==1) robotwin.setUI();
					else peoplewin.setUI();
						}
				else {             //右上到左下
					count=0;
					int mi1=x<(ROW-y)? x:ROW-y;
					for(int i=0;i<=mi1;i++) {
						if(chessArray[x-i][y+i]==f) count++;
						else break;
					}
					int mi2=(COLUMN-x)<y? COLUMN-x:y;
					for(int i=1;i<=mi2;i++) {
						if(chessArray[x+i][y-i]==f) count++;
						else break;
					}
					if(count==5) {
						if(f==1) robotwin.setUI();
						else peoplewin.setUI();
							}	
				}
			}
		}
	}
}


几点说明,除了里面的权值函数,其他的悔棋,玩家自己对战,等等都已经实现了基本的使用, 其中最多的就是对棋局打分的函数,个人认为这个函数依每个人想法不同而不同,读者尽量还是自己想想    完全可以按照自己的思路来写  更有大牛可以用博弈树等高端手法    本人写的权值判断函数个人认为一般,还算基础   大家对此还是看看就行,因为本人实在写得杂乱无章()

忘了把窗体代码加上   补一个:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;


public class GameOver1 extends JFrame{

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		GameOver1 frame=new GameOver1();
		frame.setUI();
	}

	public void setUI() {
		this.setTitle("结束窗口");
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		this.setSize(300, 300);
		
		JLabel l=new JLabel("        电脑胜利!");
		JLabel l2=new JLabel();
		l2.setLayout(new FlowLayout());
		Font F=new Font("楷体",Font.BOLD+ Font.ITALIC,20);
		l.setFont(F);
		JButton b=new JButton("确定");
		l2.add(b);
		b.setPreferredSize(new Dimension(80,40));
		this.setLayout(new BorderLayout());
		this.add(l,BorderLayout.NORTH);
		this.add(l2,BorderLayout.CENTER);
		this.setVisible(true);
		
	}
}

还有一个:

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Font;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;

public class GameOver2 extends JFrame{

	public static void main(String[] args) {
		// TODO Auto-generated method stub

		GameOver2 frame=new GameOver2();
		frame.setUI();
	}

	public void setUI() {
		this.setTitle("结束窗口");
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		this.setSize(300, 300);
		
		JLabel l=new JLabel("        玩家胜利!");
		JLabel l2=new JLabel();
		l2.setLayout(new FlowLayout());
		Font F=new Font("楷体",Font.BOLD+ Font.ITALIC,20);
		l.setFont(F);
		JButton b=new JButton("确定");
		l2.add(b);
		b.setPreferredSize(new Dimension(80,40));
		this.setLayout(new BorderLayout());
		this.add(l,BorderLayout.NORTH);
		this.add(l2,BorderLayout.CENTER);
		this.setVisible(true);
		
	}
}
end

猜你喜欢

转载自blog.csdn.net/hudajy/article/details/80201144