java组件实现五子棋人人模式

1、页面布局

相关截图


首先明确的就是,窗体默认布局是边框布局,而面板则是流式布局所以就分为左中两个部分了

2、监听设计

监听由上图可知,分为面板监听和按钮监听,面板则是用mouselistener,按钮actionlistener

3、功能实现

其中有一个难点就是重绘,即重新绘制,当一点击最小化,或者一旦失去这个窗体的视图之后,再切换回来,之前所绘制的棋子就会消失,所以就会想到用重写paint方法

,还需要注意的就是计算棋子的个数是否已经达到了五个,定义一个计数器,遍历每行每列,已其中某个点为基准判断是否超过五个即可(其中有一个repent chess功能,

也就是悔棋没有实现)

4、具体代码:

package FiveChess;

import java.awt.BorderLayout;
import java.awt.Graphics;
import java.util.ArrayList;

import javax.swing.JFrame;

/**
 * 窗体布局
 * @author Administrator
 *
 */
public class FiveChessFrame extends JFrame{
	
	private static final long serialVersionUID = 1L;
	
	//定义一个数组,用于排除棋子同一个位置出现问题
	private int[][] chess = new int[14][14];
	private boolean gamestart = false;
	private FiveChessListener fcl;
//	定义一个队列用于悔棋操作
	private ArrayList<FiveChessNumber> list = new ArrayList<FiveChessNumber>();
	public static void main(String[] args){
		new FiveChessFrame().initFrame();
	}
	public boolean isGamestart() {
		return gamestart;
	}
	public void setGamestart(boolean gamestart) {
		this.gamestart = gamestart;
	}
	public int[][] getChess() {
		return chess;
	}
//	清空二维数组方法
	public void clearChess(int row,int column) {
		chess[row][column] = 0;
	}
	public ArrayList<FiveChessNumber> getList() {
		return list;
	}
	public void removeList() {
		if(list.size()>0){
			list.remove(list.size()-1);
		}
	}
	private void initFrame(){
		this.setSize(700,650);
		this.setTitle("SIMPLE_FIVECHESS");
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(3);
		this.setResizable(false);
		LeftPanel leftPanel = new LeftPanel(chess);
		RightPanel rightPanel = new RightPanel(this,fcl);
		this.add(leftPanel,BorderLayout.WEST);
		this.add(rightPanel,BorderLayout.CENTER);
		this.setVisible(true);
		Graphics g = leftPanel.getGraphics();
		fcl = new FiveChessListener(g,chess,this);
		leftPanel.addMouseListener(fcl);
	}
}

package FiveChess;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JOptionPane;

/**
 * 监听实现
 * @author Administrator
 *
 */
public class FiveChessListener extends MouseAdapter{
	private boolean flag = true;
	private int[][] chess;
	private Graphics g;
	private FiveChessFrame fcf;
	public FiveChessListener(Graphics g,int[][] chess,FiveChessFrame fcf){
		this.g = g;
		this.chess = chess;
		this.fcf = fcf;
	}
	public boolean isFlag() {
		return flag;
	}
	@Override
	public void mouseReleased(MouseEvent e) {
		int x = e.getX();
		int y = e.getY();
		for (int i = 0; i < chess.length; i++) {
			for (int j = 0; j < chess[i].length; j++) {
				int x0 = 25+50*j;
				int y0 = 25+50*i;
				if(!fcf.isGamestart()){
					JOptionPane.showConfirmDialog(null, "请点击开始游戏!");
					return;
				}else{
//					确定棋子出现在交叉点上
					if(x>x0-25&&x<x0+25&&y<y0+25&&y>y0-25){
//					确定是否已经落子
						if(chess[i][j]==0){
							if(flag){
								g.setColor(Color.green);
								g.fillOval(x0-20, y0-20, 40, 40);
								chess[i][j] = 1;
							}else{
								g.setColor(Color.black);
								g.fillOval(x0-20, y0-20, 40, 40);
								chess[i][j] = 2;
							}
							flag = !flag;
							FiveChessNumber chessNumber = new FiveChessNumber(i,j,x0,y0);
							fcf.getList().add(chessNumber);
							CheckResult check = new CheckResult(chess);
//							中断或,节省CPU资源
							if(check.checkRow(i, j)||check.checkColumn(i, j)||check.checkLeft(i, j)||check.checkRight(i, j)){
								if(flag){
									JOptionPane.showConfirmDialog(null, "black is successful","提示",1);
								}else{
									JOptionPane.showConfirmDialog(null, "green is successful","提示",1);
								}
							}
						}
						return;
					}
				}
			}
		}
	}
}

package FiveChess;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;

import javax.swing.ImageIcon;
import javax.swing.JPanel;

/**
 * 左边面板
 * @author Administrator
 *
 */
public class LeftPanel extends JPanel{
	private int[][] chess;
	private ImageIcon images = new ImageIcon("image/chess.jpg");
	public LeftPanel(int[][] chess){
		this.initPanel();
		this.chess = chess;
	}
	private void initPanel(){
		this.setPreferredSize(new Dimension(550,0));
	}
	@Override
	public void paint(Graphics g) {
		super.paint(g);
		g.drawImage(images.getImage(),0,0,this.getWidth(),this.getHeight(),null);
//		绘制纵线
		for (int i = 0; i < 14; i++) {
			g.drawLine(25, 25+50*i, 525, 25+50*i);
		}
//		绘制横线
		for (int i = 0; i < 14; i++) {
			g.drawLine(25+50*i, 25, 25+50*i, 575);
		}
//		重新绘制棋子
		for (int i = 0; i < chess.length; i++) {
			for (int j = 0; j < chess[i].length; j++) {
				int x0 = 25+50*j;
				int y0 = 25+50*i;
				if(chess[i][j]==1){
					g.setColor(Color.green);
					g.fillOval(x0-20, y0-20, 40, 40);
				}else if(chess[i][j]==2){
					g.setColor(Color.black);
					g.fillOval(x0-20, y0-20, 40, 40);
				}
			}
		}
	}
}

package FiveChess;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JOptionPane;
import javax.swing.JPanel;

/**
 * 右边面板
 * @author Administrator
 *
 */

public class RightPanel extends JPanel implements ActionListener{
	private FiveChessFrame fcf;
	private FiveChessListener fcl;
//	private boolean buttonOperation = true;
	private JButton jb;
	public RightPanel(FiveChessFrame fcf,FiveChessListener fcl){
		this.fcf = fcf;
		this.initPanel();
		this.fcl = fcl;
	}
	private void initPanel(){
		this.setBackground(new Color(230,230,200));
		String[] buttonSelection={"game began","stop","repent chess","reset game","exit game"};
		for (int i = 0; i < buttonSelection.length; i++) {
			jb = new JButton(buttonSelection[i]);
			jb.setPreferredSize(new Dimension(100,50));
			this.add(jb);
			jb.addActionListener(this);
//			if(jb.getText().equals("game began")){
//				jb.setEnabled(buttonOperation);
//			}
		}
	}
	@Override
	public void actionPerformed(ActionEvent arg0) {
		String command = arg0.getActionCommand();
		if("game began".equals(command)){
			fcf.setGamestart(true);
		}else if("stop".equals(command)){
			fcf.setGamestart(false);
			JOptionPane.showMessageDialog(null, "游戏暂停中,是否继续?","提示",2);
			fcf.setGamestart(true);
		}else if("repent chess".equals(command)){
//			fcf.removeList();
//			fcf.repaint();
//			boolean colorflag = fcl.isFlag();
//			colorflag = !colorflag;
		}else if("reset game".equals(command)){
			int[][] newchess = fcf.getChess();
			for (int i = 0; i < newchess.length; i++) {
				for (int j = 0; j < newchess[i].length; j++) {
					fcf.clearChess(i,j);
					fcf.repaint();
				}
			}
		}else if("exit game".equals(command)){
//			退出游戏(程序退出)
			System.exit(0);
		}
	}
}

package FiveChess;

import java.awt.Color;

/**
 * 棋子类
 * @author Administrator
 *
 */
public class FiveChessNumber {
	private int row,column; 
	public int x,y;
	public FiveChessNumber(int row, int column, int x, int y) {
		this.row = row;
		this.column = column;
		this.x = x;
		this.y = y;
	}
}

package FiveChess;

/**
 * 计算结果集
 * @author Administrator
 *
 */
public class CheckResult {
	private int[][] chess;
	public CheckResult(int[][] chess) {
		this.chess = chess;
	}
	public boolean checkRow(int row,int column){
//		定义一个计数器,用于判断是否为五子
		int count = 1;
		for (int i = column-1; i >0;i--) {
			if(chess[row][column]==chess[row][i]){
				count++;
			}else{
				break;//跳出当层循环
			}
		}
		for (int i = column+1; i < chess[0].length; i++) {
			if(chess[row][column]==chess[row][i]){
				count++;
			}else{
				break;
			}
		}
		if(count>=5){
			return true;
		}
		return false;
	}
	public boolean checkColumn(int row,int column){
		int count = 1;
		for (int i = row-1; i > 0; i--) {
			if(chess[row][column]==chess[i][column]){
				count++;
			}else{
				break;
			}
		}
		for (int i = row+1; i < chess.length; i++) {
			if(chess[row][column]==chess[i][column]){
				count++;
			}else{
				break;
			}
		}
		if(count>=5){
			return true;
		}
		return false;
	}
	public boolean checkLeft(int row,int column){
		int count = 1;
		for (int i = row+1,j = column-1;i < chess.length&&j > 0;i++,j--) {
			if(chess[row][column]==chess[i][j]){
				count++;
			}else{
				break;
			}
		}
		for (int i = row-1,j = column+1;i > 0&&j<chess[i].length;i--,j++) {
			if(chess[row][column]==chess[i][j]){
				count++;
			}else{
				break;
			}
		}
		if(count>=5){
			return true;
		}
		return false;
	}
	public boolean checkRight(int row,int column){
		int count = 1;
		for (int i = row-1,j = column-1;i>0&&j>0;i--,j--) {
			if(chess[row][column]==chess[i][j]){
				count++;
			}else{
				break;
			}
		}
		for (int i = row+1,j = column+1; i < chess.length&&j<chess[i].length; i++,j++) {
			if(chess[row][column]==chess[i][j]){
				count++;
			}else{
				break;
			}
		}
		if(count>=5){
			return true;
		}
		return false;
	}
}



评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值