java实现的人人对战五子棋

五子棋窗体类:

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

/**
 * 创建五子棋窗体类,继承自Jframe类
 * 
 * @author Administrator
 * 
 */
public class Chessframe extends JFrame {
	// 设置属性
	private Graphics g;
	private Image image=new ImageIcon("images/chessboard.jpg").getImage();
	private List<Drawchess> list = new ArrayList<Drawchess>();
	private int high = 500, length = 500, num = 10, X1, X2, Y1, Y2;

	/**
	 * 主函数
	 */
	public static void main(String[] args) {
		Chessframe chf = new Chessframe();
	}

	/**
	 * 构造方法
	 */
	public Chessframe() {
		inut();
	}

	private void inut() {
		// 初始化窗体
		this.setTitle("五子棋");
		this.setSize(new Dimension(650, 600));
		this.setDefaultCloseOperation(3);
		this.setLocationRelativeTo(null);
		this.setLayout(new BorderLayout());//设置窗体为边框布局
		JPanel jpa=new JPanel();//实例化面板对象
		JPanel jpa2=new JPanel();//实例化面板对象
		jpa.setLayout(new GridLayout(4,1,5,5));//设置面板为网格布局,并指定为四行一列
		JButton jub=new JButton("重新开局");//实例化"重新开局"的按钮对象
		JButton jub_RE=new JButton("悔棋");//实例化"悔棋"的按钮对象
		JButton jub_CL=new JButton("关闭游戏");//实例化"关闭游戏"的按钮对象
		jub.setPreferredSize(new Dimension(90,10));//设置按钮的首选大小为90*50
		
		jpa.add(jub_RE);//将悔棋按钮加到面板上
		jpa.add(jub);//将重新开局"按钮加到面板上
		jpa.add(jub_CL);//将关闭游戏"按钮加到面板上
		jpa2.add(jpa);//将面板添加到窗体的东边的面板上
		this.add(jpa2,BorderLayout.EAST);//将面板添加到窗体的东边
		
		this.setVisible(true);//设置窗体为可见
		g = this.getGraphics();//获取画布对象,一定要在设置可见之后
		
		Chesslis al = new Chesslis(g, list, this);//实例化鼠标监听器类对象
		this.addMouseListener(al);//向窗体上添加鼠标监听器
		
		ACLis acl=new ACLis(this,list,al);//实例化按钮的动作监听器对象
		/**
		 * 给三个按钮添加动作监听器
		 */
		jub.addActionListener(acl);//给重新开局按钮添加动作监听器
		jub_RE.addActionListener(acl);//给悔棋按钮添加动作监听器
		jub_CL.addActionListener(acl);//给关闭游戏按钮添加动作监听器		
	}

	/**
	 * 重写重绘方法
	 */
	public void paint(Graphics g) {
		super.paint(g);
		this.drawcp();
		for (int i = 0; i < list.size(); i++) {
			list.get(i).draw();
		}
		g.drawImage(image, 50, 50, null);
	}

	/**
	 * 画棋盘的方法
	 */
	private void drawcp() {
		// 画竖线
		for (int i = 0; i < num; i++) {
			X1 = 50 + i * 50;
			X2 = 50 + i * 50;
			Y1 = 50;
			Y2 = high;
			g.setColor(Color.black);
			g.drawLine(X1, Y1, X2, Y2);
		}
		// 画横线
		for (int i = 0; i < num; i++) {
			Y1 = 50 + i * 50;
			Y2 = 50 + i * 50;
			X1 = 50;
			X2 = length;
			g.drawLine(X1, Y1, X2, Y2);
		}

	}

}

 动作监听器类:

import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.List;

/**
 * 创建动作监听器类,用于重新开局和悔棋按钮,该类实现了ActionListener接口
 * @author Administrator
 *
 */
public class ACLis implements ActionListener{

	private Chessframe chf;
	private List<Drawchess> list;
	private Chesslis al;
	private int[][] array;
	/**
	 * 构造方法
	 * @param list 
	 * @param al 
	 * @param chessframe
	 */
	public ACLis(Chessframe chf, List<Drawchess> list, Chesslis al) {
		// TODO Auto-generated constructor stub
		this.chf=chf;
		this.list=list;
		this.al=al;
	}

	/**
	 * 接口中动作处理的方法
	 */
	public void actionPerformed(ActionEvent e) {
		// TODO Auto-generated method stub
		if(e.getActionCommand().equals("重新开局")){
			list.clear();//将list集合清空
			chf.repaint();//重绘窗体,好除去所有的棋子
			al.array=new int[10][10];//将二维数组清空
			al.sum=0;//将计数器清空
			al.show();
			chf.addMouseListener(al);//重新给窗体添加上鼠标监听器
		}else if(e.getActionCommand().equals("悔棋")){
			int X,Y,sum;
			array=al.array;//获取到控制棋子的数组
			X=list.get(list.size()-1).X;//获取到最后一个棋子所在的坐标值的X值
			Y=list.get(list.size()-1).Y;//获取到最后一个棋子所在的坐标值的Y值
			array[X/50-1][Y/50-1]=0;//控制棋子数组的最后一个棋子对应的值清空
			sum=al.sum;//获取计数器的值
			al.array=array;//将操作完成后的数组重新赋给原数组
			al.sum=--sum;//将操作完成后的计数器重新赋给计数器__对计数器的值减一
			al.show();
			list.remove(list.size()-1);//将list集合中最后一个元素删去
			chf.addMouseListener(al);//重新给窗体添加上鼠标监听器
			chf.repaint();//重绘窗体,好除去最后一个的棋子
		}else{
//			chf.setVisible(false);
		}
	}

}

 鼠标监听器类:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.util.List;

import javax.swing.JOptionPane;

/**
 * 创建鼠标监听器类,该类实现了MouseListener接口
 * @author Administrator
 *
 */
public class Chesslis implements MouseListener {
	//设置属性
	private Graphics g;
	private Chessframe chf;
	private List<Drawchess> list;
	/**
	 * X1,Y1表示鼠标点击处的坐标;XM,YM表示X1,Y1比50的模;
	 * X2,Y2表示下棋点存储到数组中的位置;X,Y表示应落棋子的交叉处的坐标
	 */
	private int X1,Y1,X,Y,X2,Y2,XM,YM;
	/**
	 * sum是判断黑白子的计数器
	 */
	public int sum=0;
	private Color color;
	public int array[][]=new int[10][10];
	/**
	 * 构造方法
	 * @param chf 
	 */
	public  Chesslis(Graphics g,List<Drawchess> list, Chessframe chf){
		this.g=g;
		this.list=list;
		this.chf=chf;
	}

	/**
	 * 被点击时的方法
	 */
	@Override
	public void mouseClicked(MouseEvent arg0) {
		// TODO Auto-generated method stub
//		Graphics2D g2=(Graphics2D)g;
	
	}

	@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) {
		System.out.println("++++++++++++++++++++"+sum+"++++++++++++++++++");
		// TODO Auto-generated method stub
		X1=arg0.getX();   XM=X1%50;
		Y1=arg0.getY();   YM=Y1%50;
		//判断点击的点是否在棋盘内
		if(!(X1>=50&&X1<=500&&Y1>=50&&Y1<=500)){
			System.out.println("未点在棋盘内"+"xxxxxxxxxxxxxx"+X1+"yyyyyyyyyyyyyyy"+Y1);
			return;
		}
		//用计数器判断是该下那种颜色的棋子
		if(sum%2==0){
			color=Color.black;//偶次下黑子
		}else{
			color=Color.white;//奇次下白子
		}
		
		//判断按压的位置接近哪个交叉处就在那个地方画棋子
		if(XM<=25&&YM<=25){
			X=X1-XM;Y=Y1-YM;
								}else if(XM<=25&&YM>=25){
									X=X1-XM;Y=Y1-YM+50;
								}else if(XM>=25&&YM<=25){
									X=X1-XM+50;Y=Y1-YM;
								}else if(XM>=25&&YM>=25){
									X=X1-XM+50;Y=Y1-YM+50;
								}
		//遍历list集合看看在该处是否已经画了点
		for(int i=0;i<list.size();i++){
			if(X==list.get(i).X&&Y==list.get(i).Y){
				return;
			}
		}
		Drawchess dra=new Drawchess(g,X,Y,color);
		dra.draw();
		list.add(dra);
		//检查返回值,当有一方获胜时(返回为true时)将原窗体设为不可见,再创建一个窗体对象
		if(checkwin()) {
			chf.removeMouseListener(this);//当有一方获胜时,移除该鼠标监听器
			return;
		}
		
		sum++; //计数器加一
	}
	/**
	 * 判断是否获胜的方法
	 * @return
	 */

	private boolean  checkwin() {
		int counth=0,counts=0,countlu=0,countrd=0;
		X2=X/50-1;Y2=Y/50-1;
		if(sum%2==0){
			array[X2][Y2]=1;//偶次记黑子
			show();
		}else{
			array[X2][Y2]=-1;//奇次记白子
			show();
		}
		//向右
		for(int i=X2+1;i<array.length;i++){
			if(array[i][Y2]==array[X2][Y2]){
				counth++;
			}else break;
		}
		//向左
		for(int i=X2-1;i>=0;i--){
			if(array[i][Y2]==array[X2][Y2]){
				counth++;
			}else break;
		}
		//向上
		for(int i=Y2+1;i<array[X2].length;i++){
			if(array[X2][i]==array[X2][Y2]){
				counts++;
			}else break;
		}
		//向下
		for(int i=Y2-1;i>=0;i--){
			if(array[X2][i]==array[X2][Y2]){
				counts++;
			}else break;
		}
		//左上
		for(int i=X2-1,j=Y2+1;i>=0&&j<array[i].length;i--,j++){
			if(array[i][j]==array[X2][Y2]){
				countlu++;
			}else break;
		}
		//右下
		for(int i=X2+1,j=Y2-1;i<array.length&&j>=0;i++,j--){
			if(array[i][j]==array[X2][Y2]){
				countlu++;
			}else break;
		}
		//右上
		for(int i=X2+1,j=Y2+1;i<array.length&&j<array[i].length;i++,j++){
			if(array[i][j]==array[X2][Y2]){
				countrd++;
			}else break;
		}
		//左下
		for(int i=X2-1,j=Y2-1;i>=0&&j>=0;i--,j--){
			if(array[i][j]==array[X2][Y2]){
				countrd++;
			}else break;
		}
		if(counts>=4||counth>=4||countlu>=4||countrd>=4){
			if(sum%2==0){
				System.out.println("黑棋获胜");//偶次下黑子
				JOptionPane.showMessageDialog(null,"黑棋获胜\n重新开局");
				return true;
			}else{
				System.out.println("白棋获胜");//奇次下白子
				JOptionPane.showMessageDialog(null,"白棋获胜\n重新开局");
				return true;
			}
	}
		return false;
	}

	@Override
	public void mouseReleased(MouseEvent arg0) {
		// TODO Auto-generated method stub
		
	}

	/**
	 * 输出数组中的值
	 */
	public void show(){
		for(int i=0;i<array.length;i++){
			for(int j=0;j<array[i].length;j++){
				System.out.print("     "+array[i][j]);
			}
			System.out.println("");
		}
		System.out.println("========================="+sum+"==============================");
	}

}

 画棋子的类:

import java.awt.Color;
import java.awt.Graphics;
import java.util.List;

/**
 * 创建画棋子类,便于直接将该类的对象添加到集合中,便于重绘
 * @author Administrator
 *
 */
public class Drawchess {
	private Graphics g;
	public int X,Y;
	private Color color;
	/**
	 * 构造方法
	 */
	public Drawchess(Graphics g, int X, int Y, Color color) {
		this.g=g;
		this.X=X;
		this.Y=Y;
		this.color=color;
	}
	public void draw(){
		//设置颜色
		g.setColor(color);
		//画棋子的方法
			g.fillOval(X-20, Y-20, 40, 40);
								
	}
}

 

你可能感兴趣的:(java实现)