`

五子棋代码——请各位指教指教——只到判赢

阅读更多
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();
	}

}

 

0
0
分享到:
评论

相关推荐

    python项目——五子棋(控制台版).zip

    python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——五子棋(控制台版).zip python项目——...

    symbian v3 五子棋游戏——原创

    其中,五子棋游戏作为经典休闲娱乐项目,更是受到了广大用户的喜爱。本文将深入探讨一款专门为Symbian V3平台打造的五子棋游戏,并分析其原创性以及源码开放的意义。 这款五子棋游戏专为Symbian S60第三版设计,...

    五子棋算法——人工智能

    ### 五子棋算法在人工智能中的应用 #### 一、背景与概述 五子棋是一种双人对弈的游戏,规则简单但变化无穷,是研究人工智能领域中博弈算法的理想模型之一。本文将详细介绍一种基于博弈树搜索算法的人机对战五子棋...

    五子棋——人机博弈java代码实现

    在本项目中,我们探讨的是如何使用Java编程语言来实现一个五子棋的人机博弈系统。五子棋,又称连珠,是一种双人对弈的策略游戏,目标是在棋盘上形成连续的五个同色棋子,无论是横、竖还是斜线。在Java中实现这样的...

    java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip

    java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip java毕业设计——基于java的五子棋游戏的设计与开发(源代码+论文).zip ...

    功能强大完全的五子棋程序——有VCF

    在本文中,我们将深入探讨基于VC6.0开发的五子棋程序,这是一个具有智能算法的棋类游戏,尤其值得关注的是其内置的胜利搜索算法。五子棋是一种经典的双人策略游戏,简单易懂但充满挑战,对于计算机科学尤其是人工...

    基于安卓的五子棋游戏——人机对战,无联网人人对战.zip

    【标题】"基于安卓的五子棋游戏——人机对战,无联网人人对战.zip" 描述了一个在Android平台上实现的五子棋游戏应用,它具有两种模式:人机对战和双人对战。人机对战模式通常涉及到人工智能算法的应用,使得计算机...

    五子棋——人机对战

    《五子棋——人机对战程序详解》 五子棋是一种深受人们喜爱的双人对弈棋类游戏,其规则简单,但策略深奥,是人工智能领域中的经典研究对象。本文将深入探讨一个实现五子棋人机对战程序的设计与实现,包括算法的选择...

    JAVA入门之五子棋——客户端

    JAVA入门之五子棋——客户端 很短小的五子棋,初学java的作品 c/s架构,此为客户端

    JAVA入门之五子棋——服务器

    JAVA入门之五子棋——服务器 很短小的五子棋,初学java的作品 c/s架构,此为服务器

    gtk五子棋——人机对战(内有代码解说文档和gtk文档)

    标题中的“gtk五子棋——人机对战”是指使用GTK+库开发的一款五子棋游戏,其中包含人机对战的功能。GTK+是用于创建图形用户界面的跨平台库,广泛应用于Linux操作系统,同时也支持其他平台。它采用C语言编写,提供了...

    Java版五子棋——基础

    根据提供的信息,我们可以总结出以下关于“Java版五子棋——基础”的相关知识点: ### 一、项目概述 本项目为一个基于Java Swing框架开发的五子棋游戏程序。它作为一个简单的实例,可以帮助初学者更好地理解和掌握...

    c#应用——五子棋

    【C# 应用——五子棋】 C#是一种由微软公司开发的面向对象的编程语言,广泛应用于桌面应用、游戏开发以及Web服务等领域。在本项目中,我们利用C#来实现一个五子棋游戏,这是一个很好的学习GDI+图形图像处理和基本...

    java毕业设计——java五子棋手机网络对战游戏的设计与实现(源代码+论文).zip

    java毕业设计——java五子棋手机网络对战游戏的设计与实现(源代码+论文).zip java毕业设计——java五子棋手机网络对战游戏的设计与实现(源代码+论文).zip java毕业设计——java五子棋手机网络对战游戏的设计与实现...

    五子棋——人机对决(C#版)

    《五子棋——人机对决(C#版)》是一款基于C#编程语言开发的桌面游戏,主要功能是实现玩家与计算机之间的对弈。在这款游戏中,用户可以选择与电脑进行一场智力的较量,体验五子棋的魅力。下面将详细介绍这款程序的...

    五子棋——Five

    总之,通过【五子棋——Five】这个项目,VC++初学者不仅可以学习到基础语法,还能深入了解对象导向编程、图形用户界面设计、数据结构与算法、事件驱动编程以及简单的AI设计等多方面的知识,对于提升编程技能和理解...

    C#程序设计报告(五子棋——人机对决)

    ### C#程序设计报告(五子棋——人机对决) #### 一、前言 本报告旨在详细介绍一个基于C#语言开发的五子棋人机对战程序的设计思路和技术细节。该程序实现了基本的五子棋游戏逻辑,包括棋盘绘制、落子规则判定、...

    c# csharp 五子棋 代码 人机大战 初级版

    c# csharp 五子棋 代码 人机大战 初级版 c# csharp 五子棋 代码 人机大战 初级版 c# csharp 五子棋 代码 人机大战 初级版 c# csharp 五子棋 代码 人机大战 初级版

    java小游戏 (源码)swing五子棋源代码

    java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源代码java小游戏 (源码)swing五子棋源...

    安卓APP——五子棋源代码

    本APP很传统,属于单机游戏,借鉴了原有五子棋游戏并加以改进,主要的设计亮度有: (1)使用自定义View:这是我接触Android以来,第一次使用自定义View,它可以绘制棋盘、棋子; (2)尺寸的判断与设置; (3)...

Global site tag (gtag.js) - Google Analytics