java的五子棋-带算法解析---【课程设计】

关于毕业设计这个总目录
一定要看,因为JAVA工具,tomcat,MAVEN , idea 下载都在这篇文件当中
JAVA项目环境必知必会–【大作业及毕设项目】
部分截图如下:(持续增加中)
在这里插入图片描述

在这里插入图片描述

JAVA的有代码一般都叫【课程设计】
SSM或JAVAWEB(JSP)的【唐诗300首】
springBoot 的叫【JSB项目实战】
PHP的项目叫【白嫖项目】
其它的有可能叫【课程设计】或【毕业设计】

本系列校训

互相伤害互相卷,玩命学习要你管,天生我才必有用,我命由我不由天!
上效果!
在这里插入图片描述
在这里插入图片描述

环境及工具:

本系列环境

环境win11
工具idea 2020.1/idea 2018.3(为什么不使用更高的版本,一个是破解的BUG问题,一个是我用高的你用低的那就不兼容了)
jdk1.8(不管是学校还是企业里最主流的)
数据库
maven
项目导入方式打开目录
数据库前端工具

项目说明

这个游戏工作量比较小,也比较粗糙。当做学习还是相当的不错的。当毕业设计就有点拿不出手了。但是还是相当的值得学习

总体功能

‌五子棋起源于中国,是全国智力运动会竞技项目之一,是一种两人对弈的纯策略型棋类游戏。这一源于中国古代的传统黑白棋种,在现代有多种称谓。在日文里,它被称为连珠;英文中则被称为Gobang。此外,人们还常称它为连五子、五子连、串珠、五目、五目碰或五格等。
双方分别使用黑白两色的棋子,下在棋盘直线与横线的交叉点上,先形成五子连珠者获胜。
五子棋容易上手,老少皆宜,而且趣味横生,引人入胜。它不仅能增强思维能力,提高智力,而且富含哲理,有助于修身养性。

规则

五子棋传入日本后,经过发展与改进,新命名为“连珠”。后来,日本棋手发现先行一方(黑方)的优势过大,甚至有必胜的走法。于是,为限制黑方的优势,日本棋手将棋盘大小由十九路缩小为十五路,并提出了“禁手”概念,逐渐形成了禁手规则。这些改变后被各国棋手、国际比赛广泛接受。

五子棋规则要点
一、基本行棋规则
‌开局顺序‌

黑方执黑棋先行,白方执白棋后行,交替落子于棋盘交叉点36。
黑方第一手须落在棋盘中心点(天元),白方第二手须落在天元邻近的交叉点(直止或斜止)6。
‌胜负条件‌

任一方在棋盘横向、竖向或斜向形成连续五子(含五子以上)即获胜36。
‌例外规则‌:若黑方形成五连的同时触发禁手,则禁手失效,黑方仍判胜5。
二、禁手规则(仅限黑方)
‌禁手类型‌

‌三三禁手‌:单子落下同时形成两个活三(每条活三均能扩展成活四)35。
‌四四禁手‌:单子落下同时形成两个或以上冲四或活四5。
‌长连禁手‌:单子落下形成六个或以上连续同色棋子5。
‌禁手判定‌

白方需当场指出黑方禁手,若继续落子则禁手失效6。
白方无禁手限制,可自由使用三三、四四或长连等棋形获胜56。
三、平衡性规则
‌三手可交换‌

黑方第三手落子后,白方有权选择交换执黑或保持原色36。
‌五手两打‌

黑方第五手需在棋盘上指定两处落子,白方可选择其中一子保留,另一子移除6。
四、其他补充
‌计时规则‌

比赛通常采用逐步加秒制,例如每方基础时间10分钟,每落一子加5秒1。
‌胜负偏好‌

黑方受禁手限制较多,一般需通过“四三”(活四+活三)组合取胜;白方可利用禁手规则限制黑方或直接五连获胜35。
‌规则差异性‌

不同赛事可能采用特殊规则(如混合组别使用塔拉山口-10开局或指定开局)1,需以具体赛事规程为准。
以上规则综合了竞技平衡性与趣味性设计,核心目的是限制黑方先行优势,提升战术复杂度35。

代码部分

文件编码问题。不太熟悉JAVA的同学请不要随意怀疑本程序运行出错,或不能运行,盲目修改文件

在这里插入图片描述
先要画棋盘

package com.tr.five;

import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RadialGradientPaint;
import java.awt.RenderingHints;
import java.awt.MultipleGradientPaint.CycleMethod;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Point2D;

import javax.swing.JComponent;

import com.tr.data.ParametersWR;

public class Chess extends JComponent {
	private Color innerColor; // 中心颜色
	private Color outterColor; // 四周颜色

	public static int SIZE = 40; //棋子尺寸

	private static ParametersWR parametersWR = new ParametersWR();

	static{
		SIZE = getChessSize();
	}

	public Chess() {

	}

	public Chess(int x, int y, int width, int height, Color innerColor,
				 Color outterColor) {
		super();
		this.innerColor = innerColor;
		this.outterColor = outterColor;

		this.setBounds(x, y, width, height);
	}

	private static int getChessSize(){
		int size = 0;
		int paneSize = parametersWR.read(ParametersWR.CHESSSIZE);
		if(paneSize == 0){
			size = 40;
		}else if(paneSize == SetupListener.BIG){
			//大棋子
			size = 60;
		}else if(paneSize == SetupListener.CENTER){
			//中棋子
			size = 40;
		}else if(paneSize == SetupListener.SMALL){
			//小棋子
			size = 20;
		}

		return size;
	}

	public Color getInnerColor() {
		return innerColor;
	}

	public void setInnerColor(Color innerColor) {
		this.innerColor = innerColor;
	}

	public Color getOutterColor() {
		return outterColor;
	}

	public void setOutterColor(Color outterColor) {
		this.outterColor = outterColor;
	}

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d = (Graphics2D) g;

		// 中心点
		Point2D center = new Point2D.Double(getWidth() / 2,  getHeight() / 2);
		// 半径
		float radius = getWidth() / 1.6f;
		// 焦点
		Point2D focus = new Point2D.Double(center.getX() - 10, center.getY() + 5);
		// 关键帧
		float[] fractions = new float[] { 0, 1 };
		// 颜色
		Color[] colors = new Color[] { this.innerColor, this.outterColor };
		// 径向渐变
		RadialGradientPaint paint = new RadialGradientPaint(center, radius,
				focus,
				fractions, colors, CycleMethod.REFLECT);
		g2d.setPaint(paint);
		// 抗锯齿
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
				RenderingHints.VALUE_ANTIALIAS_ON);
		// 画圆
		Ellipse2D ellipse = new Ellipse2D.Double(0, 0, getWidth(), getHeight());
		g2d.fill(ellipse);

		g2d.dispose();
	}
}

算法:
转成数组

	private int x; // 鼠标所在的x坐标
	private int y; // 鼠标所在的y坐标
	private ChessType type; //棋子的类型
	private ChessType[][] cross; //所有棋子位置的数据模型

	public GameControllor(ChessType[][] cross) {
		this.cross = cross;
	}

	public void setValue(int x, int y, ChessType type){
		this.x = x;
		this.y = y;
		this.type = type;
	}

	/**
	 * 根据鼠标所在的坐标(x,y)获得对应的行和列
	 * @param x
	 * @param y
	 * @return
	 */
	public Point getRowAndCol(int x, int y){
		int row = (int) Math.round((double)y / Chess.SIZE);
		int col = (int) Math.round((double)x / Chess.SIZE);
		return new Point(row, col);
	}

先是行:
横:

/**
	 * 判断一行中指定颜色的棋子是否连接了一条连续的线
	 * @param x
	 * @param y
	 * @param type 棋子类型
	 */
	public boolean isConnectionRow(){
		Point p =  getRowAndCol(x, y);
		int row = (int) p.getX();

		boolean f = true;
		for(int j = 0; j < cross[row].length - 5; j ++){
			f = true;
			for(int k = 0; k < 5; k ++){
				if(cross[row][j + k] != type){
					f = false;
				}
			}
			if(f){
				return f;
			}
		}
		return false;
	}

再来列:

/**
	 * 判断一列中指定颜色的棋子是否连接了一条连续的线
	 * @param x
	 * @param y
	 * @param type 棋子类型
	 */
	public boolean isConnectionCol(){
		Point p =  getRowAndCol(x, y);
		int col = (int) p.getY();

		boolean f = true;
		for(int j = 0; j < cross.length - 5; j ++){
			f = true;
			for(int k = 0; k < 5; k ++){
				if(cross[j + k][col] != type){
					f = false;
				}
			}
			if(f){
				return f;
			}
		}
		return false;
	}

左斜 (撇的方向)

/**
	 * 判断左斜切方向指定颜色的棋子是否连接了一条连续的线
	 * @param x
	 * @param y
	 * @param type 棋子类型
	 */
	public boolean isConnectionLeft(){
		Point p =  getRowAndCol(x, y);
		int row = (int) p.getX();
		int col = (int) p.getY();

		int rows = cross.length;
		int cols = cross[0].length;

		if(col <= row){
			int sub = row - col; //行列之差
			int minCol = 0;  //最小的列
			int maxCol = Math.min(rows - sub, cols); //最大的列

			int c = 0;
			for(int j = minCol; j < maxCol; j ++){
				if(cross[j + sub][j] != type){
					c = 0;
				}else{
					c ++;
				}

				if(c == 5){
					return true;
				}
			}
		}else{
			int sub = col - row; //行列之差
			int minRow = 0;  //最小的行
			int maxRow = Math.min(cols - sub, rows); //最大的行

			int c = 0;
			for(int i = minRow; i < maxRow; i ++){
				if(cross[i][i + sub] != type){
					c = 0;
				}else{
					c ++;
				}

				if(c == 5){
					return true;
				}
			}
		}
		return false;
	}

右斜:

/**
	 * 判断左斜切方向指定颜色的棋子是否连接了一条连续的线
	 * @param x
	 * @param y
	 * @param type 棋子类型
	 */
	public boolean isConnectionRight(){
		Point p =  getRowAndCol(x, y);
		int row = (int) p.getX();
		int col = (int) p.getY();

		int rows = cross.length;
		int cols = cross[0].length;

		int rmin = Math.min(rows - 1, cols - 1);
		int rmax = Math.max(rows - 1, cols - 1);
		int sum = row + col;

		int minRow = 0;
		int maxRow = 0;
		if(sum >= rmin && sum <= rmax){
			minRow = 0;
			maxRow = rows;
		}else if(sum < rmin){
			minRow = 0;
			maxRow = sum - minRow;
		}else if(sum > rmax){
			minRow = sum - cols;
			maxRow = rows;
		}

		int c = 0;
		for(int i = minRow; i < maxRow; i ++){
			if(cross[i][sum - i] != type){
				c = 0;
			}else{
				c ++;
			}

			if(c == 5){
				return true;
			}
		}

		return false;
	}

找到关键核心代码的方法:
应用软件的核心代码是指这个程序最关键部分的代码。例如WinRAR,它的核心代码就是压缩算法部分,而诸如用户界面、操作系统移植等部分就无足轻重了。
商城类的核心代码是指业务层的代码,比如你商城的核心代码就是:商品、购物车、创建订单、支付这些代码就是核心代码。

作为程序员,我们经常需要看懂别人的代码。特别是在开源社区中,我们需要理解许多优秀的开源项目的代码。而在Gitee这样的代码托管平台上,我们如何快速有效地看懂别人的代码呢?本文将为大家介绍一些方法。

1.阅读README和项目介绍

在Gitee上,许多开源项目都会有自己的README文件或项目介绍。这些文件一般会介绍项目的背景、功能、使用方法等内容,可以帮助我们快速了解这个开源项目的基本情况。如果我们能够从这些文件中找到与自己相关的内容,就可以快速入手这个开源项目的代码。

2.了解项目结构和代码组织

在阅读代码之前,我们需要先了解这个开源项目的代码结构和代码组织方式。通常,开源项目会将不同的功能模块封装到不同的代码文件中,并按照一定的目录结构组织起来。如果我们能够了解这个开源项目的代码组织方式,就能更加快速地找到所需的代码。

3.利用IDE和工具

IDE和一些代码阅读工具可以帮助我们更快速、更高效地阅读代码。例如,Java开发者可以使用Eclipse或IntelliJ IDEA这样的IDE,可以快速打开代码文件、查看类、方法和变量等信息。另外,一些代码阅读工具,如Source Insight、CodeCompare等,可以帮助我们更方便地查看代码的结构和关系,以及快速跳转到相关代码。

4.关注代码注释和文档

良好的代码注释和文档可以帮助我们更快速地理解代码。因此,在阅读别人的代码时,我们可以将注意力放在代码注释和文档上。有些开源项目会提供详细的文档,有些则注重代码注释。如果我们能够针对代码注释和文档有一个系统的阅读和理解,就能更快速地掌握别人的代码。

5.跑通测试和运行项目

如果我们想更深入地了解别人的代码,可以试着跑通相关的测试,或者直接运行这个开源项目。通过跑测试和运行项目,我们可以更加直观地了解代码的实现细节和具体的业务逻辑。

总结:

以上就是在Gitee上快速理解他人代码的一些方法,希望对大家有所帮助。当然,阅读代码是一件需要耐心和细心的事情,需要我们多花一点时间和心思。只有沉下心来,慢慢阅读每一行代码,才能真正理解它们的含义和作用。

运行的界面

当然了,这里为了调试的方便,事实上,这个代码起初有不少BUG,主要就是因为点位取的时候,碰到了windows 的字体变大,
需要重置一次级别。

在这里插入图片描述

总结

就一句,真的很实用,真的太实用了了。

以前的学习的人,没有那么正规,但是潜下心写代码。现在的人呢?除了各种网络的BBLL,真心写代码的还能找不到工作?每个人都是springBoot ,甚至springcloud 起步,但是实际的分析能力真的是…

配套资源

java的五子棋-带算法解析(分四个方向)-课程设计

https://download.youkuaiyun.com/download/dearmite/90941634

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

项目张雪峰之巅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值