攀枝花学院课程业设计
五子棋
学生姓名:
学号:
所在院(系):数学院计算机学院
专业:信息与计算科学
指导教师:讲师
二?##年六月
攀枝花学院教务处制
攀枝花学院本科学生课程设计任务书
注:任务书由指导教师填写。
课程设计(论文)指导教师成绩评定表
摘 要五子棋作为一类棋类竞技运动,现在很流行,很多人把它作为一类开发智力的一种游戏,锻炼人的思维。这次课题主要是完成人机对战,在对战中电脑根据人的思维做出相应的反应,电脑对战中通过深度的搜索,使得自身有更大的胜算,估值计算也是一种方法,可以提高电脑的智能度。分析模块中影响智能的因素也不少,通过节点比较与节点连接后的结果做出估计提高智能,了解递归算法、电脑学习等对此有很大帮助。算法是程序的灵魂,一旦算法正确那么程序将很好。不同的人工智能将会有不同的帮助,多去了解将更能提高智能程度。五子棋是我国的一门文化,这将使得它更受世界人们的欢迎。有助我国文化发展。
关键词 五子棋,智能,算法,模块,人机对战
目录
1 需求分析..................................................................... 1
1.1需求来源.................................................................... 1
1.2设计目的.................................................................... 1
2 功能需求分析................................................................. 1
2.1功能需求.................................................................... 1
3 设计与实现................................................................... 2
3.1设计思想.................................................................... 2
3.2系统模块结构................................................................ 2
3.3流程图...................................................................... 2
4 概要设计..................................................................... 4
4.1抽象数据类型定义............................................................ 4
4.2程序包含模块................................................................ 4
4.3模块间关系.................................................................. 4
4.4系统功能实现................................................................ 4
5 模块设计..................................................................... 5
5.1主界面模块.................................................................. 5
5.2选择模块.................................................................... 5
5.3判断模块、.................................................................. 5
5.4显示模块.................................................................... 5
参 考 文 献.................................................................... 9
1需求分析
1.1需求来源
计算机在我们的生活中有越来越重要的角色,我们也越来越离不开计算机,计算机带给我们许多便利,学习好计算机知识已经是必不可少的一项技能了。特别是电子商务、电子邮件等,人工智能现在的热点方向,人们感叹计算机的高效是也感叹自己的聪明,人工智能现在是很好的以方面。
1.2设计目的
该软件为用户提供一个在Windows系统上运行的五子棋游戏小系统。应达到的目的是:建立人机对战的模块,可以机器思考如何应对。已达到提高智力的效果
设计出五子棋的游戏界面,创建对象可以在地图中站位,在每一步后计算机会自己运算自己的下一步,任何一方不可以越界,当一方达到五子是判断谁是胜利者,在过程中尽量使得游戏智能程度更高。
2功能需求分析
2.1功能需求
现在研究五子棋的算法已经很多了,比较经典的有递归、二叉树等,这也是很基础的,不同算法要求也不同,要求的能力也不同,每一种算法都是使得程序清晰明白,当五子相连就算胜利。故我们要理解中间过程。
每个代码实现功能也是不同的,有的是判断,有的是理解,有的是更好知道程序,程序在执行时我们可以知道哪里出错。哪里会有问题,修改便利。、在错误中学习,加强自己的基础知识与算法的能力。
3设计与实现
3.1设计思想
对五子棋进行模块合理需求分析后,在思考整体布局,首先是如何进行设计与开发的思维,在此基础上用图表画出大体的框架图,在进行合理的模块划分,并用框架图画出,在分模块实现。
总体思维:首先是整体的框架地图,在然后是游戏上的功能键设置,功能选项设计,在游戏开始后棋手与电脑的对战,在胜利的时候做出判断(即五子相连时可以有结束提示);关键是电脑部分要尽量智能,保证游戏价值。
3.2系统模块结构
系统模块结构:大概分为界面模块、功能模块、判断模块、主要也就是判断模块,在棋手或者电脑达到五子时给出正确的结果,及在开始前就要有功能选择,保证在功能选择部分设计。大体模块如下图。
3.3流程图
4概要设计
4.1抽象数据类型定义
(1)对界面设计,可以选择界面的大小。
publicChessFrame() {
界面的窗口设计}
(2)主要的框架设计和参数
publicJMenu makeMenu(Object parent, Object items[], Object target){
}
(3)判断分析
publicbooleanjudgeSuccess(intx,inty,booleanisodd){
是否五子相连
}
4.2程序包含模块
界面模块public ChessFrame()
{}界面窗口的大小选择,显示界面。
地图范围模块
publicvoidMapSize(intw,inth){
限制游戏者的游戏范围}
结束模块
publicbooleanjudgeSuccess(intx,inty,booleanisodd){
是否五子相连}
4.3模块间关系
4.4系统功能实现
要实现五子棋游戏关键是地图设计与功能设计,选择地图与谁先开始是一个关键,先要进行选择,进行后,要判断谁先达到五子,保证谁胜利。
5模块设计
5.1主界面模块
该模块主要是进行显示地图大小,限制地图的长与宽,保证游戏者的棋子不会超过范围,可以正常的进行游戏。
5.2选择模块
主要进行选择功能,选择地图的大小,游戏者谁先进行游戏。
5.3判断模块、
主要是判断谁先达到五子,判定达到五子的为胜利,在判断的过程中每一步都进行判断,一直到谁最先到五子相连,后一步都不可以。
5.4显示模块
就是界面显示的一部分,用于显示结果。
测试与运行
开始前的界面
功能选择
开始后的界面
最后的结果
结 论
通过这次设计,使我在java的运用有新的理解、java的选择应用、算法的设计及其实现等方面加深了对课程基本内容的理解。同时,在程序设计方法以及上机操作等基本技能和科学作风方面受到比较系统和严格的训练。
在此之前,我脑袋里面没有java思想,java在我心中就是对象的创建。当时就感觉好难,什么也不能做,但是真正接触后并没有想象的那么难,有什么不懂的上网去搜索,这是一个信息横流的世界,有google,baidu就没有不能解决的知识难题。在网上搜索点有关的资料后,然后再利用自己在课堂上所学的知识,与和我一组的同学讨论并且将所有内容连接起来,所有问题就迎刃而解。课程设计是以学生自学为主、指导教师指导为辅,认真、独立地完成课程设计的任务,有问题就要及时主动与指导教师沟通。在老师的悉心指导下和同学们的帮助下,使我顺利地完成了此次课程设计。所以,要特别感谢指导老师和各位同学,我相信这次课程设计将会是我以后不管是工作还是学习不可多得的经验。
参 考 文 献
[1]朱福喜.《Java语言程序设计》(第二版).科学出版社
[2]陈国君等.《Java程序设计基础》(第二版).清华大学出版社
[3] Deitel.《Java大学基础教程》(第六版).电子工业出版社
[4] MaryCampione.《Java语言导学》(第四版).机械工业出版社
[5] Y.Daniel Liang.《Java语言程序设计基础篇》(第六版). 机械工业出版社
[6] Kathy Sierra.《Head First Java》(第二版).东南大学出版社
package day17.gobang;
import java.util.Arrays;
public class GoBangGame {
public static final char BLANK='*'; public static final char BLACK='@';
public static final char WHITE='O';
public static final int MAX = 16;
private static final int COUNT = 5; //棋盘
private char[][] board; public GoBangGame() {
}
//开始游戏
public void start() {
board = new char[MAX][MAX];
//把二维数组都填充‘*’
for(char[] ary: board){
Arrays.fill(ary, BLANK);
} }
public char[][] getChessBoard(){
return board; }
public void addBlack(int x, int y) throws ChessExistException{ //@
//char blank = '*';
//System.out.println( x +"," + y + ":" + board[y][x] + ",//+ BLANK);
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子 board[y][x] = BLACK; return; }
throw new ChessExistException("已经有棋子了!");
}
public void addWhite(int x, int y) throws ChessExistException{
if(board[y][x] == BLANK){// x, y 位置上必须是空的才可以添棋子 board[y][x] = WHITE;
return;
} throw new ChessExistException("已经有棋子了!");
} //chess 棋子:'@'/'O'
public boolean winOnY(char chess, int x, int y){
//先找到y方向第一个不是 blank的棋子
int top = y; while(true){
if(y==0 || board[y-1][x]!=chess){
//如果y已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了 break;
} y--;
top = y; }
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0; y = top; while(true){
if(y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了 break;
} count++;
y++; } return count==COUNT; }
//chess 棋子:'@'/'O'
public boolean winOnX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子 int top = x; while(true){ if(x==0 || board[y][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了 break; }
x--;
top = x; }
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0; x = top;
while(true){
if(x==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了 break;
} count++;
x++; } return count==COUNT; }
//chess 棋子:'@'/'O'
public boolean winOnXY(char chess, int x, int y){
//先找MAX向第一个不是 blank的棋子 int top = y; int left = x; while(true){ if(x==0 || y==0 || board[y-1][x-1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了 break;
} x--; y--;
top = y; left=x; }
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0; x = left; y = top;
while(true){
if(x==MAX || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了 break;
} count++;
x++;搜索 y++; } return count==COUNT; }
//chess 棋子:'@'/'O'
public boolean winOnYX(char chess, int x, int y){
//先找到x方向第一个不是 blank的棋子
int top = y; int left = x;
while(true){ if(x==MAX-1 || y==0 || board[y-1][x+1]!=chess){
//如果x已经是棋盘的边缘, 或者的前一个不是chess
//就不再继续查找了 break;
} x++; y--; top = y;
left=x; }
//向回统计所有chess的个数,如果是COUNT个就赢了
int count = 0; x = left; y = top;
while(true){
if(x==0 || y==MAX || board[y][x]!=chess){
//如果找到头 或者 下一个子不是chess 就不再继续统计了 break;
} count++;
x--; y++; }
return count==COUNT; }
public boolean whiteIsWin(int x, int y) {
//在任何一个方向上赢了,都算赢
return winOnY(WHITE, x, y) ||
winOnX(WHITE, x, y) ||
winOnXY(WHITE, x, y) ||
winOnYX(WHITE, x, y); }
public boolean blackIsWin(int x, int y) {
return winOnY(BLACK, x, y) ||
winOnX(BLACK, x, y) ||
winOnXY(BLACK, x, y) ||
winOnYX(BLACK, x, y); }}