package sj.Gobang_V04; import java.awt.Point; import java.util.ArrayList; /** * 游戏属性接口 * * @author Songjie_xuan * @time 2014-09-30 * */ public interface Gobang_Attribute { public static int sPoint_X = 30, sPoint_Y = 30;// 棋盘线条绘制起点 public static int lattice_Size = 30;// 棋盘单元格大小 public static int crosswise_Num = 15, vertical_Num = 15;// 棋盘标准15*15 public static int piece_Size = 26;// 棋子大小 // 枚举定义落子标记数据类型 public static enum judge_Null { WHITE, EMPTY, BLACK }; // 判断落子点是否为空的数组 public static judge_Null[] cPoint_Mark = new judge_Null[vertical_Num * crosswise_Num]; // 创建ArrayList对象,存放所有落子点坐标 static ArrayList<Point> cPoint_List = new ArrayList<Point>(); // 权值数组,存放权值 public static int[] values = new int[vertical_Num * crosswise_Num]; }
package sj.Gobang_V04; import java.awt.Color; import java.awt.Dimension; import java.awt.FlowLayout; import java.awt.Graphics; import java.awt.Point; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; import javax.swing.JPanel; /** * 游戏窗体类 * * @author Songjie_xuan * @time 2014-09-30 * */ @SuppressWarnings("serial") public class Gobang_Frame extends JFrame implements Gobang_Attribute { // 游戏Panel尺寸 private int GPANEL_W = lattice_Size * (vertical_Num - 1) + 60; private int GPANEL_H = lattice_Size * (vertical_Num - 1) + 60; // 按钮Panel尺寸 private int BPANEL_W = lattice_Size * (vertical_Num - 1) + 60; private int BPANEL_H = 40; // 游戏窗体尺寸 private int GFRAME_W = lattice_Size * (vertical_Num - 1) + 80; private int GFRAME_H = GPANEL_H + BPANEL_H + 45; private JButton star_Btn, end_Btn, pre_Btn; /** * 构造方法设置游戏窗体 */ public Gobang_Frame() { this.setTitle("我的五子棋"); this.setSize(GFRAME_W, GFRAME_H); this.setResizable(false); this.setLocationRelativeTo(null); this.setDefaultCloseOperation(3); // 设置窗体布局 this.setLayout(new FlowLayout()); // 添加游戏Panel JPanel g_Panel = new Game_Panel(); g_Panel.setBackground(Color.DARK_GRAY); g_Panel.setPreferredSize(new Dimension(GPANEL_W, GPANEL_H)); this.add(g_Panel); // 添加按钮Panel JPanel b_Panel = btn_Panel(); this.add(b_Panel); this.setVisible(true); // 从g_Panel上获取棋子绘制区域(画布) Graphics g = g_Panel.getGraphics(); Gobang_Listener g_Listener = new Gobang_Listener(g); g_Panel.addMouseListener(g_Listener); // while (true) { // this.update(this.getGraphics()); // // try { // // Thread.sleep(100); // // } catch (InterruptedException e) { // // // TODO Auto-generated catch block // // e.printStackTrace(); // // } // } } /** * 设置按钮Panel的方法 * * @return=>返回JPanel对象 */ public JPanel btn_Panel() { // 设置按钮Panel JPanel panel = new JPanel(); panel.setPreferredSize(new Dimension(BPANEL_W, BPANEL_H)); panel.setBackground(Color.LIGHT_GRAY);// 设置背景色 panel.setLayout(new FlowLayout());// 设置布局 // 创建游戏按钮对象 star_Btn = new JButton("开始游戏"); end_Btn = new JButton("结束游戏"); pre_Btn = new JButton("保存游戏"); // 给按钮装上监听器 Btn_Listener btn_Lis = new Btn_Listener(); star_Btn.addActionListener(btn_Lis); end_Btn.addActionListener(btn_Lis); pre_Btn.addActionListener(btn_Lis); // 将游戏按钮添加到Panel上 panel.add(star_Btn); panel.add(pre_Btn); panel.add(end_Btn); return panel; } /** * 游戏Panel类 * * @author Songjie_xuan * */ class Game_Panel extends JPanel { /** * 重绘界面的方法 * * @param g * =>重绘区域 */ public void paint(Graphics g) { // 调用父类重绘方法正确绘制组件 super.paint(g); // 重绘棋盘 draw_Board(g); // 重绘棋子 draw_Piece(g); } /** * 绘制棋子 * * @param g * =>绘制区域 */ private void draw_Piece(Graphics g) { // 遍历棋盘所有交点 for (int index = 0; index < cPoint_List.size(); index++) { Point p = cPoint_List.get(index); if (cPoint_Mark[index] != judge_Null.EMPTY) { if (cPoint_Mark[index] == judge_Null.BLACK) { g.setColor(Color.BLACK); } else { g.setColor(Color.WHITE); } g.fillOval(p.x - piece_Size / 2, p.y - piece_Size / 2, piece_Size, piece_Size); } } } /** * 绘制棋盘线条 * * @param g * =>绘制区域 */ private void draw_Board(Graphics g) { // 设置棋盘线条颜色为白色 g.setColor(Color.WHITE); int i = 0; // 绘制横线 for (i = 0; i < crosswise_Num; i++) { g.drawLine(sPoint_X, sPoint_Y + i * lattice_Size, sPoint_X + lattice_Size * (vertical_Num - 1), sPoint_Y + i * lattice_Size); } // 绘制竖线 for (i = 0; i < vertical_Num; i++) { g.drawLine(sPoint_X + i * lattice_Size, sPoint_Y, sPoint_X + i * lattice_Size, sPoint_Y + lattice_Size * (crosswise_Num - 1)); } g.fillOval(120 - 4, 120 - 4, 8, 8); g.fillOval(360 - 4, 120 - 4, 8, 8); g.fillOval(120 - 4, 360 - 4, 8, 8); g.fillOval(360 - 4, 360 - 4, 8, 8); g.fillOval(240 - 4, 240 - 4, 8, 8); } } /** * 按钮监听器类 * * @author Songjie_xuan * */ class Btn_Listener implements ActionListener { public void actionPerformed(ActionEvent e) { String btn_Str = e.getActionCommand(); if ("开始游戏".equals(btn_Str)) { create_List(); star_Btn.setText("暂停游戏"); } else if ("暂停游戏".equals(btn_Str)) { star_Btn.setText("继续游戏"); } else if ("继续游戏".equals(btn_Str)) { star_Btn.setText("暂停游戏"); } if ("结束游戏".equals(btn_Str)) { star_Btn.setText("开始游戏"); } } /** * 开始游戏,所有可以落子的点坐标存放到ArrayList对象中 并标记为空位 */ public void create_List() { // 获取所有交点的坐标存入cPoint_List for (int i = 0; i < vertical_Num; i++) { for (int j = 0; j < crosswise_Num; j++) { // 计算所有落子位置的(x,y)坐标 int cPoint_X = sPoint_X + j * lattice_Size; int cPoint_Y = sPoint_Y + i * lattice_Size; // 落子位置坐标存放到数组中 cPoint_List.add(new Point(cPoint_X, cPoint_Y)); } } for (int i = 0; i < cPoint_List.size(); i++) { cPoint_Mark[i] = judge_Null.EMPTY; } } } }
package sj.Gobang_V04; import java.awt.Color; import java.awt.Graphics; import java.awt.Point; import java.awt.event.MouseAdapter; import java.awt.event.MouseEvent; /** * 游戏界面监听器类 * * @author Songjie_xuan * @time 2014-10-02 * */ public class Gobang_Listener extends MouseAdapter implements Gobang_Attribute { private Graphics g; Gobang_Robot gr = new Gobang_Robot(); Gobang_Listener(Graphics g) { this.g = g; } /** * 绘制棋子的方法 * * @param x * =>绘制棋子的中心点x坐标 * @param y * =>绘制棋子的中心点y坐标 */ public void draw_Piece(int x, int y, int index, judge_Null jn) { // 根据jn的值判定需要绘制白子,还是黑子 if (jn == judge_Null.BLACK) { g.setColor(Color.BLACK); cPoint_Mark[index] = jn; } else if (jn == judge_Null.WHITE) { g.setColor(Color.WHITE); cPoint_Mark[index] = jn; } g.fillOval(x - piece_Size / 2, y - piece_Size / 2, piece_Size, piece_Size); } /** * 判赢方法 * * @param index * =>当前落子点的小标 * @return=>返回boolean值 */ private boolean judge_Win(int index) { int c1 = 0; int c2 = 0; int count = 0; // **横向检测** // 检测前要判断查找范围 for (int i = 0; i < 15; i++) { if (index >= 15 * i && index < 15 * i + 15) { c1 = 15 * i + 15; c2 = 15 * i; // System.out.println(c); break; } } // 横向开始检测 for (int i = index; i < c1; i++) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; } else { break; } } for (int i = index - 1; i >= c2; i--) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; } else { break; } } // 横向检测结束,如果count还小于5,于是从新置为0 if (count < 5) { count = 0; } // 纵向检测 for (int i = index; i < vertical_Num * vertical_Num; i += 15) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; } else { break; } } for (int i = index - 15; i >= 0; i -= 15) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; } else { break; } } // 纵向检测结束,如果count还小于5,于是从新置为0 if (count < 5) { count = 0; } // 主对角线斜向检测 for (int i = index; i < vertical_Num * vertical_Num; i += 15) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; i++; } else { break; } } for (int i = index - 16; i >= 0; i -= 15) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; i--; } else { break; } } // 主对角线斜向检测结束,如果count还小于5,于是从新置为0 if (count < 5) { count = 0; } // 副对角线检测 for (int i = index; i < vertical_Num * crosswise_Num; i += 14) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; } else { break; } } for (int i = index - 14; i >= 0; i -= 14) { if (cPoint_Mark[index] == cPoint_Mark[i]) { count++; } else { break; } } // 如果count大于等于5,表示获胜 if (count >= 5) { count = 0; return true; } return false; } public void mouseReleased(MouseEvent e) { // 获取当前鼠标点击位置 int mouse_X = e.getX(); int mouse_Y = e.getY(); // System.out.println("<"+mouse_X+" "+mouse_Y+">"); for (int index = 0; index < cPoint_List.size(); index++) { Point p = cPoint_List.get(index); if (Math.abs(mouse_X - p.x) <= 3 * lattice_Size / 7 && Math.abs(mouse_Y - p.y) <= 3 * lattice_Size / 7) { if (cPoint_Mark[index] == judge_Null.EMPTY) { // 玩家落子 draw_Piece(p.x, p.y, index, judge_Null.BLACK); // 每次落子都检查是否获胜 if (judge_Win(index)) { javax.swing.JOptionPane .showMessageDialog(null, "黑棋获胜!"); // 获胜后清空棋盘 for (int i = 0; i < cPoint_Mark.length; i++) { cPoint_Mark[i] = judge_Null.EMPTY; } break; } // **计算机落子** // 首先计算最优落子位置 gr.select_PutPoint(); // 根据位置绘制白子 draw_Piece(gr.p.x, gr.p.y, gr.index, judge_Null.WHITE); // 每次落子都检查是否获胜 if (judge_Win(gr.index)) { javax.swing.JOptionPane .showMessageDialog(null, "白棋获胜!"); for (int i = 0; i < cPoint_List.size(); i++) { cPoint_Mark[i] = judge_Null.EMPTY; } break; } } else { javax.swing.JOptionPane.showMessageDialog(null, "此处有子,不能落子!"); } } } } }
package sj.Gobang_V04; import java.awt.Point; /** * 五子棋计算机类 * * @author Songjie_xuan * @time 2014-10-04 * */ public class Gobang_Robot implements Gobang_Attribute { Point p; int index; // 选择落子点 public void select_PutPoint() { // 遍历所有交点 for (int i = 0; i < cPoint_List.size(); i++) { // 选择被标记为judge_Null.EMPTY的点 if (cPoint_Mark[i] == judge_Null.EMPTY) { // 如果为空则计算权值存放到values数组中 values[i] = count_Values(i); } else { // 不为空的点权值赋为0 values[i] = 0; } } int temp = 0; // 遍历所有交点 for (int i = 0; i < values.length; i++) { // 找出权值最大的点,获取该点的下标 if (temp < values[i]) { temp = values[i]; } } // 遍历所有交点 for (int i = 0; i < values.length; i++) { // 找出权值最大的点,获取该点及其下标 if (temp == values[i]) { index = i; p = cPoint_List.get(i); } } } /** * 计算权值 */ private int count_Values(int i) { int values = 10 * i; return 1000; } }
package sj.Gobang_V04; /** * 五子棋启动类 * * @author Songjie_xuan * @time 2014-09-30 * */ public class Gobang_Test { public static void main(String[] args) { new Gobang_Frame(); } }
相关推荐
python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——...
其中,五子棋游戏作为经典休闲娱乐项目,更是受到了广大用户的喜爱。本文将深入探讨一款专门为Symbian V3平台打造的五子棋游戏,并分析其原创性以及源码开放的意义。 这款五子棋游戏专为Symbian S60第三版设计,...
### 五子棋算法在人工智能中的应用 #### 一、背景与概述 五子棋是一种双人对弈的游戏,规则简单但变化无穷,是研究人工智能领域中博弈算法的理想模型之一。本文将详细介绍一种基于博弈树搜索算法的人机对战五子棋...
在本项目中,我们探讨的是如何使用Java编程语言来实现一个五子棋的人机博弈系统。五子棋,又称连珠,是一种双人对弈的策略游戏,目标是在棋盘上形成连续的五个同色棋子,无论是横、竖还是斜线。在Java中实现这样的...
java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip ...
在本文中,我们将深入探讨基于VC6.0开发的五子棋程序,这是一个具有智能算法的棋类游戏,尤其值得关注的是其内置的胜利搜索算法。五子棋是一种经典的双人策略游戏,简单易懂但充满挑战,对于计算机科学尤其是人工...
【标题】"基于安卓的五子棋游戏——人机对战,无联网人人对战.zip" 描述了一个在Android平台上实现的五子棋游戏应用,它具有两种模式:人机对战和双人对战。人机对战模式通常涉及到人工智能算法的应用,使得计算机...
《五子棋——人机对战程序详解》 五子棋是一种深受人们喜爱的双人对弈棋类游戏,其规则简单,但策略深奥,是人工智能领域中的经典研究对象。本文将深入探讨一个实现五子棋人机对战程序的设计与实现,包括算法的选择...
JAVA入门之五子棋——客户端 很短小的五子棋,初学java的作品 c/s架构,此为客户端
JAVA入门之五子棋——服务器 很短小的五子棋,初学java的作品 c/s架构,此为服务器
标题中的“gtk五子棋——人机对战”是指使用GTK+库开发的一款五子棋游戏,其中包含人机对战的功能。GTK+是用于创建图形用户界面的跨平台库,广泛应用于Linux操作系统,同时也支持其他平台。它采用C语言编写,提供了...
根据提供的信息,我们可以总结出以下关于“Java版五子棋——基础”的相关知识点: ### 一、项目概述 本项目为一个基于Java Swing框架开发的五子棋游戏程序。它作为一个简单的实例,可以帮助初学者更好地理解和掌握...
【C# 应用——五子棋】 C#是一种由微软公司开发的面向对象的编程语言,广泛应用于桌面应用、游戏开发以及Web服务等领域。在本项目中,我们利用C#来实现一个五子棋游戏,这是一个很好的学习GDI+图形图像处理和基本...
java毕业设计——java五子棋手机网络对战游戏的设计与实现(源代码+论文).zip java毕业设计——java五子棋手机网络对战游戏的设计与实现(源代码+论文).zip java毕业设计——java五子棋手机网络对战游戏的设计与实现...
《五子棋——人机对决(C#版)》是一款基于C#编程语言开发的桌面游戏,主要功能是实现玩家与计算机之间的对弈。在这款游戏中,用户可以选择与电脑进行一场智力的较量,体验五子棋的魅力。下面将详细介绍这款程序的...
总之,通过【五子棋——Five】这个项目,VC++初学者不仅可以学习到基础语法,还能深入了解对象导向编程、图形用户界面设计、数据结构与算法、事件驱动编程以及简单的AI设计等多方面的知识,对于提升编程技能和理解...
### C#程序设计报告(五子棋——人机对决) #### 一、前言 本报告旨在详细介绍一个基于C#语言开发的五子棋人机对战程序的设计思路和技术细节。该程序实现了基本的五子棋游戏逻辑,包括棋盘绘制、落子规则判定、...
c# csharp 五子棋 代码 人机大战 初级版 c# csharp 五子棋 代码 人机大战 初级版 c# csharp 五子棋 代码 人机大战 初级版 c# csharp 五子棋 代码 人机大战 初级版
java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...
本APP很传统,属于单机游戏,借鉴了原有五子棋游戏并加以改进,主要的设计亮度有: (1)使用自定义View:这是我接触Android以来,第一次使用自定义View,它可以绘制棋盘、棋子; (2)尺寸的判断与设置; (3)...