如何用java编写五子棋_java编写五子棋
寒假集训的开始是编写五子棋的程序。
五子棋的编写开始时让我想到的是和AI有关,自然觉得应该蛮难的,不知道应该怎么去实现人机对战。
但整个写下来,觉得弄清里面的门路后,就觉得简单起来。
下面把编写时的想法和心得记录下来,以便记录下自己的成长。
1.首先自然是从界面开始。
基本的界面,使用边框布局,右边用JPanel来放置按钮及一些功能。左边则画出棋盘。
然后实现重绘,以更加完善。
重绘包括棋盘的重绘和棋子的重绘。其中需要注意的是棋子的重绘,需要设置一个二维数组来储存棋子的排布。
public void paint(Graphics g) {
super.paint(g);
drawGobang(g);
}
private void drawGobang(Graphics g) {
Graphics2D gg = (Graphics2D) g;// 设置抗锯齿
gg.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
RenderingHints.VALUE_ANTIALIAS_ON);
gg.setColor(Color.BLACK);
// 画棋盘
for (int i = 0; i < 15; i++) {
gg.drawLine(30, 30 + 40 * i, 30 + 40 * 14, 30 + 40 * i);// 横线
gg.drawLine(30 + 40 * i, 30, 30 + 40 * i, 30 + 40 * 14);// 竖线
}
for (int i = 0; i < chess.length; i++) {
for (int j = 0; j < chess[i].length; j++) {
if (chess[i][j] == 1) {
gg.setColor(Color.BLACK);
gg.fillOval(i * 40 + 10, j * 40 + 10, 40, 40);
} else if (chess[i][j] == 2) {
gg.setColor(Color.WHITE);
gg.fillOval(i * 40 + 10, j * 40 + 10, 40, 40);
}
}
}
}上面的代码中还用到了Graphics2D,来消锯齿。
2.接下来是准备实现判断输赢的功能。五子棋都知道是五个棋子连起来就行,所以,我们需要有四个判断方向。从左到右,从上到下,从左上到右下,从右上到左下。
public int sp(int x, int y) {
// 记录棋子个数
int count = 0;
// 向右
for (int i = x + 1; i < chess.length; i++) {
if (chess[i][y] == chess[x][y]) {
count++;
} else {
break;
}
}
// 向左
for (int i = x; i >= 0; i--) {
if (chess[i][y] == chess[x][y]) {
count++;
} else {
break;
}
}
return count;
}
这是水平方向上的搜索。主要是判断是否和当前所下棋子颜色相同,向左向右,加起来就可以得到是否有等于5的相同颜色棋子。其他方向类似。
3.最后就是要实现人机对战了。
AI所下的棋子肯定是基于一种最优判断,判断的则是利用到不同情况的权值不同。这里用到的是哈希表。简单的解释就是一个字符串映射一个值(不能是基本类型)。我们可以按照值得的程度来设置权值,利用四子相连那就权值肯定就要大啦(都要赢了)。
所以首先的是根据棋子相连情况建立权值表
HashMap hm = new HashMap();
······
接着,我们需要创建一个新的二维数组,用来存每个位置的权值 chessValue[][]
然后要根据棋盘上的棋子情况算每个位置(当然是能下地位置)的权值。搜索在棋盘上权值最大的位置,这个位置就是AI要下的地方。
需要注意的是,
无论是AI还是玩家,每走完一步都要判断输赢;
电脑每走完一部,都要清空chessValue数组,重新计算权值。
这样五子棋基本就是这样了,当然一些细节都还要完善,比如:人机对战时,玩家要选择黑子还是白子;界面增加一些回合数,模式等功能;开始界面的设置······
如何用java编写五子棋_java编写五子棋相关推荐
- java制造病毒_java编写病毒的可行性分析
java编写病毒的可行性分析 最近心情十分郁闷,查阅一些病毒的资料消遣一下,居然发现这样的论调讲 java语言不可能编写病毒,在此特地反驳一下. 1 可执行 论调1:java需要依赖jre,无法在无j ...
- java 网络五子棋_Java实现五子棋网络版
本文实例为大家分享了Java实现五子棋网络版的具体代码,供大家参考,具体内容如下 需求分析: 对于网络五子棋而言,在普通五子棋的基础上需要添加以下功能: 1.拥有服务器端和客户端,用户通过客户端登录服 ...
- java中五子棋_Java简单五子棋的实现
在经过了几天的学习后,已经可以实现一个简单的五子棋游戏了,下面我就写一下编写程序 的过程和自己在这个过程中的心得体会. 第一步:绘制棋盘和实现落子 具体的过程就不写了,我是绘制了一个15*15的棋盘, ...
- java 定时删除_Java编写定时删除文件程序
Java编写定时删除文件程序 /*Java教程:http://www.javaweb.cc*/ import java.io.File; import java.util.Calendar; impo ...
- java绘制棋盘_java绘制五子棋棋盘
本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; import javax.swing.*; impo ...
- java程序步骤_java编写程序的步骤是什么?java编写程序步骤实例讲解
写java编程就是一步一步的来,这样才会写好一个编程,之后也才能正常的运行,那么java编写程序的步骤是什么?今天我们就来给大家讲解一下这方面的内容.大家可以参考以下文章! 1.编写源文件 使用文本编 ...
- java五子棋_java实现五子棋
一.需求分析 1.画一个15x15的棋盘版面 2.功能按钮:开始游戏,悔棋,认输 3.单选按钮:人人对战.人机对战 4.要求:在棋盘上下棋子,棋子必须要在交叉点上:同一个位置上不能有再下棋子:棋子不能 ...
- java绘制五子棋_java绘制五子棋棋盘
免费资源网,https://freexyz.cn/ 本文实例为大家分享了java绘制五子棋棋盘的具体代码,供大家参考,具体内容如下 源码: import javax.imageio.ImageIO; ...
- java 固定电话_Java 编写过滤手机号码或者固定电话的工具类
以下是分享自己编写的用于过滤手机号码.固定电话.黑名单的工具类TelCheckUtils, import java.util.HashSet; import java.util.Set; import ...
- java实现五子棋_java实现五子棋
[java]代码库import java.awt.Color; import java.awt.Font; import java.awt.Graphics; import java.awt.Tool ...
最新文章
- mysql中的主从复制slave-skip-errors参数使用方法
- 绿证交易全凭自愿 哪些企业会为其买单?
- OpenGL编程指南14:混合半透明Blend
- SQL基础操作_4_表的插入、更新、删除、合并操作
- release 无法打开windows.h vs_Windows 10 Build 21270发布:Cortana新增打开/搜索文件技能...
- 解析法实现一元线性回归、多元线性回归以及数据模型可视化操作
- OpenJudge NOI 1.5 02:财务管理
- MySQL (9)---数据类型
- android 悬浮组件,Android 悬浮组件
- java基础应用_Java基础(应用篇)
- GO语言学习之路13
- 随手练——O(n)解决无序数组排序后的相邻最大差值
- Vue 自定义弹出框组件(类似淘宝选择规格)
- 独立样本t检验、方差齐性检验
- python基础教程十进制_Python基础教程(四)
- 打印机共享与文件夹win10共享教程
- 简单的自动化测试脚本
- Qt 给文本添加删除线 text-decoration
- 解决显示“此图片来自微信公众平台未经允许不可引用”错误图片
- vue + html2canvas + ArcGIS 3.x 地图一键截图功能踩坑之路(二)