java组件实现五子棋人人模式
2017-04-18 12:24
375 查看
1、页面布局
相关截图
首先明确的就是,窗体默认布局是边框布局,而面板则是流式布局所以就分为左中两个部分了
2、监听设计
监听由上图可知,分为面板监听和按钮监听,面板则是用mouselistener,按钮actionlistener
3、功能实现
其中有一个难点就是重绘,即重新绘制,当一点击最小化,或者一旦失去这个窗体的视图之后,再切换回来,之前所绘制的棋子就会消失,所以就会想到用重写paint方法
,还需要注意的就是计算棋子的个数是否已经达到了五个,定义一个计数器,遍历每行每列,已其中某个点为基准判断是否超过五个即可(其中有一个repent chess功能,
也就是悔棋没有实现)
4、具体代码:
相关截图
首先明确的就是,窗体默认布局是边框布局,而面板则是流式布局所以就分为左中两个部分了
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; } }
相关文章推荐
- 用Java实现的设计模式系列(3)--Builder
- 用单例模式实现的java连接MySql数据库
- 设计模式:用Java动态代理实现AOP
- 多例(Multiton)模式的Java实现[00原创]
- 原型(Prototype)模式的Java实现[00原创]
- 工厂方法(Factory Method)模式的Java实现[00原创]
- 用Java实现的设计模式系列(1)-Factory
- Java Tip: 用Reflection实现Visitor模式
- 23种经典设计模式的java实现_4_生成器模式
- 抽象工厂(Abstract Factory)模式的Java实现[00原创]
- 【 应用以及剖析】之 java.util.Observer 观察者模式实现
- 23种经典设计模式的java实现_1_抽象工厂模式
- 用JSP+Servlet+JavaBean模式实现一个简单的登录网页设计(JSP+Tomcat+MySQL)
- 23种经典设计模式的java实现_4_生成器模式
- 23种经典设计模式的java实现_3_桥接模式
- observer设计模式的java实现
- 创建型模式之一 工厂模式(Java实现)(一)
- 23种经典设计模式的java实现_2_适配器模式
- 23种经典设计模式的java实现_5_职责链模式
- 从设计模式学习oop思维,最后再具体通过java实现