小练习--非人机版五子棋



 

 

                                                                   简单五子棋

一.窗体显示

 

    设置窗体的大小,标题,可见,退出程序自动关闭......用一个show函数来执行

    源代码:

    package net.java.cn;
    import java.awt.FlowLayout;
    import javax.swing.JFrame;
    import javax.swing.JTable;

/**

*

*继承了JFrame的窗体

*
*/    public class WzqUI  extends JFrame{

 

 

/**

*

*主函数

*
*/    
       public static void main(String[] args){
       WzqUI wzq=new WzqUI();
       wzq.initUI();
       } 
  
  

/**

*

*显示方法

*
*/    
   public void initUI(){
   this.setTitle("五子棋V1.CL制作");
   this.setSize(800,800);

   //创建一个流式布局对象并添加
   FlowLayout fl=new FlowLayout();
   this.setLayout(fl);
   JTable table=new JTable();

   // 创建表格模型对象,又是一个鼠标监听器对象
   MyModel model = new MyModel();
   // 设置表格的数据模型
   table.setModel(model);

   //给表格添加鼠标监听器
   table.addMouseListener(model);

   //设置行高
   table.setRowHeight(33);
   //设置列宽,必须得一列一列的分开设置
   for(int i=0;i<table.getColumnCount();i++){
    //得到表格的列模型
    javax.swing.table.TableColumnModel tcm=table.getColumnModel();
    //根据列的模型得到每个列对象
    javax.swing.table.TableColumn tc=tcm.getColumn(i);
    tc.setPreferredWidth(33);
    
   }
   //设置禁止表格选中一行
   table.setRowSelectionAllowed(false);
   //五子棋窗体添加table(表格)

   this.add(table );

   //设置点击关闭程序的时候退出程序

   this.setDefaultCloseOperation(3);   

   //创建悔棋和重下的按钮并添加
   javax.swing.JButton btnHQ = new javax.swing.JButton("悔棋");
   javax.swing.JButton btnCX = new javax.swing.JButton("重下");
   this.add(btnHQ);
   this.add(btnCX);

   //设置窗体可见
   this.setVisible(true);

   //创建两个按钮监听器对象,给监听器传入model和table
   BAction al =new BAction(model,table);
   CAction bl =new CAction(model,table);
   btnHQ.addActionListener(al);
   btnCX.addActionListener(bl);
   
   
  }

}

 

二.数据模型及鼠标监听器的实现

package net.java.cn;

import java.awt.event.MouseEvent;
import java.awt.event.MouseAdapter;
import javax.swing.event.TableModelListener;
import javax.swing.table.TableModel;
import javax.swing.JTable;
import java.util.ArrayList;

/**
 * 表格的数据模型类继承了表格数据模型接口,同时也是一个鼠标监听器类继承了鼠标适配器类(一个虚拟类)
 * 表格要加载数据就要设置数据模型table.addModel(数据模型类对象model)
 *
 * @author kowloon注意:extends要在implements之前
 */
public class MyModel extends MouseAdapter implements TableModel {

 /* private int[] sour = new int[2]; */private ArrayList list = new ArrayList();

 // 定义一个数组,用来存放需要显示的数据Imagelcon为图像类
 javax.swing.ImageIcon[][] data = new javax.swing.ImageIcon[20][20];
 public int count = 0;// 计数器
 public int num = 0;// 用来统计放的棋子个数
 public int a = 0;
 // 定义两个图片对象
 private javax.swing.ImageIcon white = new javax.swing.ImageIcon(
   "images/white.jpg");
 private javax.swing.ImageIcon black = new javax.swing.ImageIcon(
   "images/black.jpg");

 /*
  * public int[] getSour(){
  *
  * return sour; }
  */
 public ArrayList getList() {
  return list;
 }

 public javax.swing.ImageIcon[][] getData() {
  return data;
 }

 // **********************************鼠标监听器的实现方法******************************************//
 public void mouseReleased(MouseEvent e) {
  // 得到监听的 注:事件源
  Object obj = e.getSource();// (可能为表格或窗体等事件源所以用obj变量接受)
  // 将事件源强制转型成表格对象后将事件源传给JTable类的变量此时table即为事件源

  JTable table = (JTable) obj;

  // 得到选中的行和列
  int r = table.getSelectedRow();
  int c = table.getSelectedColumn();
  do {
   if (data[r][c] == null) {// 如果选中的格子是空的则下棋并使下棋的个数增加一
    Sour sour = new Sour();
    sour.row = r;
    sour.colu = c;
    list.add(sour);
    num++;// 棋子数加1
    if (count == 0) {
     data[r][c] = black;
     count++;
    } else {
     data[r][c] = white;
     count--;
    }

    // 刷新表格,让表格重新加载数据因为此时仅使data数组中的数据改变而表格中未变
    table.updateUI();

    // 从第9次开始每放一个棋子就判断一次
    if (checkChessNum(num)) {// 当ChessNum为true时即num为九时才执行判断)
     if (checkRow(r, c) || checkColumn(r, c)
       || checkRowColumn1(r, c) || checkRowColumn2(r, c)) {// 若行判断为true则执行弹出对话框)
      if (data[r][c].equals(white)) {// 若被判断的那个中心棋子为白则。。。)
       // 弹出对话框
       javax.swing.JOptionPane.showMessageDialog(null,
         "白方赢了!!");
       a = 0;
      } else {
       javax.swing.JOptionPane.showMessageDialog(null,
         "黑方赢了!!");
       a = 0;
      }

      table.removeMouseListener(this);// model类中,本身就是一个监听器
     }

    }

   }
   a = 1;
  } while (a == 0);

 }

 // /*************封装**********算法分析**************************************************//
 /**
  * 统计棋子的个数,当棋子放到第9个的时候才判断输赢
  */
 public boolean checkChessNum(int num) {
  if (num < 9) {
   return false;
  }
  return true;
 }

 /**
  * 判断横向是否有5个连在一起的
  */
 public boolean checkRow(int r, int c) {
  int con = 0;
  // 先往右边找并保证向右找不超出界线
  for (int i = c + 1; i < data[0].length; i++) {
   if (data[r][i] == null || !data[r][i].equals(data[r][c])) {
    break;
   }
   con++;
  }
  // 往左边走
  for (int i = c; i >= 0; i--) {
   if (data[r][i] == null || !data[r][i].equals(data[r][c])) {
    break;
   }
   con++;
  }
  if (con >= 5) {
   return true;
  }
  return false;

 }

 /**
  * 判断纵向是否有5个连在一起的
  */
 public boolean checkColumn(int r, int c) {
  int con = 0;
  // 先往边找并保证向右找不超出界线
  for (int i = r + 1; i < data.length; i++) {
   if (data[i][c] == null || !data[i][c].equals(data[r][c])) {
    break;
   }
   con++;
  }
  // 往上边走
  for (int i = r; i >= 0; i--) {
   if (data[i][c] == null || !data[i][c].equals(data[r][c])) {
    break;
   }
   con++;
  }
  if (con >= 5) {
   return true;
  }
  return false;
 }

 public boolean checkRowColumn1(int r, int c) {
  int con = 0;
  // 先往右下找
  for (int i = r + 1, j = c + 1; i < data.length && j < data[0].length; i++, j++) {
   if (data[i][j] == null || !data[i][j].equals(data[r][c])) {
    break;
   }
   con++;
  }
  // 往左上找
  for (int i = r, j = c; i >= 0 && j >= 0; i--, j--) {
   if (data[i][j] == null || !data[i][j].equals(data[r][c])) {
    break;
   }
   con++;
  }
  if (con >= 5) {
   return true;
  }
  return false;
 }

 public boolean checkRowColumn2(int r, int c) {
  int con = 0;
  // 先往左下找
  for (int i = r + 1, j = c - 1; i < data.length && j >= 0; i++, j--) {
   if (data[i][j] == null || !data[i][j].equals(data[r][c])) {
    break;
   }
   con++;
  }
  // 往右上找
  for (int i = r, j = c; i >= 0 && j <= data[0].length; i--, j++) {
   if (data[i][j] == null || !data[i][j].equals(data[r][c])) {
    break;
   }
   con++;
  }
  if (con >= 5) {
   return true;
  }
  return false;
 }

 // **********************************表格数据模型的实现****************************************//
 public int getRowCount() {
  return data.length;

 }

 public int getColumnCount() {
  return data[0].length;
 }

 public String getColumnName(int columnIndex) {
  return "";
 }

 public Class<?> getColumnClass(int columnIndex) {
  // 返回图片类型的对象
  return javax.swing.ImageIcon.class;
 }

 public boolean isCellEditable(int rowIndex, int columnIndex) {
  return false;

 }

 public Object getValueAt(int rowIndex, int columnIndex) {
  // 得到二维数组个表格索引对应的元素
  javax.swing.ImageIcon str = data[rowIndex][columnIndex];
  return str;
 }

 public void setValueAt(Object aValue, int rowIndex, int columnIndex) {
  // data[rowIndex][columnIndex] = (String) aValue;
 }

 public void addTableModelListener(TableModelListener l) {
 }

 public void removeTableModelListener(TableModelListener l) {

 }

 // ********************************胜后处理*********************************************//

 public void mouseReleasedButton(MouseEvent e) {

 }
}
三.给按钮添加监听器

package net.java.cn;
import java.awt.event.ActionEvent;
import javax.swing.JTable;
import java.util.ArrayList;

public class BAction implements java.awt.event.ActionListener{

 private MyModel model;
 private JTable table;
 
 public BAction(MyModel model,JTable table){
  this.model = model;
  this.table = table;
 }
 
 public void actionPerformed(ActionEvent e) {
  int t = javax.swing.JOptionPane.showConfirmDialog(null,"你确定要悔棋吗?");
  if(t==0){//选择的“是”
   
   ArrayList list = model.getList();
   javax.swing.ImageIcon[][] data = model.getData();
   Sour sour1=new Sour();
   sour1=(Sour)list.get(list.size()-1);
   data[sour1.row][sour1.colu]=null;
   list.remove(list.size()-1);
   model.num--;
   if(model.count==0) model.count=1;else model.count=0;
   table.addMouseListener(model);
   table.updateUI();
   
  }
 }

}

 

 

 

 

package net.java.cn;

import java.awt.event.ActionEvent;

import javax.swing.JTable;

public class CAction implements java.awt.event.ActionListener{

 private MyModel model;
 private JTable table;
 
 public CAction(MyModel model,JTable table){
  this.model = model;
  this.table = table;
 }
 
 public void actionPerformed(ActionEvent e) {
  int t = javax.swing.JOptionPane.showConfirmDialog(null,"你确定要重下吗?");
  if(t==0){//选择的“是”
   
   for(int i=0;i<20;i++){
     for(int j=0;j<20;j++){
       javax.swing.ImageIcon[][] data = model.getData();
       data[i][j]=null;
     }
   }
   model.num=0;
   if(model.count==0) model.count=1;else model.count=0;
   table.addMouseListener(model);
   table.updateUI();
   
  }
 }

}

 

 

 

 

保存点坐标的对象

package net.java.cn;

public class Sour {
public int row;
public int colu;
}

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值