date: 2019-03-07

五子棋是国内受到普遍欢迎的一款游戏,规则简单,趣味不俗。作为一名程序员,自然也希望将它移植到电脑上。

这篇我们要讲的主要就是实现简单的人人对战,AI算法放到以后单独说。

我们先来整理一下脉络,看看实现五子棋需要哪些内容:

棋盘。这毋庸置疑

落子监听。下棋当然要把棋子画出来,显然我们是用鼠标来下棋,这里就需要用到鼠标的监听

胜负判断。下棋自然有输赢,每一步棋后都需要进行判断

棋盘

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

落子监听

按钮的监听我们添加在actionPerformed方法(使用这个方法需要添加ActionListener接口)里,通过e.getActionCommand来获得按钮的名字来判断是哪个按钮,实现相应的功能。而落子的监听我们通过mousePressed、mouseReleased或mouseClicked来实现(需要继承MouseAdapter类或者添加MouseListener接口)。

其中mouseClicked不推荐使用,因为不好界定click的时间,本身似乎也有些问题,有些时候会监听不到,而前两个则没有上述问题。我则选择了mousePressed。

棋盘已经绘制完成,而五子棋的子下在棋盘线的交点处,为了棋盘的公整,应当将棋下在交点上,这只需要简单的数学计算就可以算出来,至于棋子长什么样,大家自己动手。

棋子已经能画出来了,但这显然是不够的,因为之后还有胜负判断,人可以一眼看到棋盘上子落在何处,计算机可不行,我们得用容器将棋子落下的位置保存下来,一个二维数组即可(0表示空,1表示黑子,2表示白子,当然其他方法也可以)。此外如果我们还要添加悔棋功能,那么仅保存棋子落下的位置是完全不够的,我们需要知道落子的先后顺序,所以我们应当选择使用有序容器。这里我选择了Vector,当然其他有序容器也都可以,自己选择。

为了储存和之后的操作方便,我们把棋子的位置(x和y)用一个类来保存,这个类十分简单,只需要两个int即可。这里,我储存的x和y并非是棋子在棋盘上的绝对位置,而是棋子的序号(0-14),这样的好处是在中间使用的时候十分清楚,并且如果要改变棋盘的大小等属性,只需要在绘画时更改公式即可,中间过程一概不用动。

到这里,落子的监听基本就完成了,总结一下:

借助mousePressed方法,监听鼠标事件

通过二维数组储存棋盘各个位置的状态,方便判断胜负

通过Vector储存落子的顺序,方便悔棋

将棋子的坐标打包成一个类,储存其在棋盘上的序号,避免棋盘变化导致大量的改动需求

胜负判断

最后这一部分非常简单,只需要在每次落子之后判断一下是否达成五子即可。又因为五子棋规则简单,在落子之后棋子的位置不会再发生变化,所以只需要判断落子点是否会形成五子就可以,没必要每次都遍历全局。五子棋共有8个方向,但是形成连子其实只有四条直线,所以只需要判断四次。

先往上再往下,遇到异色子或者边界就停下,每个同色自给计数变量+1,加上自身含有5个即可达成胜利。这里基本不会遇到什么问题,只要细心判断边界,保证下标不越界就不会有任何问题。

重绘

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

python五子棋人人对战_五子棋-人人对战相关推荐

  1. java五子棋需求分析文档_五子棋需求文档.docx

    五子棋需求文档 <五子棋goBang>项目需求分析报告作者:陈平.雷小梅.唐莉.邓悦.程强日期:2016-3-12审批:日期:状态修订人修改日期版本备注五子棋2016-3-121.0概述1 ...

  2. 五子棋项目结束总结_五子棋活动总结

    五子棋活动总结 篇一:五子棋兴趣小组活动总结 五子棋兴趣小组活动总结 在这个学期里,我们五子棋兴趣小组的活动提高了学 生活动兴趣,增长学生棋艺水平,陶冶学生的性情.现将本 小组的活动情况总结如下: 一 ...

  3. python五子棋课程设计报告_五子棋课程设计报告

    智力 ,而且富含 哲理 ,有助于修身养性 . 五子棋相传起源于四千多年前的尧帝时期,比 围棋 的历史还要悠久,可能早在 " 尧造围棋 " 之前, 民间就已有五子棋游戏 . 有关早期 ...

  4. 五子棋项目结束总结_五子棋项目总结

    五子棋项目是在我加入蓝杰后第一个接触的小型游戏项目,有着非同寻常的意义,所以本人也是相当的重视. 在胡哥的指导下,我们通过完成一个简单的登录界面,初步对桌面应用程序的开发有了一定的了解,即UI的相关知 ...

  5. 五子棋项目结束总结_五子棋和画板项目总结

    五子棋和画板项目总结 项目介绍 项目过程: 一.遇到的困难 五子棋:刚开始接触到五子棋的时候经常会被一些很简单的算法纠结,比如说,判断输赢的算法,还有就是怎么样让棋子下到交叉点上,刚开始有点不太明白 ...

  6. 五子棋项目结束总结_五子棋编程思想小结

    昨天学习了一个控制台五子棋的小程序,还是获益匪浅的,下面对这个小程序总结一下: 首先是要解决如何显示棋盘和显示棋子,这里我们用了一个二维数组借助图像"□"来布局棋盘,棋子用● 遍历 ...

  7. python人机对战_【人机对战】用python打造经典井字游戏

    井字游戏是一个经典的棋盘游戏, 在一个3x3的棋盘上面玩, 谁的棋子先连成一条线就赢了, 我直接拿上次在[人机对战]用python打造经典黑白棋游戏写的程式来改很快就改出来了. 我的版本将程式逻辑拆成 ...

  8. 五子棋项目结束总结_五子棋比赛总结

    五子棋比赛总结 为了丰富我校课余文化和学生们的课余生活, 宣传中华传统文化 和棋类文化, 促进棋类爱好者之间的交流, 提高我系学生的综合素质, 我们女生部特此举办了五子棋比赛,于 2011 年 11 ...

  9. java五子棋项目创新点_五子棋规则的改革创新方法

    五子棋规则最近几年来,关于五子棋规则改革的讨论掀起了一阵阵高潮,形态各异的新规则层出无穷,可谓是对各种规则改革方案的大胆设想.下面小编给你介绍五子棋规则的改革创新,欢迎阅读. 五子棋大多数新规则跟流星 ...

最新文章

  1. 成为算法工程师的路上,掌握什么思维会让自我提升突飞猛进?
  2. torch转mnn笔记
  3. 网站优化充满机遇和挑战
  4. cefSharp通过js操控页面,含跨域操控
  5. SAP Fiori里Contact Support的按钮渲染逻辑
  6. Java 9:欢迎来到Module World
  7. idea 父文件_在ideal创建新的模块(子项目,同时依赖父模块)
  8. 笔试题Python解决
  9. 直接内存访问 (Direct Memory Access, DMA)
  10. (https)nginx - tomcat(http)
  11. python语句写入oracle_将Python变量插入Oracle数据库
  12. linux ifcfg-33 没有eth0解决方法
  13. HDR概念 (二十八)
  14. 我不要你死于一事无成
  15. AllenNLP框架学习笔记(模型篇之一)
  16. 弘辽科技:拼多多店铺星级多久更新一次?如何提升?
  17. 客户分析表格怎么做 财务合并报表培训 5分钟看懂财务报表
  18. 文学杂谈001--《遥远的救世主》
  19. 囧,现在才只QQ有远程控制
  20. ffmpeg h264文件转mp4

热门文章

  1. python中selenium中使用ajax_selenium 智能等待ajax完成调用
  2. linux修改rc.local权限,Linux 7 的 rc.local 文件需要 添加 +x 权限才会自动执行
  3. python语音程序设计基础篇_【笔记】python自学笔记(基础篇)——字典操作
  4. linux开发 stc_Linux下构建stc51单片机开发环境
  5. asp.net ajax聊天室,ASP.NET MVC4异步聊天室的示例代码
  6. rds本地库到rds恢复_rds数据库 恢复本地
  7. android 日历按周获取,Android日历获取当前周,前几周和下周
  8. mysql配置文件说明_mysql配置文件详解说明
  9. linux改变工作目录命令,linux命令:cd命令,改变当前的工作目录
  10. mysql 去重求总数_Mysql获取去重后的总数