五子棋机器与机器对战最简化版本

五子棋机器与机器对战最简化版本

  • 作者:Geticsen
  • 时间:2019-10-13
  • 47人已阅读
简介 五子棋机器与机器对战最简化版本,这是最佳化的版本,没有用数据库,其实可以用数据库来记录最优棋盘来优化算法。

image.png

image.png

这个版本和以前的差距不是太大直接上代码了:

package wuziqi1;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

public class Main_frame extends JFrame implements MouseListener,Runnable{
	Mypan  pan;
	int width=450;
	int height=450;
	int using=1;
	public static void main(String []args) {
		Main_frame my=new Main_frame();
		Thread thread=new Thread(my);
		thread.start();
	}
	public Main_frame() {
		pan=new Mypan(width,height);
		pan.addMouseListener(this);
		this.add(pan);
		this.setTitle("五子棋"); 
		this.setSize(width+47, height+69);
		this.setVisible(true);
		this.setLocation(200, 200);
		this.setResizable(false);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	@Override 
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseEntered(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mouseExited(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void mousePressed(MouseEvent arg0) {
		// TODO Auto-generated method stub
		System.out.println(arg0.getX()+"  "+arg0.getY()+"");
		//获得坐标后转换维数组坐标
		int x=(arg0.getX()+14)/30-1;
		int y=(arg0.getY()+14)/30-1;
		System.out.println(x+"  "+y);
		
	}
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void run() {
   while(true)
   {
	    try {
		    Thread.sleep(1000);
			if(using==1){
				//pan.chess[y][x]=1;
				pan.randomChess(1);
				pan.repaint();
				//判断是否五颗一条线
				if(pan.judge(pan.x,pan.y,1)){
					 
					//System.out.println("5555555555555555555555555555555555555555555555");
					JOptionPane.showMessageDialog(this, "已经五子"+1+"胜出");
					using=1;
					pan.clearChess();
					
				}else {
					using=2;
				}
			}
			Thread.sleep(1000);
	        if(using==2){
				//自动完成自动落子
				pan.randomChess(2);
				pan.repaint();
				//判断是否五颗一条线
				if(pan.judge(pan.x, pan.y,2)){
					
					//System.out.println("5555555555555555555555555555555555555555555555");
					JOptionPane.showMessageDialog(this, "已经五子"+2+"胜出");
					using=1;
					pan.clearChess();
					
				}else {
					using=1;
				}
				
			}
		    pan.repaint();
	    } catch (InterruptedException e) {
		 // TODO Auto-generated catch block
	    	e.printStackTrace();
	  }
   }
   
		
	}

}

class Mypan extends JPanel{
	
	int width;
	int height;
	int x,y;
	//冲二冲三冲四
	int er=4,san=8,si=7;
	int chess[][]=new int[15][15];
	
	public  Mypan(int width,int height){
		this.height=height;
		this.width=width;
		this.setBackground(Color.white);
		this.setSize(width+17,height+139);
		this.setVisible(true);
	}
	
	public void paint(Graphics g){
		super.paint(g);
		g.setColor(Color.black);
		//画出横
		for(int i=0;i<15;i++) {
			if(i==0||i==14) {
				g.setColor(Color.red);
			}else {
				g.setColor(Color.BLACK);
			}
			g.drawString(String.valueOf(i+1), 15, i*30+30);
		    g.drawLine(30, i*30+30, this.width, i*30+30);
		}
		//画出竖
        for(int i=0;i<15;i++){
        	if(i==0||i==14) {
				g.setColor(Color.red);
			}else {
				g.setColor(Color.BLACK);
			}
         g.drawString(String.valueOf(i+1), i*30+15,30);
         g.drawLine(i*30+30, 30,  i*30+30,this.height);
		}
        //画出棋子
       
        for(int i=0;i<15;i++) {
        	for(int j=0;j<15;j++) {
        		//System.out.print(chess[i][j]+" ");
        		if(chess[j][i]!=0) {
        			//正数自己的棋子
        			if(chess[j][i]==1) {
        				 g.setColor(Color.BLACK);
        				g.fillOval((i+1)*30-13, (j+1)*30-13, 26, 26);
        			}else if(chess[j][i]==2) {
        				//别人的棋子
        			    g.setColor(Color.RED);
        				g.fillOval((i+1)*30-13, (j+1)*30-13, 26, 26);
        			}
        		}
        	}
        	//System.out.println();
        }
        System.out.println();
	}
	public boolean judge(int x,int y,int type){
		boolean count=false;
		for(int i=0;i<4;i++) {
			if(find(x,y,i,type)>=5){
				count=true;
				break;
			}
		}
		return count;
	}
	//找到连接的棋子数
	public int find(int x,int y,int dir,int type){
		int sum1=0,sum2=0;
		int y1=y,x1=x;
		switch(dir) 
		{
		case 0:
			//两半查找    横  左右
			for(int i=0;i<5;i++) {
				if(--x1<0) {
					break;
				}
				if(chess[y][x1]!=type) {
					break;
				}else {
					sum1++;
				}
			}
	        for(int i=0;i<5;i++) {
	        	if(++x>14) {
					break;
				}
				if(chess[y][x]!=type) {
					break;
				}else {
					sum2++;
				}
			}
			break;
		case 1:
			//两半查找   竖 上下
			for(int i=0;i<5;i++) {
				if(++y1>14){
					break;
				}
				if(chess[y1][x]!=type) {
					break;
				}else{
					sum1++;
				}
			}
	        for(int i=0;i<5;i++) {
	        	if(--y<0) {
					break;
				}
				if(chess[y][x]!=type) {
					break;
				}else{
					sum2++;
				}
			}
			break;
		case 2:
			//两半查找   撇  
			for(int i=0;i<5;i++) 
			{
				if(++x1>14||++y1>14) {
					break;
				}
				if(chess[y1][x1]!=type) {
					break;
				}else {
					sum1++;
				}
			}
	        for(int i=0;i<5;i++) {
	        	if(--x<0||--y<0) {
					break;
				}
				if(chess[y][x]!=type) {
					break;
				}else {
					sum2++;
				}
			}
			break;
		case 3: 
			//两半查找   捺
			for(int i=0;i<5;i++) 
			{
				if(++x1>14||--y1<0) {
					break;
				}
				if(chess[y1][x1]!=type) {
					break;
				}else {
					sum1++;
				}
			}
	        for(int i=0;i<5;i++) {
	        	if(--x<0||++y>14) {
					break;
				}
				if(chess[y][x]!=type) {
					break;
				}else {
					sum2++;
				}
			}
			
			break;
	     }
		return sum1+sum2+1;
		
	}
	//电脑自由下棋
	public void randomChess(int type){
		
		int cumputer[][][]=new int [15][15][4];
		int user[][][]=new int [15][15][4];
		int max1=0,max2=0;
		int location[][]=new int [2][2];
		for(int i=0;i<15;i++) {
			for(int j=0;j<15;j++) {
				if(this.chess[j][i]==0)
				{   
					int sum=0;
					for(int k=0;k<4;k++){
						cumputer[j][i][k]=this.find(i, j, k, 2);
						if(cumputer[j][i][k]==3) {
							sum+=this.er+(int)Math.random()*2;
						}else if(cumputer[j][i][k]==4) {
							sum+=this.san+10+(int)Math.random()*3;
						}else if(cumputer[j][i][k]==5){
							sum+=this.si+15+(int)Math.random()*4;
						}else {
							sum+=cumputer[j][i][k];
						}
						
					}
					if(max1<sum) {
						max1=sum;
						location[0][0]=j;
						location[0][1]=i;
					}
				}
				
			}
		}
		
		for(int i=0;i<15;i++) {
			for(int j=0;j<15;j++) {
				if(this.chess[j][i]==0)
				{
					int sum=0;
					for(int k=0;k<4;k++) {
						user[j][i][k]=this.find(i, j, k, 1);
						if(user[j][i][k]==3) {
							sum+=this.er+(int)Math.random()*2;
						}else if(user[j][i][k]==4) {
							sum+=this.san+10+(int)Math.random()*3;
						}else if(user[j][i][k]==5){
							sum+=this.si+7+(int)Math.random()*4;
						}else{
							sum+=user[j][i][k];
						}
						
					}
					if(max2<sum) {
						max2=sum;
						location[1][0]=j;
						location[1][1]=i;
					}
				}
				
			}
		}
		//贪心决策
		//都为零自动下子
		if(max2==4&&max1==4) {
			int x=(int)(Math.random()*100)%15;
			int y=(int)(Math.random()*100)%15;
			System.out.println(x+"  111111111111111111111  "+y);
			chess[y][x]=1;
			this.x=x;
			this.y=y;
		}else if(max1>=max2){
			chess[location[0][0]][location[0][1]]=type;
			x=location[0][1];
			y=location[0][0];
		}else{
			chess[location[1][0]][location[1][1]]=type;
			x=location[1][1];
			y=location[1][0];
		}
		
		
		
	}
	public void clearChess() {
		for(int i=0;i<15;i++) {
			for(int j=0;j<15;j++) {
				this.chess[i][j]=0;
			}
		}
		
	}

	
}


文章评论

Top