您的位置:首页 > 编程语言 > Java开发

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

2017-04-18 12:24 375 查看
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.
4000
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;
}
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: