⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 五子棋.txt

📁 一个java做的简单的五子棋的源代码
💻 TXT
字号:
package yang;

import javax.swing.*;
import java.awt.*;
import java.awt.event.*;

public class ChessBoard extends JFrame {
	int width;
	int margin;
	int num;
	double gap;
	int x0,y0;
	int i0,j0;
	int oldi=-1,oldj=-1;
	ChessPoint [][] points;
	public ChessBoard(int width,int num){
		this.width=width;
		this.num=num;
		x0=y0=50;
		margin=20;
		gap=(double)(width-2*margin)/(num-1);
		init();
		
		this.setSize(2*x0+width,2*y0+width);
		this.setVisible(true);
		this.addMouseListener(ml);
		this.addWindowListener(wl);
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		ChessBoard ch=new ChessBoard(500,20);
		ch.display();
	}
	public void init(){
		points=new ChessPoint[num][num];
		for(int i=0;i<points.length;i++){
			for(int j=0;j<points[i].length ;j++){
				points[i][j]=new ChessPoint((int)(x0+margin+gap*j),(int)(y0+margin+gap*i),0);
			}
		}
//		points[6][6].state=1;
	}
	public void display(){
		for(int i=0;i<points.length;i++){
			for(int j=0;j<points[i].length ;j++){
				System.out.print(points[i][j]);
			}
			System.out.println();
		}
	}
	public void displayBackgroung(Graphics g){
		g.setColor(Color.ORANGE);
		g.fillRect(x0,y0,width,width);
		g.setColor(Color.white);
		int t=0;
		for(int i=0;i<num;i++){
			g.drawLine(x0+margin, t=i==num-1?y0+width-margin:(int)(y0+margin+i*gap),x0+width-margin, t);
			g.drawLine(t=i==num-1?x0+width-margin:(int)(x0+margin+i*gap),y0+margin, t,y0+width-margin);
		}
	}
	public void display(Graphics g){
		for(int i=0;i<points.length;i++){
			for(int j=0;j<points[i].length ;j++){
				points[i][j].display(g);
			}
		}
	}
	public void paint(Graphics g){
		displayBackgroung(g);
		display(g);
	}
	public boolean valid(int i,int j){
		return i>=0 && i<num && j>=0 && j<num;
	}
	public boolean end(int i,int j){
		return false;
	}
	public void think(){
		//initScore
		initScore();
		//eval
		eval();
		//getMax
		getMax();
	}
	private void initScore(){
		for(int i=0;i<points.length;i++){
			for(int j=0;j<points[i].length;j++){
				if(points[i][j].state!=ChessPoint.NONE) continue;
				points[i][j].score=0;
			}
		}
	}
	private void eval(){
		int beginX[]={0,0,0,0,0,num-1};
		int beginY[]={0,0,0,1,0,1};
		int lineOffsetX[]={0,1,1,0,1,0};
		int lineOffsetY[]={1,0,0,1,0,1};
		int offsetX[]={1,0,1,1,-1,-1};
		int offsetY[]={0,1,1,1,1,1};
		int wScore[]={0,10,50,500,5000};
		int bScore[]={0,10,50,500,5000};
		for(int k=0;k<beginX.length;k++){
			int lineBeginX=beginX[k];
			int lineBeginY=beginY[k];
			line:for(;valid(lineBeginX,lineBeginY);lineBeginX+=lineOffsetX[k],lineBeginY+=lineOffsetY[k]){
				int x=lineBeginX;
				int y=lineBeginY;
				point:for(;valid(x,y);x+=offsetX[k],y+=offsetY[k]){
					//compute num
					int m=0;
					int state=0;
					
					for(int l=0;l<5;l++){
						int xx=x+l*offsetX[k];
						int yy=y+l*offsetY[k];
						if(!valid(xx,yy)){
							continue line;
						}
						if(state==0){
							if(points[xx][yy].state!=0){
								state=points[xx][yy].state;
								m=1;
							}
						}
						else{
							if(points[xx][yy].state!=0){
								if(state==points[xx][yy].state){
									m++;
								}
								else{
									continue point;
								}
							}
						}
						
					}
					if(m>=5){
						throw new RuntimeException("End. You know?");
					}
					if(m==0)
						continue;
					//accumulate score
					int s=state==ChessPoint.BLACK?bScore[m]:wScore[m];
					for(int l=0;l<5;l++){
						int xx=x+l*offsetX[k];
						int yy=y+l*offsetY[k];
						if(points[xx][yy].state==ChessPoint.NONE){
							points[xx][yy].score+=s;
						}
					}
				}
			}
		}
	}
	private void getMax(){
		int max=0;
		i0=j0=-1;
		for(int i=0;i<points.length;i++){
			for(int j=0;j<points[i].length;j++){
				if(points[i][j].state!=ChessPoint.NONE) continue;
				if(points[i][j].score>max){
					max=points[i][j].score;
					i0=i;j0=j;
				}
			}
		}
		if(i0==-1){
			i0=j0=num/2;
		}
	}
	transient MouseListener ml=new MouseAdapter(){
		public void mouseClicked(MouseEvent e){
			//compute i,j clicked
			int i=(int)Math.round((e.getY()-y0-margin)/gap);
			int j=(int)Math.round((e.getX()-x0-margin)/gap);
			//valid?
			if(!valid(i,j))
				return;
			if(points[i][j].state!=ChessPoint.NONE){
				return;
			}
			//set black
			points[i][j].state=ChessPoint.BLACK;
			repaint();
			if(end(i,j)){
				JOptionPane.showMessageDialog(ChessBoard.this,  "Congratulation!");
				if(JOptionPane.showConfirmDialog(ChessBoard.this, "Continue ?")==JOptionPane.NO_OPTION){
					init();
					return;
				}
				else{
					setVisible(false);
					System.exit(0);
				}
			}
			//compute go
			think();
			if(oldi>=0){
				points[oldi][oldj].isLast=false;
			}
			oldi=i0;oldj=j0;
			points[i0][j0].isLast=true;
			points[i0][j0].state=ChessPoint.WHITE;
			
			repaint();
			if(end(i0,j0)){
				JOptionPane.showMessageDialog(ChessBoard.this,  "Don't be dismayed.Come on!");
				if(JOptionPane.showConfirmDialog(ChessBoard.this, "Continue ?")==JOptionPane.NO_OPTION){
					init();
					return;
				}
				else{
					setVisible(false);
					System.exit(0);
				}
			}
		}
	};
	transient WindowListener wl=new WindowAdapter(){
		public void windowClosing(WindowEvent e){
			setVisible(false);
			System.exit(0);
		}
	};
}








package yang;

import java.awt.*;
public class ChessPoint extends Point {
	int state; //1:black; 2:white; 0:none
	public static final int BLACK=1;
	public static final int WHITE=2;
	public static final int NONE=0;
	boolean isLast=false;
	int score;
	private int r=10;
	
	public ChessPoint(){
		super();
//		this(0,0,0);
	}
	public ChessPoint(int x,int y){
		super(x,y);

		state=0;
//		this(x,y,0);
	}
	public ChessPoint(int x,int y,int state){
		super(x,y);
		this.state=state;
//		this.BLACK=3;
	}
	/**
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		new ChessPoint();
		new ChessPoint(5,5);
		new ChessPoint(6,6,1);
	}
	public String toString(){
		return super.toString()+":"+state;
	}
	void f(){
		final int X=0;
	}
	public void display(Graphics g){
		switch(state){
		case BLACK:
			g.setColor(Color.black);
			g.fillOval(x-r, y-r, 2*r, 2*r);
			break;
		case WHITE:
			g.setColor(Color.white);
			if(isLast){
				g.fillRect(x-r, y-r, 2*r, 2*r);
			}
			else 
				g.fillOval(x-r, y-r, 2*r, 2*r);
			break;
		}
	}

}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -