终于开始第一个小项目了哈哈,今天小编来介绍一个如何用Java来实现一个五子棋。那么,我们先来想一想我们的五子棋需要有些什么功能呢???

  1. 棋盘界面的实现
  2. 人人对战、人机对战
  3. 开始新游戏、认输、悔棋的操作

上述的就是我们的五子棋的大致功能了,下面我们来详细介绍一些细节的实现。

ps:由于各个类之间会有交错,所以为了大家有一个较为清晰的思路,下面我就按照我定义的不同类来给大家介绍了。

一、实现棋盘界面类

这个类主要包括了棋盘界面的实现、棋盘和棋子的重绘方法以及我们的监听器的添加。下面先贴出代码:

package 

这个类小编是直接继承了JPanel类,所以对棋盘面板的操作也就可以直接使用this关键字了。细心的读者可能已经观察到我们的五子棋的对战模式是通过一个复选框操作的,核心代码就是下面的2句了:

String[] item = {"人人对战","人机对战"};

JComboBox<String> JCB = new JComboBox<String>(item);

因为我们的对战模式是一个字符串,所以复选框也就是一个针对字符串的复选框了,一般来说复选框中的内容参数类型都是相同的,不会出现既有 int、又有 String 的情况,所以这个问题大家不必过于纠结。

二、监听器类的实现

监听器这个类可谓是五子棋中最重要的一个类了,它就像一个枢纽,沟通着我们的其他类。并且在这个类中也会实现很多的功能。你们说它重不重要呢?哈哈......

由于这个类中的关系比较复杂,所以我会把它拆分一下来给大家讲解

首先我们贴出实现人人对战中黑白棋交替下的功能,这一部分的代码

public 

在这一部分我们通过一个变量count来实现黑白棋交替下,黑棋下完count变为1,然后白棋开始下,白棋下完后count又变回0,黑棋在下,这样交替以直下下去,知道分出胜负为止。这一部分代码还涉及到悔棋的操作,是由2个变量来控制的。huiX 记录每一次下棋的X坐标,huiY记录每一次下棋的Y坐标,如果点击悔棋按钮的话,chessArray[huiX][huiY] = 0,重新绘制界面即可。

下面是按钮及复选框操作的代码:

public 

我们的监听器类实现了动作监听器和鼠标监听器的接口,我们按钮以及复选框的操作就在这部分代码实现了。点击开始游戏后,会将上一次的棋局清空,同时复选框会被禁用,在游戏结束时复选框重新变为可用的,此时可以选择对战模式。点击认输按钮之后,棋局结束,同时移除面板上的鼠标监听器,下棋的一方失败。每一次棋局结束时,都会移除面板上的鼠标监听器,在开始新游戏时,重新给面板添加鼠标监听器。

此处有一个小办法可以让我们的五子棋提升一下颜值啦,就是下面这2行代码:

//抗锯齿效果

Graphics2D g2d = (Graphics2D) g;

g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);

在每次获取画布之后加上这2行代码,然后我们的五子棋就会变得光滑无比了。

三 、接口

这一部分时最简单的,主要是定义我们的棋盘行、列数,以及棋子的大小,储存棋子的数组、人机对战时需要使用的权值数组。代码如下:

package 

为什么我们通过一个接口设置这些变量呢???主要2个原因:

  1. 通过接口定义,我们其他的类 只要实现这个接口就可以咯,不需要将变量从一个类传递到另外一个类,简化了代码,还降低了出错的可能性。
  2. 通过接口定义参数,方便我们以后对代码的修改,只需修改接口中的数据就可以了,而不需要大幅改动。

四、判断输赢的类

这个类比较简单,每下一颗棋子 ,从该位置横向、纵向、左斜、右斜4个方向判断,如果出现5子相连的情况,即为胜利。否则棋局继续。

package 

五、电脑下棋

哈哈哈!!终于到了大家最感兴趣的部分了,我们如何让电脑像人一样下棋呢?这里就需要一些算法的实现了。主要有以下几种算法:权值算法、博弈树、极大极小值搜索算法。还有一种比较牛逼的:机器学习。如果小编没有记错的话,阿尔法狗应该是采用了机器学习的。那么,小编用的是一种比较基础的算法:权值算法。同学们可以探索一下更深的、更厉害的算法,那么那你的电脑就会很厉害很厉害啦!!!权值算法即:用权值数组来统计电脑下棋在每一个点的胜率,然后将棋子下在胜率最高的位置。在这里,我们使用了HashMap(哈希表),它可以根据一个字符串找到相对应的数字(在这里就是权值了)。

package 

我们在一个位置同样分成4个方向统计,让后将权值相加,得到这一点的总权值,然后在监听器类中找出权值最大的点的坐标,在对应位置子下棋即可。需要注意的是,我们的HashMap(哈希表)中的每一种情况的权值一点给要分配合理,只有这样电脑才会合理的下棋。最后小编讲一下我的权值算法的判断方式即思路:首先,判断一个位置是否是一个空位,如果是的话,继续判断它的下一个位置是否为空位,如果出现2个连续的空位,跳出循环,如果不是的话,code = code +chessArray[i][j],即:将坐标为(i,j)的位置对应的字符串相加,如果出现颜色不一样的棋子的话也跳出循环。这部分代码的逻辑性比较强,但是只要理解之后,就是重复工作了,多写几个方向而已。

好了,我们的五子棋项目终于结束了,这个项目的代码量也不是很多,但是一定要注意细节呦,调代码找bug可是很痛苦的哈哈!大神发现错误请多指教呀!!!

c++五子棋_Java五子棋实现相关推荐

  1. java设计五子棋_JAVA 五子棋设计

    学习JAVA以来,这也算做的第一个小项目吧.下面来讲解具体的使用JAVA实现五子棋的过程.(所有功能实现之后我重新写了一个开始界面,这里就只介绍主要的实现步骤了) 1.游戏界面的实现 思路是:定义一个 ...

  2. java五子棋以当前空位为中心 取9个点_java 五子棋有点问题,哪位帮忙破一下、、...

    该楼层疑似违规已被系统折叠 隐藏此楼查看此楼 import java.awt.*;import javax.swing.*;import java.awt.event.*;import java.ut ...

  3. java五子棋用到的类_JAVA五子棋用到的知识点以及方法类有哪些?

    展开全部 我是把棋子放到2维数组里,1表示白旗,2表示黑棋,0表示空. 判断输赢的话,32313133353236313431303231363533e78988e69d833133326464646 ...

  4. java五子棋源代码_java 五子棋游戏源码

    [实例简介] [实例截图] [核心代码] package game; import java.applet.Applet; import java.applet.AudioClip; import j ...

  5. java五子棋_Java初级项目——从零开始制作一个简易五子棋游戏

    一.棋盘的绘制 使用JFrame容器制作五子棋的窗体 创建一个类--UI,如下: public 使用JPanel和Graphics画出大小为15X15的棋盘 再创建一个新的类--Chessboard, ...

  6. java五子棋棋盘_java五子棋项目(一)

    一.实现功能(人人对战模式) 1.点击开始下棋,黑棋先手,再下白棋 2.拖动界面,棋子和棋盘依旧存在(实现重绘) 2.每下一颗棋子判断输赢,获胜方弹出游戏提示 3.点击悔棋按钮,实现悔棋 4.点击认输 ...

  7. java课设 五子棋_Java课程设计 ————五子棋 (个人博客)

    JAVA课程设计 五子棋(博客个人版) •团队课程设计博客链接 •个人负责模块或任务说明 1.主框架类:设置棋盘窗体,颜色等 2.isWin方法:判断胜负 •自己的代码提交记录截图 •自己负责模块或任 ...

  8. java中五子棋_Java简单五子棋的实现

    在经过了几天的学习后,已经可以实现一个简单的五子棋游戏了,下面我就写一下编写程序 的过程和自己在这个过程中的心得体会. 第一步:绘制棋盘和实现落子 具体的过程就不写了,我是绘制了一个15*15的棋盘, ...

  9. java设计五子棋_JAVA课程设计+五子棋(团队博客)

    JAVA课程设计 利用所学习的JAVA知识设计一个五子棋小游戏 1.团队名称.团队成员介绍(菜鸟三人组) 杨泽斌[组长]:201521123049 网络1512 叶文柠[组员]:20152112305 ...

最新文章

  1. Linux shell 学习笔记(11)— 理解输入和输出(标准输入、输出、错误以及临时重定向和永久重定向)
  2. ReentrantReadWriteLock(读写锁)
  3. 不用工具箱的神经网络matlab程序_MATLAB中的神经网络工具箱(2)函数命令及模型搭建...
  4. .NET 调用JS:WebBrowser.Document.InvokeScript 方法抛出“指定的转换无效”异常的原因
  5. ThreadLocal小记
  6. 云计算技术推动供应链管理发展的5个原因
  7. int 9中断例程-;在屏幕中间依次显示'a'~'z',并可以让人看清。 在显示的过程中,按下Esc键后,改变显示的颜色...
  8. 前端 圆形进度图_CSS3+JS实现静态圆形进度条
  9. python rs232_Python监视串口(RS-232)握手信号
  10. python对称加密_【Python】 基于秘钥的对称加密
  11. SonicWALL防火墙初探
  12. 你所不知道的 AI 进展
  13. 【搞定GTD】用iPhone打造GTD实践1年后的心得体会
  14. vs2017 C#程序打包安装部署之创建Windows安装项目
  15. html仿百度贴吧,利用Canvas模仿百度贴吧客户端loading小球的方法示例
  16. STM32F4应用-GPIO
  17. 真正的程序员职场高手,都是怎么沟通的?
  18. tex常用函数 上下行对齐_tex常用函数 上下行对齐_【学术写作】如何优雅地(用TeX)写AI论文...
  19. SecureRandom的江湖偏方与真实效果
  20. linux scp控制带宽,Linux系统中安装使用Trickle来控制用户带宽

热门文章

  1. linux中查找某一个字符串,linux下查找包含某个字符串的文件
  2. java文件下载并添加水印_Java下载文件加文字水印(Excel、PDF、图片)
  3. mysql 远程用户授权_mysql创建远程用户并授权
  4. Java黑皮书课后题第9章:*9.3(使用Date类)编写程序创建一个Date对象,设置它的流逝时间分别为...,然后使用toString()方法分别显示上述日期
  5. lumen 分页_lumen 中实现分表
  6. SQL 除去数字中多于的0
  7. 关于可迭代对象、迭代器和生成器
  8. Redis笔记(六):Java中使用Redis
  9. Mysql Order By 注入总结
  10. 解决cell循环利用造成的重复勾选