订阅专栏获取源码

前言:

五子棋相传起源于四千多年前的尧帝时期,比围棋的历史还要悠久,可能早在“尧造围棋”之前,民间就已有五子棋游戏。有关早期五子棋的文史资料与围棋有相似之处,因为古代五子棋的棋具与围棋是完全相同的。 在上古的神话传说中有“女娲造人, 伏羲做棋”一说,《增山海经》中记载: “休舆之山有石焉, 名曰帝台之棋, 五色而文状鹑卵。 ”善注引三国淳《艺经》 中曰: “棋局,纵横各十七道,合二百八十九道,白黑棋子,各一百五十枚”。这段虽没明讲是何种棋类,但至少知道远古就以漂亮的石头为棋子。因而规则简单的五子棋也可能出自当时,并是用石子作棋子。亦有传说,五子棋最初流行于少数民族地区,以后渐渐演变成围棋并在炎黄子后代中遍及开来。

项目结构:

功能截图:

关键代码:

 初始化参数:

 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五子棋小游戏设计和实现相关推荐

  1. 基于java的俄罗斯方块小游戏设计(含源文件)

    欢迎添加微信互相交流学习哦! 项目源码:https://gitee.com/oklongmm/biye 题 目          小游戏开发 摘    要     俄罗斯方块是我们最常见的游戏之一,该 ...

  2. 基于Java坦克大战小游戏设计(1)

    还是采用上学期学习到的设计模式,抽点时间写下这个游戏,游戏逻辑部分先写简单一点的,主要想加深对java设计.模块化等方面的理解. 首先先写Element包下各个元素的类:包括子弹.坦克.树木.河流.家 ...

  3. 基于Java坦克大战小游戏设计 (2)

    接下来继续完善element下物体类,以及添加有关整体游戏进程.配置.绘画相关的类. game包:GameRunThread线程用来开始并处理游戏运行中出现的各种事件,继承thread类. publi ...

  4. 基于java Swing编写扫雷游戏设计实现(已调试)

    免费领取源码+参考 [javaswing扫雷游戏0806] 博主介绍:

  5. 基于Java+Swing实现俄罗斯方块游戏

    基于Java+Swing实现俄罗斯方块游戏 一.系统介绍 二.功能展示 三.其他系统 一.系统介绍 俄罗斯方块项目,基本功能包括:游戏主界面显示模块.方块及数据显示模块.方块移动控制模块.游戏界面颜色 ...

  6. 基于Java+Swing实现愤怒的小鸟游戏

    基于Java+Swing实现愤怒的小鸟游戏 一.系统介绍 二.功能展示 三.其他系统 四.获取源码 一.系统介绍 基于Java的愤怒的小鸟游戏的设计与实现,基本功能包括:新游戏.载入游戏.控制帮助.退 ...

  7. c语言五子棋学年论文,基于c语言五子棋小游戏生本科论文.doc

    基于c语言五子棋小游戏生本科论文 五子棋小游戏 需求分析 现在有越来越多的人使用电脑,而且五子棋的受众广泛但实体棋操作较为繁琐且平时较难实现,所以电脑版的五子棋游戏应运而生.大家对于这个小游戏的需求如 ...

  8. 基于控制台的五子棋小游戏(简易)

    基于控制台的五子棋小游戏(简易) 展示 源码: 使用: GoBang类: 展示 话不多说上代码 Don't talk much, say the code! 源码: 使用: new完直接运行 publ ...

  9. java毕业设计——基于java+J2ME的堡垒游戏设计与实现(毕业论文+程序源码)——堡垒游戏

    基于java+J2ME的堡垒游戏设计与实现(毕业论文+程序源码) 大家好,今天给大家介绍基于java+J2ME的堡垒游戏设计与实现,文章末尾附有本毕业设计的论文和源码下载地址哦. 文章目录: 基于ja ...

  10. 基于flask的五子棋小游戏

    基于flask的五子棋小游戏 前言 ​ 首先说明一下,本人方向是java后端,只因老师布置了一个作业,要用flask来做一个五子棋,没办法被逼上梁山,程序不太美观,但是应付作业还是够了的. ​ 废话不 ...

最新文章

  1. 专题 4 通用函数库之调试功能封装
  2. Android数据库高手秘籍(一)——SQLite命令
  3. Laravel-5.1 ---- 将mews captcha整合到项目中!
  4. Floyd算法及其应用
  5. ajax 购物车 c#,c#购物车功能实现及收藏功能实现
  6. vue-drag-resize + html2canvas合成图片并下载
  7. 某IDC服务商机房宕机致银行业务中断 银监会发布风险提示
  8. Leetcode之回文数
  9. v22.03 鸿蒙内核源码分析(汇编基础) | CPU上班也要打卡 | 百篇博客分析HarmonyOS源码
  10. golang连接FTP服务器并下载
  11. jsp内置对象-session对象
  12. 应用程序白名单实现_如何在Windows 10上仅允许商店中的应用程序(和白名单桌面应用程序)...
  13. thinkphp5.1接入银联支付
  14. 智慧工地数字化管理系统助力工程项目管理强管提效
  15. Linux - 部署node项目
  16. web前端开发零基础入门教程
  17. 壳的编写(2)-- 编写壳(Stub)部分(1)
  18. 全网征集对六如偈的理解:一切有为法,如梦幻泡影,如露亦如电,应作如是观
  19. centos配置linuxptp
  20. UUID简介以及java代码获取UUID示例

热门文章

  1. 利用STM32PWM占空比实现呼吸灯
  2. 2D美术3——PS笔刷延迟、图层卡顿等解决办法(百试百灵)
  3. 计算机始业课教案,始业课教案
  4. java 过载_java语言中基础类的覆盖与过载
  5. PC端天天生鲜页面实现
  6. python如何压缩pdf_PDF文件怎么压缩,一键压缩PDF文件
  7. 深度学习与围棋:为围棋数据设计神经网络
  8. 轻松两步实现了接口限流
  9. 计算机应用中格式刷怎么用,Word中格式刷怎么用? -电脑资料
  10. python微信自动发送信息脚本