「java四子棋人机对战」五子棋人机对战
本篇文章给大家谈谈java四子棋人机对战,以及五子棋人机对战对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、五子棋人机博弈游戏(cocos creator)
- 2、围棋的人机对弈软件哪个最好?
- 3、求JAVA人机对战五子棋代码。。
- 4、系统框图如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输
五子棋人机博弈游戏(cocos creator)
参考文章: 【Cocos Creator 实战教程(1)】——人机对战五子棋(节点事件相关)
源码: goBang
思考一:作为对手的系统用什么算法下棋?
估值函数、搜索算法和胜负判断等
博弈算法,在极大极小值搜索中应用alpha-beta剪枝
智能五子棋博弈程序的核心算法
智能五子棋中的算法研究
人机版五子棋两种算法概述
思考二:人机博弈的要点
1.棋局的状态能够在机器中表示出来,并能让程序知道当时的博弈状态
2.合法的走法规则如何在机器中实现,以便不让机器随便乱走而有失公平
3.如何让机器从所有的合法走法中选择最佳的走法
4.一种判断博弈状态优劣的方法,并能让机器能够做出智能的选择
5.一个显示博弈状态的界面,有了这样的界面程序才能用的起来而有意义
思考三:五子棋下棋规矩
五子棋对局,执行黑方指定开局、三手可交换、五手两打的规定。
整个对局过程中黑方有禁手,白方无禁手。
黑方禁手有三三禁手、四四禁手和长连禁手三种
思考四:人机下棋逻辑
系统先下,黑棋落子,交换下子顺序
玩家下,监测胜负(无胜负,交换下子顺序)
系统下(五元组中找最优位置),监测胜负(无胜负,交换下子顺序)
。。。
直到分出胜负(这里未考虑平局)
出现提示窗,告知玩家战局结果,同时可选择“返回菜单”或“再来一局”
具体实现:涉及知识点
官方文档--预制资源
将其改名为Chess拖入下面assets文件夹使其成为预制资源
1.在canvas节点上挂载Menu脚本组件
2.在按钮事件中,拖拽和选择相应的Target,Component和Handler
初始化棋子节点断点截图
系统为黑棋的评分表:
找最优位置下子
个人想法
这是我学习五子棋游戏开发的记录,后续还会写其他游戏开发,加油!
围棋的人机对弈软件哪个最好?
思佳围棋软件比较好。其它的也有:
思佳围棋软件 2.0.5 能算胜负的人机对弈围棋软件
想要软件,去
支持人机对弈,棋力可以达到九级,并且还在不断更新之中!
支持本地对局、局域网对局!支持悔棋、弃权等操作;
支持保存棋谱(SGF格式、BMP格式);
支持保存棋谱为TXT格式,方便在BBS上发表(请参见附图);
不久将提供围棋死活题库,帮助您提高围棋死活计算能力;
希望您喜欢思佳围棋网提供的软件,并提出宝贵的意见。
欢迎访问思佳围棋网!
1. 围棋助手 V8.76
一个专业的围棋工具软件,包含职业棋手对局41409谱,教
2. 围棋助手 8.76E 升级版
一个专业的围棋工具软件
download.pchome.net/game/chess/15739.html
3. 围棋定式详解 3.0
定式详解包含了几乎所有常用定式,带有详细的解说。有了它,查询定式、学习定式将不再
4. 围棋助手 8.76 完整版
5. 弈缘围棋 完全安装版 1.81
这是一个集“棋谱管理”和“网上对弈”于一身的围棋软件
download.pchome.net/game/chess/7875.html
6. 弈缘围棋 简装版 1.81
一个集“棋谱管理”和“网上对弈”于一身的围棋软件
download.pchome.net/game/chess/8868.html
7. 围棋入门网上训练软件 1.0
中国围棋网和中国大学生围棋网联合推出的围棋入门网上训练软件,用它可以和很多同是初
8. Go81 随身围棋 1.3
Go81是PDA上的彩色围棋游戏,提供9x9,13x13两种不同大小的棋盘可让玩家好好厮杀一番;
9. 3D Reversi Deluxe 3D 围棋
3DReversiDeluxe让喜好棋类游戏的玩家有个挑战计算机的机会,玩家可以挑战游戏中所设
10. 喜玛拉雅围棋谱 19.0 +
使用xml纪录围棋谱,任意一手都可以有N多变化图
download.pchome.net/game/chess/18580.html
11. 弈缘围棋 V1.81 完全版
这是一个集“棋谱管理”和“网上对弈”于一身的围棋软
12. 围棋伴侣 0.3
如果你想在短时间内提高你的围棋棋艺;如果你想在学棋的过程中有一个良师益友;如果你想
13. 围棋攻防手筋 1.14
14. 围棋死活习题集 3.0
围棋泰斗吴清源说:很多围棋爱好者向我提出了这样的问题:“怎样才能提高棋力?”我的
15. 围棋助手光盘版 8.40d
一个专业的围棋工具软件,包含教程、细解千余个,职业棋手对局35000谱,集成棋谱快车
16. 围棋名局精解 1.21
带详细解说的名局棋谱,容量比传统出版物大多了。
17. 围棋五子棋对弈 1.0
围棋五子棋网络对弈,支持Internet和局域网对战
download.pchome.net/game/chess/16566.html
18. MultiGo 围棋棋谱软件 2.2.8
为功能强大的围棋打谱软件。全面支持SGF文件格式,并能读BDX(清风)及NGF(新浪)的
19. 喜玛拉雅围棋谱软件 19.0
用xml记录围棋谱。任意一手都可以有N多变化图。每个变化图都可以有N多手,这N多手又都
20. 网上围棋对局室 1.65
21. 围棋官子技巧 1.1.4
22. 北极星游戏系列之网络围棋 built 990129
“北极星软件OpenWorld系列”之一,必须在LSChat!的基础上运行
download.pchome.net/game/netgame/1609.html
23. 围棋名局 1.0
围棋打谱软件,围棋爱好者必备。内含1600局经典名局棋谱,棋谱通过作者主页不定期发布
24. 弈缘围棋 1.81
这是一个集“棋谱管理”和“网上对弈”于一身的围棋软件。棋谱管理:可以记谱、保存棋
25. 联众游戏之围棋 V1.09
围棋对于我们中国人来说已经远远超出了它的娱乐功能
download.pchome.net/game/netgame/1596.html
26. 蓝光伤脑筋十二块 2.00
曾被漫画师丰子恺誉为“超平玩具之上,与象棋、围棋相颉顽”的“伤脑筋十二块”,是一
27. 围棋精灵 1.03b
围棋精灵是一款精巧设计的围棋打谱软件。与同类软件相比,围棋精灵在全面支持SGF格式
28. 思佳围棋软件 2.0.5
.功能最强、界面最漂亮的围棋对弈软件;.支持人机对弈,棋力可以达到九级,并且还在不
29. 3D Reversi Deluxe 3D 围棋 V1.0
3D Reversi Deluxe 让喜好棋类游戏的玩家有个挑战计算
30. 围棋名局 1.0
围棋爱好者必备的围棋打谱软件
download.pchome.net/game/tools/17497.html
31. 围棋骗着与无理手 1.2.4
32. 网络围棋 V1.10
网络围棋是一款围棋游戏软件。特点:1.支持棋谱管理:可
33. 喜玛拉雅围棋谱 V18.0
使用xml纪录围棋谱。任意一手都可以有N多变化图,每个
34. 网络围棋 1.10
是一款围棋游戏软件。特点:1.支持棋谱管理:可以记谱、保存棋谱;2.局域网两人对弈;3.
35. JGame 2.06 for win2000,win2003,win XP或win NT
⊙JGame目前最新版为JGameV2.0.6版,包括围棋、象棋、五子棋、国际象棋、陆战棋、四国
36. 围棋死活题集 3.0
收集1000多道精妙的死活题,难度从出学者到接近专业棋手水平
download.pchome.net/game/chess/20212.html
37. JGame 2.06 for win95,win98,win XP
⊙JGame目前最新版为JGameV2.0.6版,包括围棋、象棋、五子棋、国际象棋、陆战棋、四国
38. 棋谱快车 V1.4
一个免费的围棋棋谱下载工具,帮你轻松下载网上数万个
39. 围棋游戏
有初学、爱好、专家、大师四个难度等级供你选择,模式分为电脑自动下棋、双人比赛
download.21cn.com/list.php?id=43969
40. SICQ围棋、五子棋插件 1.1
SICQ围棋、五子棋插件
download.pchome.net/internet/communications/message/1870.html
41. 围棋助手 V7.30 特别版
围棋助手是一个专业的围棋工具软件。它具有对局、打谱、在谱中推演变化、研究定式
download.21cn.com/list.php?id=33259
42. 五星连珠 V1.0
五星连珠是东方的一种古老游戏。在类似围棋棋盘的19X1
43. 围棋实战训练 5.2
44. wjygo 电脑围棋 3.6
1.和电脑下围棋。2.支持悔棋、胜负计算,智能提示落子。3.围棋打谱,支持sgf格式棋谱。
45. 围棋助手 V8.72
一个专业的围棋工具软件,具有打谱、推演棋谱变化、配参考图、网上对局、录入、打
download.21cn.com/list.php?id=28421
46. 蓝光伤脑筋十二块 V2.00
曾被漫画师丰子恺誉为“超平玩具之上,与象棋、围棋相
47. GoSec2000浏览版 1.01
是一款围棋资料管理软件,她是一位非常能干的围棋小秘书,能帮助您完成以下工作:1、
48. MultiGo 围棋棋谱软件 V2.2.8
为功能强大的围棋打谱软件。全面支持 SGF 文件格式,并能读 BDX (清风)及 NGF ?
download.21cn.com/list.php?id=30784
49. 围棋棋谱转换程序 1.0
可以完成sgf,新浪围棋,联众围棋三种格式棋谱文件之间的转换,方便棋友们交流,使用和
50. 围棋打谱程序 V1.0
可以很方便的打出围棋谱。
51. 围棋定式详解 V3.01
定式详解包含了几乎所有常用定式,带有详细的解说。有
52. 蓝光伤脑筋十二块 V2.00
曾被漫画师丰子恺誉为“超平玩具之上,与象棋、围棋相颉顽”的“伤脑筋十二块”。
download.21cn.com/list.php?id=43561
53. DOS围棋
DOS围棋游戏,在Win 9x下运行良好,至今仍是人机对弈围棋佳品。
download.21cn.com/list.php?id=43968
54. 围棋死活习题集移动版之Symbian(uiq)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
55. 围棋SGF棋谱阅读器 1.01
56. 围棋死活习题集移动版之PocketPC 2003版 1.0
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
57. 围棋死活习题集移动版之Palm版 1.0
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
58. 喜玛拉雅围棋谱 V12.0
使用xml纪录围棋谱。任意一手都可以有N多变化图,每个变化图都可以有N多手,这N多
download.21cn.com/list.php?id=49949
59. 围棋和五子棋控件 V1.6.166
很有特色的一款围棋和五子棋控件,并且作者已将五子棋
60. 围棋SGF棋谱阅读器 V1.01
一个轻便的围棋SGF棋谱阅读器。
61. 围棋死活习题集移动版之Symbian(s60)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
62. 围棋死活习题集移动版之PocketPC 2002版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
63. 围棋死活习题集移动版之Symbian(S90)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
64. 围棋死活习题集移动版之HandheldPC(SH4)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
65. 围棋死活习题集移动版之PalmsizePC(SH3)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
66. 围棋死活习题集移动版之PocketPC (ARM)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
67. 围棋死活习题集移动版之Symbian(s80)版 1.00
随时随地享受围棋的乐趣。围棋死活习题集收集了1200多道精妙的死活题。想提高棋力,做
68. 围棋定式详解 2.0
定式详解包含了几乎所有常用定式,带有详细的解说。你也可以随时进入研究模式自己再琢
dl.pconline.com.cn/html/1/0/dlid=6300dltypeid=1pn=0.html
69. MultiGo 围棋棋谱软件 2.2.8
为功能强大的围棋打谱软件。全面支持 SGF 文件格式,并能读 BDX (清风)及 NGF (新
dl.pconline.com.cn/html/1/4/dlid=10484dltypeid=1pn=0.html
70. 弈缘围棋 1.81完全版
一个集“棋谱管理”和“网上对弈”于一身的围棋软件。
dl.pconline.com.cn/html/1/9/dlid=1169dltypeid=1pn=0.html
71. 围棋名局精解 1.21
带详细解说的名局棋谱, 容量比传统出版物大多了。
dl.pconline.com.cn/html/1/3/dlid=5613dltypeid=1pn=0.html
72. 死活习题集 2.0
围棋死活习题集收集了1500 道精妙的死活题,难度从出学者到接近专业棋手水平。想提高
dl.pconline.com.cn/html/1/1/dlid=5631dltypeid=1pn=0.html
73. 围棋助手 8.74
围棋助手是一个专业的围棋工具软件,它具有对局、打谱、在谱中推演变化、研究定式、输
dl.pconline.com.cn/html/1/6/dlid=6146dltypeid=1pn=0.html
74. 围棋和五子棋控件 V1.6.166
75. 围棋定式详解 V3.0
76. 围棋SGF棋谱阅读器 V1.01
77. 弈缘围棋 V1.81 完全版
78. 围棋大师
79. 多面围棋
80. 新浪围棋客户端软件 NEW
81. 围棋助手光盘版 V8.40d
82. 喜玛拉雅围棋谱 V19.0
83. 围棋助手 V8.76
84. 喜玛拉雅围棋谱 V18.0
download.winzheng.com/SoftView/SoftView_18249.htm
85. 弈缘围棋 V1.81 完全版
download.winzheng.com/SoftView/SoftView_6557.htm
86. 围棋助手 V8.74
download.winzheng.com/SoftView/SoftView_246.htm
87. 围棋打谱程序 V1.0
download.winzheng.com/SoftView/SoftView_22371.htm
88. 网络围棋 V1.10
download.winzheng.com/SoftView/SoftView_19146.htm
89. 3D Reversi Deluxe 3D 围棋 V1.0
download.winzheng.com/SoftView/SoftView_19367.htm
90. 围棋定式详解 V3.01
91. 蓑衣围棋 2.0
92. 围棋助手简体版本 8.30
93. 围棋定式详解 2.0
94. 蓑衣围棋 2.5
95. 围棋死活习题集 3.0
96. Go81 随身围棋 V1.3
;word=围棋site=allby=jsnum=265
求JAVA人机对战五子棋代码。。
人机的没有,不过自己打自己的有。
------------------------------
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
class mypanel extends Panel implements MouseListener
{
int chess[][] = new int[11][11];
boolean Is_Black_True;
mypanel()
{
Is_Black_True = true;
for(int i = 0;i 11;i++)
{
for(int j = 0;j 11;j++)
{
chess[i][j] = 0;
}
}
addMouseListener(this);
setBackground(Color.BLUE);
setBounds(0, 0, 360, 360);
setVisible(true);
}
public void mousePressed(MouseEvent e)
{
int x = e.getX();
int y = e.getY();
if(x 25 || x 330 + 25 ||y 25 || y 330+25)
{
return;
}
if(chess[x/30-1][y/30-1] != 0)
{
return;
}
if(Is_Black_True == true)
{
chess[x/30-1][y/30-1] = 1;
Is_Black_True = false;
repaint();
Justisewiner();
return;
}
if(Is_Black_True == false)
{
chess[x/30-1][y/30-1] = 2;
Is_Black_True = true;
repaint();
Justisewiner();
return;
}
}
void Drawline(Graphics g)
{
for(int i = 30;i = 330;i += 30)
{
for(int j = 30;j = 330; j+= 30)
{
g.setColor(Color.WHITE);
g.drawLine(i, j, i, 330);
}
}
for(int j = 30;j = 330;j += 30)
{
g.setColor(Color.WHITE);
g.drawLine(30, j, 330, j);
}
}
void Drawchess(Graphics g)
{
for(int i = 0;i 11;i++)
{
for(int j = 0;j 11;j++)
{
if(chess[i][j] == 1)
{
g.setColor(Color.BLACK);
g.fillOval((i + 1) * 30 - 8, (j + 1) * 30 - 8, 16, 16);
}
if(chess[i][j] == 2)
{
g.setColor(Color.WHITE);
g.fillOval((i + 1) * 30 - 8, (j + 1) * 30 - 8, 16, 16);
}
}
}
}
void Justisewiner()
{
int black_count = 0;
int white_count = 0;
int i = 0;
for(i = 0;i 11;i++)//横向判断
{
for(int j = 0;j 11;j++)
{
if(chess[i][j] == 1)
{
black_count++;
if(black_count == 5)
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();
return;
}
}
else
{
black_count = 0;
}
if(chess[i][j] == 2)
{
white_count++;
if(white_count == 5)
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();
return;
}
}
else
{
white_count = 0;
}
}
}
for(i = 0;i 11;i++)//竖向判断
{
for(int j = 0;j 11;j++)
{
if(chess[j][i] == 1)
{
black_count++;
if(black_count == 5)
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();
return;
}
}
else
{
black_count = 0;
}
if(chess[j][i] == 2)
{
white_count++;
if(white_count == 5)
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();
return;
}
}
else
{
white_count = 0;
}
}
}
for(i = 0;i 7;i++)//左向右斜判断
{
for(int j = 0;j 7;j++)
{
for(int k = 0;k 5;k++)
{
if(chess[i + k][j + k] == 1)
{
black_count++;
if(black_count == 5)
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();
return;
}
}
else
{
black_count = 0;
}
if(chess[i + k][j + k] == 2)
{
white_count++;
if(white_count == 5)
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();
return;
}
}
else
{
white_count = 0;
}
}
}
}
for(i = 4;i 11;i++)//右向左斜判断
{
for(int j = 6;j = 0;j--)
{
for(int k = 0;k 5;k++)
{
if(chess[i - k][j + k] == 1)
{
black_count++;
if(black_count == 5)
{
JOptionPane.showMessageDialog(this, "黑棋胜利");
Clear_Chess();
return;
}
}
else
{
black_count = 0;
}
if(chess[i - k][j + k] == 2)
{
white_count++;
if(white_count == 5)
{
JOptionPane.showMessageDialog(this, "白棋胜利");
Clear_Chess();
return;
}
}
else
{
white_count = 0;
}
}
}
}
}
void Clear_Chess()
{
for(int i=0;i11;i++)
{
for(int j=0;j11;j++)
{
chess[i][j]=0;
}
}
repaint();
}
public void paint(Graphics g)
{
Drawline(g);
Drawchess(g);
}
public void mouseExited(MouseEvent e){}
public void mouseEntered(MouseEvent e){}
public void mouseReleased(MouseEvent e){}
public void mouseClicked(MouseEvent e){}
}
class myframe extends Frame implements WindowListener
{
mypanel panel;
myframe()
{
setLayout(null);
panel = new mypanel();
add(panel);
panel.setBounds(0,23, 360, 360);
setTitle("单人版五子棋");
setBounds(200, 200, 360, 383);
setVisible(true);
addWindowListener(this);
}
public void windowClosing(WindowEvent e)
{
System.exit(0);
}
public void windowDeactivated(WindowEvent e){}
public void windowActivated(WindowEvent e){}
public void windowOpened(WindowEvent e){}
public void windowClosed(WindowEvent e){}
public void windowIconified(WindowEvent e){}
public void windowDeiconified(WindowEvent e){}
}
public class mywindow
{
public static void main(String argc [])
{
myframe f = new myframe();
}
}
系统框图如下 java实现五子棋程序 可以实现人人对战 人机对战 简单功能 悔棋 认输
一、实验题目
五子棋游戏。
二、问题分析
五子棋是双人博弈棋类益智游戏,由围棋演变而来,属纯策略型。棋盘通常15*15,即15行,15列,共225个交叉点,即棋子落点;棋子由黑白两色组成,黑棋123颗,白棋122颗。游戏规则为黑先白后,谁先五子连成一条直线谁赢,其中直线可以是横的、纵的、45度、135度。
本次Java编程我的目的是现实人机对战,即游戏者一方是人,另一方计算机。这就要求程序不仅要具备五子棋的基本界面,还要编程指导计算机与人进行对弈。为了使程序尽可能智能,我采用了贪心策略、传统搜索算法、极大极小博弈树算法,对应游戏玩家的3个等级:简单、中等、困难。
三、功能设计
我的程序基本功能是实现人机对弈五子棋。人和电脑交替下棋,谁先五子连成一条直线谁就赢。下面是我程序的功能模块:
1.等级设置
核心功能是实现不同策略与算法的对比运用,纯贪心策略实现简单等级对手,直接搜索算法实现中等等级对手,极大极小博弈树算法实现困难等级对手。对应程序中的3选1单选按钮。
2.悔棋功能
模拟栈机制实现人悔棋,不限步长的悔棋。对应程序中的悔棋按钮。
3.棋面绘制
根据不同机计算机的屏幕分辨率,绘制逼真的棋盘。
4.图片引入
两张古典的人物图片,生动模拟对弈双方。人物图片旁的黑白棋钵图片显示黑白棋归属。
5.背景设置
支持用户选择背景,包括棋盘、棋盘边框、窗口边框,彰显个性。
6.音乐播放
下棋时有棋子落地的声音,一方胜利时有五子连成一片的声音。同时在设置背景时相应的改变整个对弈过程中的背景音乐。
7.时间显示
在棋盘正上方有一模拟文本框显示当前棋局用时。
8.其他小功能
支持和棋、认输、开启新游戏、退出游戏等操作。
四、数据结构与算法设计
数据结构部分
1.当前棋局的存储结构
我的五子棋程序选择通常用到的15行*15列棋盘,可以开二维数组PositionFlag = new int[15][15],PositionFlag[i][j]为0表示(i,j)点尚无棋,为1表示(i,j)点是人的棋子,为2表示(i,j)点是机器的棋子。之所以选择二维数组,主要原因有两点:
1.本程序需要频繁随机访问15*15的交叉点,对应查询该点状态以及改变该点状态,随机访问是数组的特点。
2.15*15=225开二维数组的内存需求相对现在内存为2G及以上的计算机完全可以接受,且数组实现简单、操作方便。
基于以上两点,尽管创建动态的顺序表—链表可能可以节省少量内存(可以只存当前有棋的点,原数组对应位置为0的点可以不存),但选择数组的优势完全在上述两点体现了出来。
2.实现悔棋操作的数据结构
由于每次悔棋只需回退当前几步,后进先出原则,这正是栈这种典型数据结构的设计思想,于是我选择栈。我自己先写了用自定义数组模拟的栈,但由于是学Java语言且由于悔棋的存储空间需要随当前步数增大而增大(由于每局最多下225步,即最多要悔225步,所以自己开个225的数组完全可以避免存储空间自增长的问题且内存完全可以接受,之所以不用自定义数组而用ArrayList类主要是为了尝试Java中STL的用法),所有我最终改为用Java类库中的ArrayList类。
确定用ArrayList类实现栈机制后就必须考虑每个ArrayList单元具体存储什么。刚开始我存储的是当前的棋局,即整个局面,而每个局面对应一个二维数组,这样是很占用内存的。试想一下,在最坏情况下,225个ArrayList单元,每个单元存放一个15*15的二维数组,尽管225*15*15在Java的内存管理机制下不会爆栈,但也是极不划算的。之所以说不划算,是因为有更好的解决方案。由于每次悔棋只是在回退倒数一步,多步悔棋只需循环回退,所以可以只存储当前棋局最后一步的下法,对应一个二维点,完全可以自定义一个二维坐标类chessOneStep。
算法设计部分
Java语言是面向对象的语言。我在进行五子棋游戏编程是总共传创建了11个自定义的类。在编写程序的过程中,我有一个明显的体验就是面向对象编程就是一项有关对象设计和对象接口技术,很多关键的技术就是如何设计自定义的对象。
下面我先概括给出我的所有类的作用:
1.mainFrame类:主框架类,我应用程序的入口;
2.chessPositon类:主控类,这个类是我程序的核心类,负责控制双方的下棋,以及调用其他的类完成当前棋局的显示绘制;
3.chessPanel类:面板类,调用其他底层类完成当前棋局的显示绘制;
4.chessBoard类:棋盘绘制类,负责棋盘的绘制;
5.chessImage类:文件类,包含各种资源(背景图片、背景音乐)以及静态全局变量(public static Type);
6.chessButton类:组件类,定义各种组件,包括按钮、单选按钮、文本框等;
7.chessMusic类:音乐类,负责调用Java库类完成背景音乐、下棋音乐、取胜音乐等的播放;
8.chessPiece类:棋局类,定义棋局二维数组数据结构并完成相关操作;
9.chessList类:栈类,完成悔棋等操作;
10. chessOneStep类:棋子类,定义每步坐标以及下在该处获得的估价值;
11.myCompare类:排序类,完成chessOneStep类的自定义排序
详细设计
1.mainFrame类
作为我的五子棋程序的主类,mainFrame类主要实例化相关的对象,如chessbutton,chessborad等,从而完成框架的创建。更重要的是实例化chessposition,这是本程序的核心类,控制游戏双方行棋过程完成人机互动下棋,然后将MyChessPosition与鼠标响应addMouseListener()关联起来。
2.chessMusic类
一个好的游戏必须给人一种身临其境的感觉,而声音是营造这种氛围的重要因素。参照网上各游戏运行商的音乐配置,我选择相关逼真的声音。包括背景音乐、下棋棋子落到棋盘发出的声音以及一方胜出的配乐。所有这些功能的实现,依赖于自定义的chessMusic类,采用AudioInputStream配合Clip的方式完成音乐播放的软硬件工作,然后定义两个接口chessmusic(String Name)和Stop(),前者完成播放功能,后者完成关闭当前音乐功能。因为音频文件相对较大,而我的程序提供在不同背景乐之间切换的功能,所以在打开另一个音频文件之前必须关闭前一个正在播放的音频文件,防止出现溢出。
3.chessImage类
适当的动画或图片能给游戏玩家带来美的体验。所以我的五子棋程序界面在不失和谐的前提下引入了尽可能多的图片,包括对弈双方、棋钵等。图片引入的具体工作通过语句import javax.imageio.ImageIO完成。同时,由于图片要在用到它的类中被访问,为了避免频繁调用函数,我直接将图片相关联的对象定义为public static,表明是公用的、静态的。进一步引申开去,我将程序中用到的静态全局变量都定义在chessImage类中。具体如下:
public static Date begin;//每局开始时间
public static Date cur;//每局结束时间
public static chessOneStep LineLeft;//结束端点1
public static chessOneStep LineRight;//结束端点2
public static boolean IsGameOver;//是否只有一方获胜
public static int ColorOfBackGround[][]= {{255, 227, 132},{0,255,127},{218,165,32}};//背景颜色
public static int ColorOfWindows[][]= {{ 60,179,113},{245,245,245},{122,122,122}};//背景颜色
public static int WitchMatch;//背景搭配
public static String MusicOfBackGround;//背景音乐
public static int CurrentStep;//记录当前步数
public static int Rank;//设置难度等级
public static boolean IsSurrender;//判断是否认输
public static boolean IsTie;//判断是否认输
public static String Message;//输出提示信息
public static Image IconImage;// 图标
public static Image blackBoard;//白棋盘
public static Image whiteBoard;//黑棋盘
public static Image blackChess;// 白棋棋子图片
public static Image whiteChess;// 白棋棋子图片
public static Image RightPlayer;//白棋棋罐图片
public static Image LeftPlayer;//白棋玩家头像图片
public static String path = "src/";// 图片的保存路径
4.chessButton类
这个是程序的组件类。定义了各种功能键,完善程序功能,营造逼真的人机对战游戏效果。分为3类:效果。。
(1)、按钮组件
本程序有5个按钮,支持和棋、认输、新游戏、退出、悔棋等。认输和和棋按钮终止当前的棋局,给出相应的提示信息;退出按钮调用系统System.exit(0)的函数正常返回;悔棋按钮调用后面要介绍的chessList类实现悔棋;新游戏按钮则刷新当前棋局准备下一轮,要将记录当前棋局的二维数组全部置0,刷新当前棋局开始时间等。
(2)、单选按钮组件
游戏界面支持设置个性化界面,包括背景颜色与背景音乐,跟重要的一点是设置难度(简单、中等、困难)。单选按钮只能多选一。背景颜色主要是存储相关颜色搭配方案的RGB颜色,开2维数组,即对应RGB3原色数组的一维数组,然后通过改变WitchMatch全局变量的值来有用户自己选择颜色搭配,不同的颜色搭配对应不同的背景音乐表达一致的主题。难度设置主要是改变计算机的下棋算法,不同难度通过Rank判断进入不同的程序分支,实现不同智能等级的计算机下棋水平。
(3)、文本框
在不同的单选按钮前添加相应的文本框,提示用户可以实现的功能。同时我用颜色模拟出显示当前棋局耗用时间的文本框。
不论按钮还是单选按钮都要关联相应的消息,把相应功能的实现放在消息响应处理函数理。这些主要是实现Java库提供的消息响应接口里的方法。
5.chessPiece类
主要完成当前棋面的存储,存储棋面的数据结构为二维数组int[][] PositionFlag;然后定义获取、设置某点以及整个棋面的状态的方法。
(1)、SetPositionFlag(int x, int y, int flag)//设置(x,y)处的状态为flag
(2)、GetPositionFlag(int x, int y)//获取(x,y)处的状态
(3)、SetAllFlag(int [][]NewFlag)//设置当前整个棋面的状态为NewFlag
(4)、GetAllFlag()//获取当前整个棋面的状态
(5)、DrawChessPiece(Graphics g)//绘制当前局面的棋子
由于本类比较重要,所以附上了代码,见源代码1。
6.chessBoard类
功能为绘制棋盘线。由于围棋的棋盘比较复杂,横线、竖线较多,且为了使棋盘美观,还要自定义窗口边框、棋盘边框、对弈双方边框等,对线宽、线型也有一定要求。有时要单像素线条,有时要多像素线条。对于多像素线条,我主要用了2种方法。
方法一:
在需要绘制多像素线条处首先绘制一条单像素线,然后根据线宽要求上下平移适当像素达到绘制多像素的目的。这样的方法适合绘制水平线或竖直线,绘制其他斜率的线条容易造成走样。在没有想到比较好的反走样编程思想后我选择了调用Java库中已经封装好的函数。
方法二:
为了克服方法一绘制非水平或竖直线时造成的走样,同时也为了更进一步学习Java语言,我猜想肯定会有类似OpenGL中设置线宽的画刷,于是上网百度找到了相应的画刷Stroke类。通过Java库实现绘制不同线宽的直线,达到了反走样效果。
7.chessOneStep类
这个类是为了配合chessList类实现悔棋以及在计算机下棋算法实现返回有效状态点而设计的。主要数据成员为
private int x,y,weight;//其中x,y表示点坐标,weight表示将棋下到该点获得的估价值。
主要方法如下:
(1)、GetX()//获得当前对象的x坐标
(2)、GetY()//获得当前对象的y坐标
(3)、GetWeight()//获得当前对象的(x,y)处的估价值
8.chessList类
程序支持悔棋功能,为了实现悔棋,自定义了chessList类。这个类主要通过引入java.util.ArrayList和java.util.List实现集合的数据类型。然后自定义一些方法,如下:
(1)、AddStep(chessOneStep OneStep)//添加一步棋到List中
(2)、GetSize()//获得当前List的大小
(3)、ClearList()//清空List
(4)、RemoveLast()//删去List中的最后元素
由于每次删除当前List中的最后一个元素,实现后进先出,所以可以模拟栈的功能实现悔棋。
9.myCompare类
由于在计算机下棋的极大极小博弈树算法中需要对自定义对象chessOneStep按weight进行排序,所以引入了myCompare类,通过实现Comparator接口中的compare方法完成自定义对象排序。
10.chessPanel类
程序的自定义面板类,主要负责完成当前框架内容的显示。这是一个重要的与框架和图形显示密切相关的类。主要数据成员为
private chessboard MyChessBoard;//当前显示棋盘
private chesspiece MyChessPiece;//当前显示整个棋面的状态
主要方法如下:
(1)、chesspanel(chessboard MyChessBoard1, chesspiece MyChessPiece1)//构造函数,分别用MyChessBoard1和MyChessPiece1初始化MyChessBoard和MyChessPiece
(2)display(chessboard MyChessBoard1, chesspiece MyChessPiece1)//自定义显示回调函数,调用repaint()完成重新绘制游戏界面
(3)、paintComponent(Graphics g)//核心方法,调用各种函数完成具体的绘制工作
11.chessPositon类
程序算法核心类,总的功能是控制人和计算机轮流下棋,以及调用chessPanel类中的display(chessboard , chesspiece )方法完成界面的实时刷新。关于chessPositon类,我在此将重点介绍。chessPosition类的主要数据成员如下:
private static chessboard MyChessBoard;//当前显示棋盘
public static chesspiece MyChessPiece;//当前显示整个棋面的状态
private static chesspanel Mychesspanel;////当前显示面板
public static chesslist MyChessList=new chesslist();//当前下棋集合,用于悔棋
final private static int INF = (1 30); // 表示正无穷大的常量,用于极大极小博弈数搜索算法
public static boolean CanGo;//控制当前下棋一方
类的设计集中体现在成员方法的设计上。实现人机对战,只有语言是远远不够的,还要加入算法,用算法引导计算机下棋。下面介绍该类的方法成员:
(1)、chessposition(chesspanel , chessboard ,chesspiece ) //带有参数的构造函数
(2)、chessposition()
不带参数的构造函数
(3)、mouseClicked(MouseEvent event)
鼠标响应函数,负责人的下棋,根据鼠标点击的位置转换得到所在棋盘的相对位置。如果该位置不合法,即超出棋盘有效范围,点击无响应;如果该位置上已有棋,弹出消息框给出提示。这二者都要求重新给出下棋位置,即当前鼠标响应无效…直到点击到棋盘有效区域。
(4)、IsOver(int[][] Array,int x,int y)
判断当前int[][]Array对应的棋局是否结束,即一方五子连成一条直线。此处有两种思路,一种对当前棋面上的所有棋子都进行一次判断,具体为水平方向、竖直方向、与水平线成45度方向、与水平线成135度方向,只要有一个方向五子连成一条直线就说明有一方获胜,游戏结束;另一种思路为只在当前下棋的4个方向进行判断,我的程序采用的是第二种,所以IsOver方法除了int[][]Array参数外,还有x,y参数,(x,y)表示当前下棋的坐标点。
(5)display()
通过调用自定义面板类的显示回调函数用于重新显示游戏界面,达到每下一步棋及时更新游戏界面的目的。
(6)、GetValue(int flag, int num)
估值函数,根据经验把棋局分成只有1颗棋相连,2颗棋相连且两端被封死,2颗棋相连且一端封死另一端活的,2颗棋相连且两端都是活的,同理3颗棋、4颗棋也各自可分3种情况。不同的情况对应不同的估价值。估价值的设定是决定计算机一方是否智能的一个关键因素。
(7)、GetPredictValue(int flag, int num)
对未连成一片但通过再下一颗子就能连成一片的局面进行估值,这在双方下棋的有限步骤内是能产生重要影响的。如果每局棋仅考虑当前一步,是不可取的。
(8)、Evaluate(int[][] Array, int x, int y)
根据棋面具体情况以及预先设定的估值函数,对某个点对应的局面进行评估。由于每次双方只能下一颗棋,所以可以每次取当前局面的所有点中对应估值最大值点的估值作为整个局面的估值。
(9)、GetGreedNext()
计算机下棋方法1,对应难度等级为简单,采用贪心思想。每次下棋前在求得最有利点下棋,而是否最有利只是通过一步评估。算法伪码描述为:
Max取负无穷大
for(行i从0到15)
{
For(列j从0到15)
{
If((i,j)对应的位置无棋)
{
a.假设放上一颗由人控制的棋,求估价值;
b.假设放上一颗由计算机控制的棋,求估价值;
c.取二者中较大值作为(i,j)处的估价值tmp;
d.取tmp与Max较大值赋值给Max.
}
}
}
最终Max对应的点就是当前整个局面中最大的估值点。至于上述为什么要考虑双方都在该点下棋的情况呢?主要原因为下五子棋是个攻防兼备的过程,不仅要考虑自己对自己最有利,还要考虑对对手最不利,通俗来讲就是在自己赢的时候不能让对手先赢。
(10)、GetSearchNext(int LookLength)
derectSearch(int [][]Array,boolean who,int deepth)
计算机下棋方法2:直接搜索法,对应难度等级为中等。
每步棋最多有225个不同下法,若采用直接搜索法则对应的孩子节点有225个(在下棋过程中会逐渐减少),即每层有最多225个节点待扩展,这就决定了直接搜索进行不超过2次—主要原因有两点:
a.采用深度优先搜索需要递归,递归中状态过多可能会爆栈,我们知道递归是用栈机制来实现的;采用宽度优先搜索又需要存储为扩展的节点,这对内存容量要求很高。
b.不管深搜还是广搜,在时间复杂度为O(N^m)的情况下都是不能接受的。其中N为当前棋局的待扩展节点,最大225;m为搜索的深度。
综上所述,在采用直接搜索法时搜索深度不能太深,严格来说是应该控制在2层以内,在计算机运算速度在10^7次每秒的情况下,理论和实验都表明超过2层就会变得很慢且这种趋势成指数级增长。
直接搜索算法伪代码为
GetSearch(boolean flag,int deep)
{
如果deep等于0,返回当前棋局估值;
for(行i从0到15)
{
For(列j从0到15)
{
If((i,j)对应的位置无棋)
{
如果轮到计算机下棋,置标志位为2
GetSearch(!flag,deep-1);
如果轮到人下棋,置标志位为1;
GetSearch(!flag,deep-1);
}
}
}
}
(11)、GetMinMaxsearchNext(int LookLength)
MinMaxsearch(int [][]Array,boolean who, int deepth)
计算机下棋算法3:极大极小博弈树法,对应难度等级为困难。五子棋是个博弈游戏,当前在寻找对自己最有利的下棋点时要尽可能保证对对手最不利,这种思想可以用极大极小博弈树
关于java四子棋人机对战和五子棋人机对战的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。
发布于:2022-12-23,除非注明,否则均为
原创文章,转载请注明出处。