`
罗春桉
  • 浏览: 16024 次
  • 性别: Icon_minigender_1
  • 来自: 长沙
社区版块
存档分类
最新评论

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

阅读更多



 

 

                                                                   简单五子棋

一.窗体显示

 

    设置窗体的大小,标题,可见,退出程序自动关闭......用一个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.罗春桉制作");
   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;
}

 

 

 

 

 

  • 大小: 75.2 KB
  • 大小: 38.6 KB
  • 大小: 44.4 KB
2
0
分享到:
评论
1 楼 hunnuxiaobo 2010-08-26  
代码风格不错!

相关推荐

    交互式人机对战五子棋

    这是一款Android小游戏--交互式人机对战五子棋。之所以称之为交互式人机对战五子棋,是因为在进入人机对战模式这前,你可以任意设置好开局,同时,在对战过程中,你可以看到机器的思考过程,还可以标识出每一个落子...

    Python五子棋人机对战游戏源码

    #最后决定就写个五子棋人机对战吧! #这个源码我在多年前曾用VB6写过,当时毕业设计拿了优秀,之后经过了几次修改计算机Ai还不算太差,想投机赢是没机会的。 #由于本人初学Python(第一个完整的Python程序),有些技巧...

    java五子棋 人机对战 源码及素材

    学习JAVA做的练习 做得还算漂亮 根据MLDN的教程改编,人机对战 我自己对五子棋技术很有限 所以写的算法也很有限 欢迎各位指导

    java小游戏之五子棋

    java初学者练习项目之五子棋! 人机对战! java 练习项目 五子棋 初学者 人机对战 java 练习项目 五子棋 初学者 人机对战

    java 五子棋 人机对战

    贪心算法实现电脑下棋算法,只能看一步,比较简单。练习

    python五子棋人机对战代码,复制即用!

    在本资源中,我们将探讨如何使用Python编程语言实现一个简单的五子棋人机对战游戏。该项目不仅能够帮助初学者理解基本的游戏开发流程,还能够提供一个平台,让玩家练习并提升自己的五子棋策略。 首先,我们会介绍...

    我在练习VB时做的小游戏 五子棋

    我在练习VB时做的小游戏,没有人机对战,主要是画线,画圆等、、,有些细节没有做,

    java swing人机对战五子棋(含背景音乐)

    本项目是一套基于java swing的人机对战五子棋系统,主要针对计算机相关专业的正在做毕设的学生与需要项目实战练习的Java学习者。 包含:项目源码、数据库脚本等,该项目附带全部源码可作为毕设使用。 项目都经过严格...

    练习java五子棋代码

    自己编写的较完整的五子棋 带有单机人人,人机对战,以及简单的局域网对战功能

    五子棋小程序

    用java写的简单的五子棋小游戏,一共只有三个类,人机对战,练习它,能巩固java基础

    C语言实现五子棋,包括人机对战、人人对战

    完全使用C语言实现了人与机器对战、人与人对战的五子棋功能,特别适合学生练习完成教学实验。

    vb udp网络五子棋

    简易的网络五子棋 主要练习vb的网络编程 是对战类型的 不是人机对战

    C++语言设计实现五子棋

    目前初步设想是编制一个人机对战的简易五子棋软件。 以下为个人设计思考的过程。 首先,进行问题分析与设计。计划实现的功能为,开局选择人机或双人对战,确定之后比赛开始。比赛结束后初始化棋盘,询问是否继续...

    wuziqi.rar_五子棋 sdk

    一个人机对战的五子棋程序,该程序使用VC6.0编写,完全使用sdk!新手可以练习下!

    JAVA 五子棋

    // 是否处于练习模式(即人机大战模式) // 菜单对象************************************************************** private JMenuBar mb = new JMenuBar(); private JMenu game = new JMenu("五子棋菜单"); ...

    使用python实现简单五子棋游戏

    最近在初学python,今天就用自己的一些粗浅理解,来记录一下这几天的python简单人机五子棋游戏的练习,下面是实现过程的理解(是在cmd中运行的): 主要流程: *重点内容* – 首先是模块及类的划分 – 棋子类和棋盘...

    五子棋软件源码+项目说明(包含双人对战和人机对战+由C++及QT框架完成+无后台通信+AI具有一定的棋力).zip

    【资源说明】 1、该资源内项目代码都是经过测试运行成功,功能正常的情况下才上传的,请...3、不仅适合小白学习实战练习,也可作为大作业、课程设计、毕设项目、初期项目立项演示等,欢迎下载,互相学习,共同进步!

    五子棋 HGE引擎DEMO

    VC2005编译环境。 使用HGE图形引擎。算是一个小小的练习。 支持人机,双人两种模式。 感谢Haff的引擎,感谢HGEchina网站, 特别感谢 微妙的平衡 师兄的开源中文显示。

    五子论剑

    “五子论剑”是一个集娱乐与学习一身的五子棋擂台,它不仅支持本机的人人,人机,机机对战,还支持在网络上进行对战。而你可以编写自已的“智能体”来和你的对手下棋,这样大家的算法就可以互相切磋了。它还有各种...

    java自学之道

    第2章 Java经典练习题 2.1 斐波那契数列 2.2 判断素数 2.3 水仙花数 2.4 分解质因数 2.5 杨辉三角 2.6 学习成绩查询 2.7 求最大公约数与最小公倍数 2.8 完全平方数 2.9 统计字母、空格、数字和其它字符个数 2.10 求...

Global site tag (gtag.js) - Google Analytics