五子棋是国内受到普遍欢迎的一款游戏,规则简单,趣味不俗。作为一名程序员,自然也希望将它移植到电脑上。
这篇我们要讲的主要就是实现简单的人人对战,AI算法放到以后单独说。
我们先来整理一下脉络,看看实现五子棋需要哪些内容:

  • 棋盘。这毋庸置疑
  • 落子监听。下棋当然要把棋子画出来,显然我们是用鼠标来下棋,这里就需要用到鼠标的监听
  • 胜负判断。下棋自然有输赢,每一步棋后都需要进行判断

棋盘

棋盘的绘制应该是十分简单,就不多说了,画成什么样就看自己的心情。当然,为了使用起来更加,我们可以加上开始游戏、悔棋、认输等按钮,按钮的监听我之前的文章也有讲过,不清楚的欢迎大家去看一下。其中,为了更合理一点,在开始游戏之前显然是不能悔棋和认输的,所以我们需要在开始游戏按钮按下之前将这两个按钮设置为无法使用,调用setEnabled()方法就可以实现,需要一个参数,类型为布尔。

落子监听

按钮的监听我们添加在actionPerformed方法(使用这个方法需要添加ActionListener接口)里,通过e.getActionCommand来获得按钮的名字来判断是哪个按钮,实现相应的功能。而落子的监听我们通过mousePressedmouseReleasedmouseClicked来实现(需要继承MouseAdapter类或者添加MouseListener接口)。
其中mouseClicked不推荐使用,因为不好界定click的时间,本身似乎也有些问题,有些时候会监听不到,而前两个则没有上述问题。我则选择了mousePressed
棋盘已经绘制完成,而五子棋的子下在棋盘线的交点处,为了棋盘的公整,应当将棋下在交点上,这只需要简单的数学计算就可以算出来,至于棋子长什么样,大家自己动手。
棋子已经能画出来了,但这显然是不够的,因为之后还有胜负判断,人可以一眼看到棋盘上子落在何处,计算机可不行,我们得用容器将棋子落下的位置保存下来,一个二维数组即可(0表示空,1表示黑子,2表示白子,当然其他方法也可以)。此外如果我们还要添加悔棋功能,那么仅保存棋子落下的位置是完全不够的,我们需要知道落子的先后顺序,所以我们应当选择使用有序容器。这里我选择了Vector,当然其他有序容器也都可以,自己选择。
为了储存和之后的操作方便,我们把棋子的位置(x和y)用一个类来保存,这个类十分简单,只需要两个int即可。这里,我储存的x和y并非是棋子在棋盘上的绝对位置,而是棋子的序号(0-14),这样的好处是在中间使用的时候十分清楚,并且如果要改变棋盘的大小等属性,只需要在绘画时更改公式即可,中间过程一概不用动。
到这里,落子的监听基本就完成了,总结一下:

  1. 借助mousePressed方法,监听鼠标事件
  2. 通过二维数组储存棋盘各个位置的状态,方便判断胜负
  3. 通过Vector储存落子的顺序,方便悔棋
  4. 将棋子的坐标打包成一个类,储存其在棋盘上的序号,避免棋盘变化导致大量的改动需求

胜负判断

最后这一部分非常简单,只需要在每次落子之后判断一下是否达成五子即可。又因为五子棋规则简单,在落子之后棋子的位置不会再发生变化,所以只需要判断落子点是否会形成五子就可以,没必要每次都遍历全局。五子棋共有8个方向,但是形成连子其实只有四条直线,所以只需要判断四次。
先往上再往下,遇到异色子或者边界就停下,每个同色自给计数变量+1,加上自身含有5个即可达成胜利。这里基本不会遇到什么问题,只要细心判断边界,保证下标不越界就不会有任何问题。

重绘

上述三个部分完成,五子棋-人人对战基本就完成了,但是重绘是每次绘图都会遇到的问题,在这里就提醒一下不要忘记重绘,不懂重绘的可以去搜索一下关于重绘的文章,本身并不是很难。

Java五子棋-人人对战相关推荐

  1. JAVA五子棋人人对战的实现

    此程序只实现了五子棋的人人对战功能,人机对战功能待完善算法问题后补充 目录 棋子类 棋盘类 界面类 总结 棋子类 package FiveChess;import java.awt.Color;//棋 ...

  2. python五子棋人人对战_五子棋-人人对战

    date: 2019-03-07 五子棋是国内受到普遍欢迎的一款游戏,规则简单,趣味不俗.作为一名程序员,自然也希望将它移植到电脑上. 这篇我们要讲的主要就是实现简单的人人对战,AI算法放到以后单独说 ...

  3. 如果用java swing编写一个五子棋(人人对战)

    2020博客之星年度总评选进行中:请为74号的狗子投上宝贵的一票! 我的投票地址:点击为我投票 写在前面: 大家好,我是 花狗Fdog ,来自内蒙古的一个小城市,目前在泰州读书. 很感谢能有这样一个平 ...

  4. Java 五子棋人人对战和人机对战简单实现

    废话不多说,咱直接进入正题 首先,为了方便,咱们先用一个Java接口把一些全局要用的数据写到接口里,这样就不用传来传去了 package wuziqi;public interface Gobang ...

  5. java五子棋人机对战_实现简单的人机对战五子棋(实践)

    五子棋人机对战实践项目 总的任务和目标 完成一个人机对战的五子棋项目,基本效果如下: 第一部分 Java绘图原理 1.   基本概念 像素,坐标 2.   组件自定义绘图原理 3.   Graphic ...

  6. java五子棋联网对战,毕业设计-- 用JAVA实现五子棋网络对战系统

    毕业设计-- 用JAVA实现五子棋网络对战系统 本科生毕业设计(论文)本科生毕业设计(论文) 题 目 用 JAVA 实现五子棋网络对战系统 姓 名 xxxx 学 号 xxxxx 系 别 计算机工程系 ...

  7. 五子棋人人对战功能的C语言实现(无禁手)

    文章目录 前言 显示棋盘 执行落子 胜负判定 功能综合 前言 之前C语言课的大作业是设计一个可以进行人人对战和人机对战的五子棋程序.我在初期开始写的时候参考过很多份代码,但对于当时我的水平而言不够直观 ...

  8. python五子棋人人对战_简单的五子棋-人人对战

    1新建工程 项目->VC++->MFC->MFC应用程序->输入名称->单文档->Window套接字->完成 2资源编辑 视图->其他窗口->资源 ...

  9. python大作业五子棋人人对战_简单的五子棋(人人对战)

    这是一个简单的五子棋游戏,目前只实现了简单的人人对战,就是自己跟自己下...具体效果如下: 实现这个效果也很简单,主要功能是: 1.点击棋盘能下棋子.棋子位置在棋盘点.点击点和下子点近似判断.黑白棋子 ...

最新文章

  1. Android Context activity实例使用
  2. 23种设计模式的基本介绍
  3. Web架构师成长之路
  4. java5年转c语言,时隔5年,C语言再次领先Java,荣登编程语言排行榜第一!
  5. python计算最大公约数函数_Python实现的求解最大公约数算法示例
  6. JeecgBoot 常见问题QA
  7. window.location.href 跳转失败
  8. MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
  9. 用PWA构建一个完全离线的网站
  10. 挖金矿 详解(C++)
  11. 目录 1. 常见mime类型 1 1.1. 2.1.1. Type application 2 2.1.2. Type audio 22.1.3. Type image 32.1.4. Type t
  12. [DappReview]2020年第一季度Dapp市场报告
  13. 《实战 Java 高并发程序设计》笔记——第1章 走入并行世界(一)
  14. 开漏输出和推挽输出的区别?
  15. 使用calibration_toolkit进行相机和三维激光雷达的联合标定(详细步骤)
  16. atom n270 cpu linux,英特尔Atom Z530和Intel Pentium-M 733 那个处理能力强_intel atom z530
  17. 堆与栈区别,以及分配内存的快慢
  18. python xlwt
  19. Java--对象的比较2(类比)
  20. 软考中项:常考知识点及案例分析要点总结

热门文章

  1. 使用OpenLayers加载高德离线地图简单实用
  2. python自动聊天机器人手机版_Python实现聊天机器人
  3. date js 减去_如何从Javascript中减去10天的日期
  4. TortoiseGit工具 修改登录用户名密码
  5. 快速以太网中传输介质100BASE-TX
  6. 致远小场景方案之从外部推送待办
  7. 恒压板框过滤实验数据处理_板框压滤机选型计算方法
  8. 用地图说话 在商业分析与演示中运用Excel数据地图 全彩
  9. 曙光服务器通过ipmi安装系统,曙光服务器ipmi部署记录资料
  10. 生物素点击试剂1884349-58-9,Alkyne-PEG3-Biotin Diazo,炔基PEG3生物素重氮