学号:888888888888 毕业设计论文
题目:基于C语言或JAVA语言
实现的五子棋游戏
专业:软件技术
班级: ********
学生姓名: ******
导师姓名: ******
起止时间:2010年9月至 2010年11月
******计算机学院
摘要
五子棋,是一种两人对弈的纯策略型棋类游戏,亦称“串珠”、“连五子”;是中国民间非常熟知的一个古老棋种。相传,它起源于四千多年前的尧帝时期,比围棋的历史还要悠久。
五子棋游戏容易上手,老少皆宜,而且趣味横生,引人入胜;它不仅能使人娱乐,也能够开发人的智力,而且富含哲理,有助于修身养性。
本文主要讲的是用Eclipse开发工具与Java开发语言开发的一个直观大方的自定义界面的带部分AI功能的五子棋游戏,游戏程序实现人机对弈和人人对弈,自动智能计算最佳落子位置,而且程序能够自动的判定游戏的获胜方和游戏的结束与否,实现对战双方顺利进行博弈。
关键词:Eclipse 游戏 Java 人机对弈五子棋
Abstract
Gobang is a two-type board game of pure strategy, also known as ",beads", and "even five sons" is a very well-known Chinese folk kind of an old chess. According to legend, it originated in the period of four thousand years ago, Emperor Yao, but also a long history of more than chess.
Gobang easy to use, all ages, and amusing, fascinating; it not only makes fun, but also to develop human intelligence, and rich in philosophy will help self-cultivation.
This article is primarily concerned with the Eclipse development tools and java programming language developed an intuitive interface and generous custom backgammon game, chess games and everyone to achieve human-computer chess, the program can automatically determine the winner the game and the game the end or not, the two sides to achieve Battle Game.
Key words: Eclipse Games Java Human chess Gobang
目录
摘要 (2)
前言 (4)
1概述 (5)
1.1程序开发语言 (5)
1.2开发平台 (5)
1.2.1开发环境 (5)
1.2.2运行环境 (5)
2开发设计 (6)
2.1概要设计 (6)
2.1.1流程图: (6)
2.1.2功能分析: (7)
2.2详细设计 (7)
3功能测试及运行效果 (13)
3.1游戏主界面 (13)
3.2游戏落子控制界面 (13)
3.3游戏输赢判定控制界面 (14)
3.4结论 (14)
3.5几点补充说明 (15)
总结 (16)
致谢 (17)
参考文献 (18)
前言
计算机已经深入到人们日常工作和生活的方方面面,各程序软件也逐渐进入大众的视野,并开始影响人们的工作生活,与计算机相关的产业进入快速发展期。
作为一名学生,特别是软件技术专业的程序编程学生,在系统的学习了一些编程语言之后,更加觉得自己应该多动手编程,做实训项目。不进行实际的操作,很难在编写程序上有进步!编写自己的软件,即使是小程序,你也会向前迈进一大步。我个人比较喜欢Java,可以说我通过这次设计,把所学的各项技能很好的整合在一起。又一次感受到了编程的乐趣,从中也学到了不少知识技巧,向前迈进了一大步!
1概述
程序开发选用功能强大的Eclipse开发工具和SUN公司的jdk-6u20-windows,其中Eclipse 是一个开源的、基于 Java 的可扩展开发平台,它是辅助开发一个框架和一组服务,用于通过插件组件构建开发环境。而且Eclipse 附带了一个标准的插件集,包括 Java 开发工具(Java Development Tools,JDT),更有利于程序开发。
1.1程序开发语言
Java是一种简单的,跨平台的,面向对象的,分布式的,解释的,健壮的安全的,结构的中立的,可移植的,性能很优异的多线程的,动态的语言。当1995年SUN推出Java语言之后,全世界的目光都被这个神奇的语言所吸引!
Java语言的强大是我选择这门语言的主要原因,当然我个人也对Java比较感兴趣。
1.2开发平台
1.2.1开发环境
通过Eclipse可扩展开发平台编辑系统程序,因为用功能强大的开源工具Eclipse来开发,相对较为方便,eclipse比较通用,而且支持很多插件,大大的减少工作量。然后再通过jdk-6u20-windows编译运行程序,这样开发的程序比较好。
1.2.2运行环境
能够正常使用的Windows XP,对系统配置的要求不是很高,中等的电脑配置都可以很好的运行了,当然高配置效果会更好。安装了Java的开发平台 Java 2 Standard Edition (J2SE),带运行环境(JRE),并能正常使用,就能够正常运行,如果安装了Eclipse那就更好。
2开发设计2.1概要设计
2.1.1流程图:
2.1.2功能分析:
程序主窗体设计简洁得体,布局合理,五子棋游戏的基本功能齐全。
菜单中的“新游戏”能够实现五子棋游戏开始、清盘,当玩家不想玩该局时可以点击该项重新开始。
游戏默认模式为人机对弈,可以手动更改对弈模式,点击游戏-模式可以实现更改对弈模式。游戏默认为黑棋先下!
游戏人机对弈能够实现每一步都通过AI计算最佳落子位置,然后做出相应的操作,玩家要赢有难度!
程序有很好的退出关闭功能。
程序编程规范,具有良好的编程风格。
2.2 详细设计
整个程序创建建了两个类WZQ类和MainPanel类,主要是通过WZQ类实现,MainPanel类辅助控制来达到预期目的。
⑴ WZQ类继承JFrame并且实现监听,创建类方法WZQ(),且通过类方法加载各组件并显示于窗体上。然后调用MainPanel创建[15×15]棋盘。关键代码:
panel = new MainPanel[15][15];
for (int i = 0; i < panel.length; i++)
for (int j = 0; j < panel[i].length; j++) {
panel[i][j] = new MainPanel();
centerPanel.add(panel[i][j]);
panel[i][j].addMouseListener(this);
}
⑵判断输赢模块public void isWin(MainPanel panel[][]) {},联系到各个模块,它是判定控制模块,凸显重要性。判断是否有一方已经取胜,再执行下一步操作。关键代码:
int i, j, sum_chess;
for (i = 0; i < panel.length; i++)
// 判断每一行是否有五个黑子或白子连在一起
for (j = 0; j < panel[i].length - 4; j++) {
sum_chess = panel[i][j].chess + panel[i][j + 1].chess
+ panel[i][j + 2].chess + panel[i][j + 3].chess
+ panel[i][j + 4].chess;
if (sum_chess == 5) {
// 如果是有5个白子连在一起,则显示白棋胜利的提示框
dia1.setVisible(true);
addComputer = false;
} else if (sum_chess == -5) {
// 如果是有5个黑子连在一起,则显示白棋胜利的提示框
dia2.setVisible(true);
addComputer = false;
}
}
⑶整个系统最为关键的控制模块为判定执行AI(人机对弈)模块:public void computerDo(MainPanel panel[][]) {},它是系统AI的核心。它是通过准确的判定,四子相连,三子相连,两子相连,一个棋子,得出最佳落子位置,再执行落子操作!关键代码:
for (i = 0; i < panel.length; i++)
// 判断电脑的白子在一行上是否有四个相连
for (j = 0; j < panel[i].length - 3; j++) {
sum_chess = panel[i][j].chess + panel[i][j + 1].chess
+ panel[i][j + 2].chess + panel[i][j + 3].chess;
if (sum_chess == 4) {
start_x = i;
start_y = j - 1;
end_x = i;
end_y = j + 4;
if (panel[start_x][start_y].chess == 0) {
panel[start_x][start_y].computer_do = true;
panel[start_x][start_y].repaint();
isDo = true;
dia1.setVisible(true);
System.out.println("
判断电脑的白子在一行上是否有四个相连的");
break;
} else if (panel[end_x][end_y].chess == 0) {
panel[end_x][end_y].computer_do = true;
panel[end_x][end_y].repaint();
isDo = true;
dia1.setVisible(true);
System.out.println("
判断电脑的白子在一行上是否有四个相连的");
break;
}
}
}
⑷严格的条件控制,防止程序达不到预期目的。关键代码:
if (!isDo) {
for (i = 0; i < panel.length - 3; i++)
// 判断每一列是否有四个电脑的白子连在一起
for (j = 0; j < panel[i].length; j++) {
sum_chess = panel[i][j].chess + panel[i + 1][j].chess
+ panel[i + 2][j].chess + panel[i + 3][j].chess;
if (sum_chess == 4) {
start_x = i - 1;
start_y = j;
end_x = i + 4;
end_y = j;
if (panel[start_x][start_y].chess == 0) {
panel[start_x][start_y].computer_do = true;
panel[start_x][start_y].repaint();
isDo = true;
dia1.setVisible(true);
System.out.println("
判断电脑的白子在一列上是否有四个相连");
break;
} else if (panel[end_x][end_y].chess == 0) {
panel[end_x][end_y].computer_do = true;
panel[end_x][end_y].repaint();
isDo = true;
dia1.setVisible(true);
System.out.println("
判断电脑的白子在一列上是否有四个相连");
break;
}
}
}
}
⑸弹出信息控制项。关键代码:
if (e.getSource() == button1) {
dia1.setVisible(false);
new WZQ();
frame.setVisible(false);
// 刷新屏幕,防止开始游戏时出现无法显示的情况.
this.repaint();
}
else if (e.getSource() == button2) {
dia2.setVisible(false);
new WZQ();
frame.setVisible(false);
// 刷新屏幕,防止开始游戏时出现无法显示的情况.
this.repaint();
}
⑹菜单信息控制项。关键代码:
else if (e.getSource() == newgame) {
new WZQ();
frame.setVisible(false);
// 刷新屏幕,防止开始游戏时出现无法显示的情况.
This.repaint();
}
else if (e.getActionCommand().equals(“退出”)){
System.exit(0);
}
else if (e.getActionCommand().equals(“人人对弈”)){
addComputer = false;
}
else if (e.getActionCommand().equals(“版本信息”)){
dia3.setVisible(true);
}
⑺ MainPanel类为辅助控制类,主要有该哪方落子和画棋子,关键代码:super.paintComponent(g);
this.setBackground(Color.lightGray); if (person_do || computer_do) {
if (mark == 0) {
g.setColor(Color.BLACK);
g.fillOval(4, 4, 15, 15);
chess = -1;
mark = 1;
} else if (mark == 1) {
g.setColor(Color.WHITE);
g.fillOval(4, 4, 15, 15);
chess = 1;
mark = 0;
}
}
3功能测试及运行效果3.1游戏主界面
图3-1 系统主窗口
点击菜单“游戏”,出现如上游戏界面。
3.2游戏落子控制界面
图3-2 落子情况
开始游戏后落子控制情况
3.3游戏输赢判定控制界面
图3-3 输赢判定
游戏落子输赢判定控制情况
3.4结论
程序运行正常,各项功能正常,整个系统达到预期目的。不足之处程序AI 计算落子边界控制做得不够好,有待改善!
3.5几点补充说明
●考虑到程序的执行效率,人机对弈算法只对玩家的棋子进行了一步的推
测。
●计算机在落子时选取的是最佳的落子位置,所以如果玩家需要开动脑筋
考虑清楚该在哪里落子,不然难有机会获胜!
●人机对弈这个算法的开销很大,每一步落子都会考虑棋盘布局,又考虑
对手的落子,从而达到步步为营的目的。
●程序还有很多地方需要完善,例如:人机对弈边界处理不是很好,有待
完善;还可以开发为网络对战游戏及完善游戏相关功能。
总结
通过编写这个程序,我体会最为深刻的一点是系统架构和设计模式的重要性。即使是对于一个再小的程序,你已经做过但忘了的,再做一次又何妨,代码的组织和系统架构都是非常重要的,还因为这关系到日后的维护以及扩展。
在开始编写这个程序的时候,我很模糊,没有什么头绪,实在编写不下去了。后来经过我详细了解,参阅相关资料,询问老师同学后,才慢慢做下来,坚持下来。分析五子棋算法,把代码的有效地组织,即系统架构,然后开发出这个简单的五子棋程序。
设计这个程序之后,我感觉自己不仅实际动手能力有所提高,更重要的是进一步激发了我对专业知识的兴趣,是理论与实际得到一次很好的结合,并能够结合实际存在的问题在专业领域内进行更深入的学习。
对于我们计算机专业的学生来说,实际能力的培养至关重要,而这种实际能力的培养单靠课堂教学是远远不够的,必须从课堂走向实践。只有通过企业式的实训,才会了解工作需要什么,自己要学什么。通过这次程序设计,使我了解自身状况与实际需要的差距,并在以后的学习期间及时补充相关知识,从而走上程序开发的专业道路。
致谢
这次毕业设计的开发过程中,我特别感谢我的指导老师和我的同学好友对我的支持鼓励和好心帮助。在这次开发过程中,我了解了许多有关程序员应该具备相关专业知识,使我了解自身状况与实际需要的差距,知道自己要学的知识,清楚地认识到自己努力的方向。我再次感谢你们!
参考文献
[1] 耿祥义、张跃平.Java 2实用教程(第三版)[M].北京:清华大学出版社,2006
[2] 刘宏.实用Java程序设计[M]. 北京:清华大学出版社,2007
[3] 孙芳.Java经典实例(第二版)[M] 北京:中国电力出版社2009
毕业设计(论文)诚信声明书
本人声明:本人所提交的毕业论文《
》是本人在指导教师指导下独立研究、写作的成果,论文中所引用他人的无论以何种方式发布的文字、研究成果,均在论文中加以说明;有关教师、同学和其他人员对本文的写作、修订提出过并为我在论文中加以采纳的意见、建议,均已在我的致谢辞中加以说明并深致谢意。
本论文和资料若有不实之处,本人承担一切相关责任。
论文作者:(签字)时间:年月日指导教师已阅:(签字)时间:年月日
****** 计算机学院
毕业设计(论文)任务书
注:本任务书一式两份,一份交系保存,一份学生自己保存,毕业设计(论文)完成时按规定装订到毕业设计(论文)中;“研究报告型”或“开发文档型”或“开发设计型”栏目中用“√”标注。