基于Java Swing五子棋小游戏设计和实现
订阅专栏获取源码
前言:
五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。 在上古的神话传说中有“女娲造人, 伏羲做棋”一说,《增山海经》中记载: “休舆之山有石焉, 名曰帝台之棋, 五色而文状鹑卵。 ”善注引三国淳《艺经》 中曰: “棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。因而规则简单的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子后代中遍及开来。
项目结构:
功能截图:
关键代码:
初始化参数:
private ImageIcon map; //棋盘背景位图private ImageIcon blackchess; //黑子位图private ImageIcon whitechess; //白子位图public int isChessOn [][]; //棋局protected boolean win = false; // 是否已经分出胜负protected int win_bw; // 胜利棋色protected int deep = 3, weight = 7; // 搜索的深度以及广度public int drawn_num = 110; // 和棋步数int chess_num = 0; // 总落子数目public int[][] pre = new int[drawn_num + 1][2]; // 记录下棋点的x,y坐标 最多 (drawn_num + 1) 个public int sbw = 0; //玩家棋色黑色0,白色1public int bw = 0; // 当前应该下的棋色 0:黑色(默认), 1:白色// 边界值,用于速度优化protected int x_max = 15, x_min = 0;protected int y_max = 15, y_min = 0;protected boolean able_flag = true; // 是否选择禁手标志 0:无禁手 1:有禁手(默认private int h; //棋子长private int w; //棋子宽private int insx; //插入棋子的位置private int insy;private Point mousePoint; //鼠标当前位置private int winer; //获胜方private boolean humanhuman=false; //是否是人人对弈private int plast=0; //走了几步了,public int BLACK_ONE; //0表黑子public int WHITE_ONE; //1表白子public int NONE_ONE; //2表无子public int N; //棋盘边长
电脑下棋逻辑处理:
public void putOne(int bwf ) { //bwf 棋色 0:黑色 1:白色int x, y, mx = -100000000;x = y = -1;// 搜索最优下棋点int[][] bests = getBests( bwf );for (int k = 0; k < bests.length; k++) {int i = bests[k][0];int j = bests[k][1];// 有成5,则直接下子,并退出循环..没有,则思考对方情况if (getType(i, j, bwf) == 1) {x = i;y = j;break;}if (getType(i, j,1 - bwf) == 1) {x = i;y = j;break;}// 预存当前边界值int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;// 预设己方下棋,并更新边界值isChessOn[i][j] = bwf;resetMaxMin(i,j);// 预测未来int t = findMin(-100000000, 100000000, deep);// 还原预设下棋位置以及边界值isChessOn[i][j] = 2;x_min=temp1;x_max=temp2;y_min=temp3;y_max=temp4;// 差距小于1000,50%概率随机选取//System.out.println("外 :" + i + "," + j + " mx:" + mx + " t:" + t);if (t - mx > 1000 || Math.abs(t - mx)<1000 && randomTest(3)) {x = i;y = j;mx = t;//System.out.println(i + "," + j + " mx:" + mx + " t:" + t);}}System.out.println("x="+x+",y="+y);// addChess(x,y,(bwf+1)%2,true);// repaint();int step=0;step++;System.out.println("step "+step+":-----------------------------------------------");for(int i=0;i<15;i++,System.out.print("\n"))for(int j=0;j<15;j++){if(isChessOn[j][i]!=2)System.out.print(isChessOn[j][i]);else System.out.print(isChessOn[j][i]);} // 判断是否已分胜负boolean flag = haveWin(x, y, bwf);//记录update( x, y );repaint();// 重设边界值resetMaxMin(x,y);// 胜负已分if (flag) wined(bwf);if (!flag && chess_num >= drawn_num) {win = true;String str = drawn_num + "步没分胜负,判和棋!";JOptionPane.showMessageDialog(null,str);return;}}
-搜索当前状态极大值
alpha :祖先节点得到的当前最小最大值,用于alpha 剪枝
beta :祖先节点得到的当前最大最小值,用于beta 剪枝。
step :还要搜索的步数
return: 当前搜索子树极大值
protected int findMax(int alpha, int beta, int step) {int max = alpha;if (step == 0) {return evaluate();}int[][] rt = getBests(1 - sbw);for (int i = 0; i < rt.length; i++) {int x = rt[i][0];int y = rt[i][1];if (getType(x, y, 1 - sbw) == 1) //电脑可取胜return 100 * ( getMark(1) + step*1000 );isChessOn[x][y] = 1 - sbw;// 预存当前边界值int temp1=x_min,temp2=x_max,temp3=y_min,temp4=y_max;resetMaxMin(x,y);int t = findMin(max, beta, step - 1);isChessOn[x][y] = 2;// 还原预设边界值x_min=temp1;x_max=temp2;y_min=temp3;y_max=temp4;if (t > max)max = t;//beta 剪枝if (max >= beta) return max;}return max;}
总结:
通过此次课程设计,将我本学期所学的JAVA知识得到巩固和应用,在设计的过程中我遇到了很到问题,不过在老师和同学们的帮助和自己的思考下还是很好的完成了。这此课程设计还让我懂得了写程序不能闭门造车,要努力拓宽知识面,开阔视野,拓展思维。它还让我学会了在网上查阅那些无限的资料。由于自己的分析设计和程序经验不足,该系统设计和实现过程中,还有许多没有完善的地方,比如用户界面设计不够美观等多方面问题,这些都有待进一步完善和提高。对于文中出现的不足和系统中出现的问题敬请老师指导。
订阅专栏获取源码
JavaSwing系列项目推荐:
JavaSwing ATM取款机系统的设计和实现
JavaSwing的经典坦克大战游戏设计实现
JavaSwing+mysql的图书管理系统设计实现
JavaSwing+Mysql的酒店管理系统设计实现
JavaSwing+Mysql的餐厅点餐系统设计实现
JavaSwing+Mysql的仓库管理系统设计实现
JavaSwing+Mysql超市商品管理系统设计实现
javaSwing+TXT学生信息管理系统设计实现
JavaSwing+mysql学生社团管理系统设计实现
JavaSwing+mysql的酒店管理系统设计和实现
打卡Java文章更新 19 / 100 天
大家可以点赞、收藏、关注、评论我啦
基于Java Swing五子棋小游戏设计和实现相关推荐
- 基于java的俄罗斯方块小游戏设计(含源文件)
欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 题 目 小游戏开发 摘 要 俄罗斯方块是我们最常见的游戏之一,该 ...
- 基于Java坦克大战小游戏设计(1)
还是采用上学期学习到的设计模式,抽点时间写下这个游戏,游戏逻辑部分先写简单一点的,主要想加深对java设计.模块化等方面的理解. 首先先写Element包下各个元素的类:包括子弹.坦克.树木.河流.家 ...
- 基于Java坦克大战小游戏设计 (2)
接下来继续完善element下物体类,以及添加有关整体游戏进程.配置.绘画相关的类. game包:GameRunThread线程用来开始并处理游戏运行中出现的各种事件,继承thread类. publi ...
- 基于java Swing编写扫雷游戏设计实现(已调试)
免费领取源码+参考 [javaswing扫雷游戏0806] 博主介绍:
- 基于Java+Swing实现俄罗斯方块游戏
基于Java+Swing实现俄罗斯方块游戏 一.系统介绍 二.功能展示 三.其他系统 一.系统介绍 俄罗斯方块项目,基本功能包括:游戏主界面显示模块.方块及数据显示模块.方块移动控制模块.游戏界面颜色 ...
- 基于Java+Swing实现愤怒的小鸟游戏
基于Java+Swing实现愤怒的小鸟游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 基于Java的愤怒的小鸟游戏的设计与实现,基本功能包括:新游戏.载入游戏.控制帮助.退 ...
- c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc
基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...
- 基于控制台的五子棋小游戏(简易)
基于控制台的五子棋小游戏(简易) 展示 源码: 使用: GoBang类: 展示 话不多说上代码 Don't talk much, say the code! 源码: 使用: new完直接运行 publ ...
- java毕业设计——基于java+J2ME的堡垒游戏设计与实现(毕业论文+程序源码)——堡垒游戏
基于java+J2ME的堡垒游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的堡垒游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. 文章目录: 基于ja ...
- 基于flask的五子棋小游戏
基于flask的五子棋小游戏 前言 首先说明一下,本人方向是java后端,只因老师布置了一个作业,要用flask来做一个五子棋,没办法被逼上梁山,程序不太美观,但是应付作业还是够了的. 废话不 ...
最新文章
- 专题 4 通用函数库之调试功能封装
- Android数据库高手秘籍(一)——SQLite命令
- Laravel-5.1 ---- 将mews captcha整合到项目中!
- Floyd算法及其应用
- ajax 购物车 c#,c#购物车功能实现及收藏功能实现
- vue-drag-resize + html2canvas合成图片并下载
- 某IDC服务商机房宕机致银行业务中断 银监会发布风险提示
- Leetcode之回文数
- v22.03 鸿蒙内核源码分析(汇编基础) | CPU上班也要打卡 | 百篇博客分析HarmonyOS源码
- golang连接FTP服务器并下载
- jsp内置对象-session对象
- 应用程序白名单实现_如何在Windows 10上仅允许商店中的应用程序(和白名单桌面应用程序)...
- thinkphp5.1接入银联支付
- 智慧工地数字化管理系统助力工程项目管理强管提效
- Linux - 部署node项目
- web前端开发零基础入门教程
- 壳的编写(2)-- 编写壳(Stub)部分(1)
- 全网征集对六如偈的理解:一切有为法,如梦幻泡影,如露亦如电,应作如是观
- centos配置linuxptp
- UUID简介以及java代码获取UUID示例