`
罗春桉
  • 浏览: 16503 次
  • 性别: 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  
代码风格不错!

相关推荐

    五子棋-智能算法-C#源码-人机对弈-原创

    在本项目中,"五子棋-智能算法-C#源码-人机对弈-原创",开发者提供了一个使用C#编程语言实现的五子棋游戏,具备智能算法,能够支持人机对弈功能。该项目基于.NET Framework 4.6,意味着它依赖于微软的这个成熟的开发...

    极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机博弈游戏python源码.zip

    极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机博弈游戏python源码.zip极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机博弈游戏python源码.zip极大极小值搜索-基于alpha-beta剪枝算法的AI五子棋人机...

    五子棋人机对战_初级

    【标题】"五子棋人机对战_初级"是一个基于Java编程语言开发的简易五子棋游戏,专为初学者设计。这个项目的核心在于实现一个简单的命令行界面,允许玩家与计算机进行对战,从而体验到编程带来的乐趣和成就感。 ...

    交互式人机对战五子棋

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

    五子棋人机对战web版

    【五子棋人机对战Web版】是一个基于JavaScript实现的在线游戏,它允许玩家与计算机进行五子棋对弈。这款应用专为谷歌浏览器优化,对于其他浏览器,特别是IE浏览器,兼容性可能不佳。该项目不仅是娱乐工具,更是学习...

    C#人机五子棋(含源码)

    总结来说,C#实现的人机五子棋项目是一个集成了基础编程、图形界面设计和人工智能策略的综合实践案例。通过这个项目,无论是初学者还是经验丰富的开发者,都能从中学习到宝贵的知识,提升自己的编程能力和解决问题的...

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

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

    五子棋人机代码

    在编程领域,实现一个人机对战的五子棋游戏是一项常见的练习,它涉及到计算机科学中的多个关键知识点。本项目结合了两个不同的实现,尽管可能存在冗余代码,但其核心功能是完整的,能够支持玩家与计算机之间的对局。...

    简化后--人机五子棋.zip_dozenlqo_labview_labview五子棋_labview游戏_五子棋

    本篇将重点讨论如何使用LabVIEW设计并实现一个五子棋小游戏。 五子棋是一种简单却富有策略性的双人对弈游戏,其规则简单明了:任意一方的棋子在棋盘上形成连续的五个,即为胜利。在LabVIEW中实现这样的游戏,主要...

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

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

    人机对异五子棋源程序(C语言)

    在计算机科学领域,实现一个人机对弈的五子棋程序是一个经典的练习,它涉及到算法设计、人工智能和用户交互等多个方面的知识。本文将围绕一个使用C语言编写的五子棋源程序进行深入解析,帮助读者理解其中的关键技术...

    vc人机+联网五子棋

    在编程世界中,开发一款五子棋游戏是一项常见的练习,尤其对于初学者来说,这既有趣又有挑战性。本项目名为"vc人机+联网五子棋",是使用Visual C++(VC++)开发的一个单文档应用程序,它实现了五子棋的基本功能,...

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

    在VB(Visual Basic)编程环境中,开发一款五子棋游戏是一项基础且有趣的练习,可以提升对图形界面设计、事件处理以及算法理解的能力。五子棋游戏通常包括以下几个核心部分: 1. **图形界面设计**: - `Form1.frm`...

    Android游戏源码人机五子棋项目源码

    《Android游戏源码人机五子棋项目解析》 在Android平台上开发一款五子棋游戏,不仅能够展示编程技能,还能够深入理解图形界面设计和人工智能算法。本项目名为“Android游戏源码人机五子棋”,是一个适用于学习和...

    c语言控制台双人对战,基本算法人机五子棋

    标题 "C语言控制台双人对战,基本算法人机五子棋" 指的是一种使用C语言编程实现的简单双人或人机对战的五子棋游戏。五子棋是一种策略型两人棋类游戏,目标是在棋盘上先连成五子直线(横、竖、斜)的一方获胜。 在...

    古木五子棋人机对战.zip易语言项目例子源码下载

    《古木五子棋人机对战》是一个易语言编写的项目示例,它提供了人机对弈的五子棋游戏源代码,是学习编程、技术探索和项目实践的宝贵资源。下面将详细阐述这个项目中的核心知识点以及其在不同场景下的应用价值。 1. *...

    安卓五子棋源代码-可用可用

    在Android开发领域,构建一款五子棋游戏是一项常见的练习项目,它可以帮助开发者熟悉Android平台上的图形界面设计、触摸事件处理以及人工智能算法的应用。这款“安卓五子棋”源代码是经过实际测试并确认可以正常运行...

    java 五子棋 人机对战

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

    基于QT的五子棋 人人对战 人机对战 程序与程序对战

    基于QT的五子棋项目是一个综合性的编程练习,涵盖了GUI设计、事件处理、游戏逻辑实现、AI算法等多个方面。通过这个项目,开发者不仅可以提升QT编程技能,还能深入了解游戏开发和人工智能的基础知识。无论是对于初学...

    练习用五子棋源码

    6. **人机对战**:虽然描述中提到的是练习用,但源码可能还包含了简单的AI算法,比如基于启发式的搜索算法,如Minimax或Alpha-Beta剪枝,让玩家可以与电脑对战,提高自己的水平。 7. **用户交互**:除了基本的下棋...

Global site tag (gtag.js) - Google Analytics