java中五子棋_Java简单五子棋的实现
在经过了几天的学习后,已经可以实现一个简单的五子棋游戏了,下面我就写一下编写程序 的过程和自己在这个过程中的心得体会。
第一步:绘制棋盘和实现落子
具体的过程就不写了,我是绘制了一个15*15的棋盘,在棋盘的右侧添加了几个按钮分别是“开始游戏”、“悔棋”、“认输”、“人人对战”、“人机对战”。这里用到的API类主要有JFrame、JPanel、BorderLayout、JButton、JRadioButton、ButtonGroup、Dimension、MouseAdapter(MouseListener)、MouseEvent、ActionListener、ActionEvent、Graphics2D、Color。在实现落子的时候主要要考虑这几个问题。如何让棋子落在交叉点上,如何让一个交叉点只安放一个棋子,让黑棋和白旗按照顺序落下。因为鼠标点击的位置不可能每次都正好在交叉点上,所以要设置一个范围,只要在交叉点的这个范围内点击就能落子。创建一个保存棋子位置的二维数组,只要落了子就保存在数组中,这样一个点就只能下一个棋子了。最后设置一个计数器count,只要count=0就下黑棋,count=1下白棋即可。这里主要还有一个问题,因为每次添加JPanel面板时画笔就会重绘一次,这样会覆盖掉画好的棋子和棋盘,如果将窗口最小化再打开,就什么都没有了。这时候需要重写JPanel里的paint方法,将绘制棋盘和棋子的方法写入就可以了。
第二步:实现按钮功能和人人对战
“开始游戏”:将存放棋子位置的二位数组全部清零之后调用paint方法重绘棋盘即可。
“认输”:读取计数器count,如果是1则黑棋获胜,0则白棋获胜。
“悔棋”:我认为悔棋有两种方式,一种是刚刚下棋的一方悔一次棋,另一种是能够不断悔棋。我使用的是第二种方法。创建两个数组存放每次落子的横坐标和纵坐标,当点击按钮时将这一位置清零然后重绘棋盘即可。
人人对战的算法比较好实现,只要判断左右,上下,y=x,y=-x这八个方向上有没有连续的相同颜色的五个棋子就行。
public int checkrow(int x, int y){
int count1=0;//存放连续的相同颜色的棋子数for(int i=x+1;i<15;i++){
if(chess[i][y]==chess[x][y]){
count1++;
}
else {
break;
}
}
for(int i=x;i>=0;i--){
if(chess[i][y]==chess[x][y]){
count1++;
}
else {
break;
}
}
return count1;
}
这是左右方向的算法,其他方向的以此类推。这样,只要每次下完棋都判断一次,就能知道那方获胜。
第三步:实现人机对战
查看了网上的资料后,发现五子棋的AI主要有两个算法,一个是博弈树,另一个是权值算法。因为博弈树算法比较复杂 ,所以我使用的是权值算法。权值算法就是在每次落子之后,在落子的周围空位上生成权值,哪个空位的权值大,就让AI下在那个位置。这就需要我们创建一个哈希表,将每一种棋子相连的情况对应一个权值.
HashMap hm = new HashMap();
public void hxb(){
hm.put("2", 30);
hm.put("1", 10);
hm.put("22", 1000);
hm.put("21", 20);
hm.put("11", 1500);
hm.put("12", 15);
hm.put("222", 10000);
hm.put("221", 150);
hm.put("112", 100);
hm.put("111", 3000);
hm.put("1111", 20000);
hm.put("2222", 100000);
hm.put("1112", 2000);
hm.put("2221", 1900);
hm.put("22221", 50000);
hm.put("11112", 15000);
}
这里我使用字符串来保存棋子相连的情况,1对应黑棋,2对应白棋,12就是一个黑棋和一个白棋相连。对应的权值大小可以自行调整。
在创建好哈希表后,接下来要做的就是写一个方法,给予每一个空位权值。
public void AI(){
for(int i=0;i<15;i++){
for(int j=0;j<15;j++){
if(chess[i][j]==0){
//搜索该空位八个方向上棋子相连情况//定义:chess变量记录棋子相连情况,color记录棋子颜色String czf="";
int color=0;
for(int k=i+1;k<15;k++){
if(chess[k][j]==0){
break;
}else{ if(color==0){
czf+=chess[k][j];
color=chess[k][j];
}else if(color==chess[k][j]){
czf+=chess[k][j];
}else{
czf+=chess[k][j];
break;
}
}
}
//根据棋子相连情况取出对应的权值累加Integer value = hm.get(czf);
if(value!=null){
chessValue[i][j]+=value;
}
czf="";
color=0;
//向左 }
}
}
}
这里的是根据左右方向给予权值,其他方向以此类推。之后就是根据权值让AI落子。要注意的是每一次AI落子后都要讲存放空位权值的数组chessValue清零。剩下的就是把一些细节部分给完善,这样,一个简单的五子棋游戏就完成了。
在写这个游戏的过程中出现了许许多多的错误,也收获了很多的东西。真正写起来,算法的部分其实不是很难完成,主要是细节方面的错误太多了,也浪费了很多时间。写程序的时候,一个清晰的思路十分重要,脑海里还要有一个大概的框架。在出现问题时,要仔细分析问题,寻找问题的源头。与同伴的交流也十分的重要,因为每个人的看法不同,所以和同伴沟通能够提供新的思路,碰撞出新的火花,解决问题的时候也能大大提升效率。最重要的,和同伴一起完整一项工作是一件挺开心的事:-D。
java中五子棋_Java简单五子棋的实现相关推荐
- java中我爱你_Java线程学习(转)
编写具有多线程能力的程序经常会用到的方法有: run(),start(),wait(),notify(),notifyAll(),sleep(),yield(),join() 还有一个重要的关键字:s ...
- java中延迟_Java中的延迟分配
java中延迟 程序员本质上是懒惰的,而similis simili gaudet就像程序是懒惰的一样. 您听说过延迟加载吗? 还是懒惰的单身人士? (不过,我个人更喜欢单一麦芽版本.)如果使用Sca ...
- java中面向对象_java中的面向对象
首先需要了解什么时面向对象呢? 面向: 基本义:面对,朝向 引申义:注重, 关注 对象: 世间一切的事物(万物皆对象) 面向对象思想: 面向对象思想就是把一个关注点放在一件事或一个活动中涉及到的人或事 ...
- java中数据结构_JAVA中数据结构总结
本篇文章主要总结一下JAVA中实现的几种数据结构 简述: List>:链表结构. Queue>:队列,只允许在表的前端(front)进行删除操作,而在表的后端(rear)进行插入操作,队列 ...
- java 中关键字_java中关键字一览
开始学习java了,今天学了java中的关键字,给大家分享以下. java中有50个关键字(含两个保留字),没有算true,false,null,简单一点,列个表格出来,仿照着:abstractcon ...
- java中图标_java中图标按钮
关于 java中图标按钮的搜索结果 问题 求教如何在按钮中嵌入图标 求高手告诉我,我的问题出在哪里,我想了一上午都没想出来,我想的是设置按钮的图标而不是背景, 未设置按钮图标之前运行的效果 设置按钮图 ...
- Java中的GC简单介绍
文章目录 一.GC是什么? 二.为什么要GC? 三.怎么GC? 一.GC是什么? GC英文全称为Garbage Collection,即垃圾回收. Java中的GC就是对内存的GC. Java的内存管 ...
- Java 中 10 大简单的性能优化
点击"终码一生",关注,置顶公众号 每日技术干货,第一时间送达! Java 7 ForkJoinPool和 Java 8 的并行Stream有助于并行化东西,这在您将 Java 程 ...
- java中的List简单介绍
List是Java中比较常用的集合类,关于List接口有很多实现类,本文就来简单介绍下其中几个重点的实现ArrayList.LinkedList和Vector之间的关系和区别. List 是一个接口, ...
最新文章
- 阿里云配置服务器报:bind: cannot assign requested address
- dao模式和前端控制器结合使用_前端技术及开发模式的演进,带你了解前端技术的前世今生...
- Android Glide加载图片成圆形
- C++学习10 static静态成员变量和静态成员函数
- linux格式化外接硬盘命令,linux格式化硬盘命令
- 《Vue入门到精通系列》--- 两万字带你入门Vue
- 眼压高学计算机行吗,为什么眼压高到降不下,医生却说没问题?
- [ CQOI 2014 ] 数三角形
- python3.6实现的A星算法
- 大一计算机期末考试操作题word,Word大一计算机考试操作题
- es文件创建局域网服务器,es文件浏览器局域网连接win10电脑怎么设置
- 数据存储的各个发展阶段
- Python 小程序:计算24点
- 再见2018 你好2019
- linux g 使用教程,linux下的gedit命令使用方法与技巧
- 递归算法_字符串反转_20230412
- 渗透杂记2013-07-31
- gym 100543 CERC 2014 L Outer space invaders
- 华为AP4050DN-HD使用tftp、uboot瘦转胖
- App-Charle抓包配置(https)
热门文章
- 中国医疗器械行业需求态势及未来前景趋势预测报告(2022-2027年)
- java sencha_基于SenchaCmd搭建ExtJS 6.2版本开发环境(图文教程)
- 试图加载格式不正确的程序。 (Exception from HRESULT: 0x8007000B)
- 018 参数估计之点估计法:矩估计法、最大似然估计
- Mixly第三方用户库开发Arduino UNO使用EMW3080连接阿里云
- 姓谢起名:温柔贤惠、好听到爆的谢姓女孩名字
- 基于51单片机远近光灯切换电路设计方案
- python搜索pdf内容所在页码_使用pyPDF从文档中检索页码
- Espresso测试示例
- android 壁纸制作教程,[教程]怎样制作Android手机壁纸/桌面