java课程设计报告.docx
《java课程设计报告.docx》由会员分享,可在线阅读,更多相关《java课程设计报告.docx(19页珍藏版)》请在冰豆网上搜索。
java课程设计报告
华北科技学院
课程设计说明书
班级:
网络B093姓名:
李金栋
设计题目:
单机版五子棋
设计时间:
2011.12.15至2012.1.5
指导教师:
黄江兰
评语:
_________________________________
_________________________________________
_________________________________________
_________________________________________
_________________________________________
评阅成绩:
____评阅教师:
_____
目 录
1引言1
1.1课程设计选题1
1.2课程设计的目的1
1.3本选题的设计背景1
2需求分析1
2.1功能需求1
2.2系统的开发运行环境1
3总体设计2
3.1系统体系结构设计2
3.2系统功能模块及主要类设计2
4详细设计与实现3
4.1主窗体模块3
4.2棋子索引模块9
4.3棋盘构造模块10
4.4画棋盘模块12
4.5鼠标按下模块14
4.6判断胜利算法模块15
4.7重新开始和悔棋算法模块16
5小结和展望18
参考文献19
附录19
使用说明书19
源程序清单19
1
正文采用宋体字,小四号,1.5行距,首行缩进二个字。
引言
1.1课程设计选题
《单机版五子棋》
1.2课程设计的目的
使学生巩固和加深以Java语言为基础的面向对象编程技术理论知识的理解,提高实际动手编程能力的培养,掌握以Java为核心的应用软件开发方案,达到能独立阅读、编制和调试一定规模的Java程序的水平。
1.3本选题的设计背景
描述为什么选择本题目?
五子棋是大家喜闻乐见的小游戏,规则简单,变化多端,非常有趣味性,
本选题的设计意义?
通过编写五子棋小游戏的程序,进一步锻炼java图形编程技巧和编写程序的能力。
需求分析
2.1功能需求
用户角度考察系统应具有哪些功能及非功能性需求。
这里实现了双人对下的五子程序,程序提供重新开局、悔棋功能,附加播放棋子落下的声音和胜利声音。
2.2系统的开发运行环境
本系统开发平台:
Java
本系统集成开发环境:
Eclipse
本系统运行环境:
windowsxp或以上版本
总体设计
3.1系统体系结构设计
系统的功能描述
程序是一个双人对战五子棋程序,提供下五子棋必须的悔棋、重新开始、退出等功能,兼播放声音。
b相关类设计
ChessBoard.java
包含ChessBoard的公共类,主要功能是绘制棋盘、棋子、判断输赢。
Point.java
包含名为Point的公共类,主要功能定义棋子颜色,获取索引。
StartChessJFrame.Java
包含StartChessJFrame的公共类,主要功能,显示主窗体界面,包括工具条面板,“重新开始”、“悔棋”、“退出”按钮。
菜单栏,“系统”菜单,“重新开始”、“悔棋”、“退出”菜单项;“帮助”菜单,“关于五子棋”、“关于作者”菜单项。
以上菜单项和按钮,均加监听器,实现对棋盘和窗口的控制。
令外,鼠标点击“退出”按钮或菜单项时弹出提示。
3.2系统功能模块及主要类设计
StartChessJFrame.java包含名为StartChessJFrame的pubilc类,主要用来显示主窗体界面,包括工具条面板,“重新开始”、“悔棋”、“退出”按钮。
菜单栏,“系统”菜单,“重新开始”、“悔棋”、“退出”菜单项;“帮助”菜单,“关于五子棋”、“关于作者”菜单项。
以上菜单项和按钮,均加监听器,实现对棋盘和窗口的控制。
令外,鼠标点击“退出”按钮或菜单项时弹出提示。
编写一个内部类MyItemListenerl来很监听按钮及菜单项单击事件。
编写Point类,包括棋子x/y索引及其颜色,定义相应的构造方法和get()函数。
编写ChessBoard类,设置棋盘背景颜色为橘黄色,然后在主框架中创建ChessBoard的对象,添加到主框架中。
编写paintComponent方法绘制棋盘。
在ChessBoard中创建Point[],然后在paintComponent绘制棋子数组。
为ChessBoard实现监听器MouseListener,覆盖相应的抽象方法,在构造方法中添加监听器(addMouseListener).。
编写mousePressed方法内容,预先定义isBlack表示下的黑棋还是白棋,PointCount表示当前棋子数。
将在mousePressed中获得的坐标转换成索引,在创建Point对象,添加到PointList中,在重新绘制。
添加相应判断:
不能画到棋盘外,下过的地方不可以在下。
(需要辅助方法findPoint).
添加声音播放代码。
游戏结束后,点击鼠标,不播放声音,一方胜利后,播放胜利音乐。
添加胜利判断isWin,添加标记变量GameOver。
在mousePressed方法最前面加入GameOver的判断,在mousePressed方法的最后调用isWin,返回true,则给消息提示,GamerOver设置为true。
isWin方法具体的编写。
在当前下棋的横向,纵向,两个斜向上分别判断是否有连续的同色五子。
详细设计与实现
4.1主窗体模块
1.功能设计
StartChessJFrame.java包含名为StartChessJFrame的pubilc类,主要用来显示主窗体界面,包括工具条面板,“重新开始”、“悔棋”、“退出”按钮。
菜单栏,“系统”菜单,“重新开始”、“悔棋”、“退出”菜单项;“帮助”菜单,“关于五子棋”、“关于作者”菜单项。
以上菜单项和按钮,均加监听器,实现对棋盘和窗口的控制。
令外,鼠标点击“退出”按钮或菜单项时弹出提示。
2.界面设计
包括菜单栏、棋盘、工具栏。
菜单栏含系统、帮助菜单。
系统菜单包含:
重新开始、悔棋、退出。
帮助菜单包含:
关于五子棋、关于作者。
工具栏包含按钮:
重新开始、悔棋、退出。
棋盘用于对战。
3模块算法(或重要代码段);
a下面的代码实现的是监听器,用于响应菜单项和按钮。
privateclassMyItemListenerimplementsActionListener{//事件监听器内部类
publicvoidactionPerformed(ActionEvente){
Objectobj=e.getSource();//取得事件源
if(obj==StartChessJFrame.this.startMenuItem||obj==startButton){
//重新开始
//JFiveFrame.this内部类引用外部类
System.out.println("重新开始...");
chessBoard.restartGame();
}elseif(obj==exitMenuItem||obj==exitButton){
intexit=JOptionPane.showConfirmDialog(null,"确认退出吗?
","",JOptionPane.YES_NO_CANCEL_OPTION);
if(exit==JOptionPane.YES_OPTION)
System.exit(0);//结束应用程序
}elseif(obj==backMenuItem||obj==backButton){//悔棋
System.out.println("悔棋...");
chessBoard.goback();
}elseif(obj==aboutMenuItem)
{JDialogjd=newJDialog(newStartChessJFrame(),"关于五子棋");
jd.setSize(200,200);
JLabell=newJLabel("player1vsplayer2,请2位轮流使用鼠标来下棋吧");
jd.add(l,BorderLayout.NORTH);
jd.setLocation(100,200);
jd.setSize(300,300);
jd.setVisible(true);
//jd.pack();
jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
}elseif(obj==authorMenuItem)
{JDialogjd=newJDialog(newStartChessJFrame(),"关于作者");
jd.setSize(200,200);
JLabell=newJLabel("*_*");
jd.add(l,BorderLayout.NORTH);
jd.setLocation(100,200);
jd.setSize(300,300);
jd.setVisible(true);
//jd.pack();
jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
}
}
b主窗体的构造方法
StartChessJFrame(){
setTitle("单机版五子棋");//设置标题
chessBoard=newChessBoard();//初始化面板对象
//创建和添加菜单
menuBar=newJMenuBar();//初始化菜单栏
sysMenu=newJMenu("系统");//初始化菜单
helpMenu=newJMenu("帮助");
startMenuItem=newJMenuItem("重新开始");
exitMenuItem=newJMenuItem("退出");
backMenuItem=newJMenuItem("悔棋");//初始化菜单项
aboutMenuItem=newJMenuItem("关于五子棋");
authorMenuItem=newJMenuItem("关于作者");
sysMenu.add(startMenuItem);
sysMenu.add(backMenuItem);
sysMenu.add(exitMenuItem);
helpMenu.add(aboutMenuItem);
helpMenu.add(authorMenuItem);
MyItemListenerlis=newMyItemListener();//初始化按钮事件监听器内部类
this.startMenuItem.addActionListener(lis);//将菜单项注册到事件监听器上
backMenuItem.addActionListener(lis);
exitMenuItem.addActionListener(lis);
aboutMenuItem.addActionListener(lis);
authorMenuItem.addActionListener(lis);
menuBar.add(sysMenu);//将系统菜单添加到菜单栏上
menuBar.add(helpMenu);
setJMenuBar(menuBar);//将menuBar设置为菜单栏
toolbar=newJPanel();//工具面板栏实例化
startButton=newJButton("重新开始");//三个按钮初始化
backButton=newJButton("悔棋");
exitButton=newJButton("退出");
toolbar.setLayout(newFlowLayout(FlowLayout.LEFT));//将工具面板按钮用FlowLayout布局
toolbar.add(startButton);//将三个按钮添加到工具面板上
toolbar.add(backButton);
toolbar.add(exitButton);
startButton.addActionListener(lis);//将三个按钮注册监听事件
backButton.addActionListener(lis);
exitButton.addActionListener(lis);
add(toolbar,BorderLayout.SOUTH);//将工具面板布局到界面"南"方也就是下面
add(chessBoard);//将面板对象添加到窗体上
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//设置界面关闭事件
setSize(800,800);
pack();//自适应大小
this.addWindowListener(newWindowAdapter(){
publicvoidwindowClosing(WindowEvente){
intexit=JOptionPane.showConfirmDialog(null,"确认退出吗?
","",JOptionPane.YES_NO_CANCEL_OPTION);
if(exit==JOptionPane.YES_OPTION)
System.exit(0);
}
});
4调试与测试
测试结果的分析与讨论,测试过程中遇到的主要问题及采取的解决措施。
下图是初步完成的界面,即未调用point类和ChessBoard类时的状况。
4.2棋子索引模块
位于Point.java
1主要功能
此功能对应Point.java文件,包含名为Point的public类,主要功能是获取棋子位置,定义棋子颜色。
2主要代码
importjava.awt.Color;
/*五子棋的棋子设计。
*/
publicclassPoint{
privateintx;//棋盘中的x索引
privateinty;//棋盘中的y索引
privateColorcolor;//颜色
publicstaticfinalintDIAMETER=30;//直径
publicPoint(intx,inty,Colorcolor){
this.x=x;
this.y=y;
this.color=color;
}
publicintgetX(){//拿到棋盘中的x索引
returnx;
}
publicintgetY(){//拿到棋盘中的Y索引
returny;
}
publicColorgetColor(){//得到颜色
returncolor;
}
}
4.3棋盘构造模块
位于ChessBoard.java
1功能设计
对应ChessBoard类的构造方法,主要功能设置棋盘边距,横竖线距离、棋子大小,将坐标转换成棋子的索引,并添加监听器,对棋子做相应的处理:
将坐标转换成索引,设置鼠标形状——指针型(指针在棋盘外和(x,y)坐标已有棋子时,这时不能下棋子。
),其余情况设置成手型。
2模块算法(或重要代码段);
a预先定义的变量
b棋盘构造方法。
publicChessBoard(){
setBackground(Color.ORANGE);//设置背景颜色为橘黄色
addMouseListener(this);//添加监听器
addMouseMotionListener(newMouseMotionListener(){//匿名内部类
publicvoidmouseDragged(MouseEvente){
}
publicvoidmouseMoved(MouseEvente){
intx1=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
//将鼠标点击的坐标位置转换成网格索引。
inty1=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
//游戏已经结束,不能下
//落在棋盘外,不能下
//x,y位置已经有棋子存在,不能下
if(x1<0||x1>ROWS||y1<0||y1>COLS||gameOver
||findChess(x1,y1))
setCursor(newCursor(Cursor.DEFAULT_CURSOR));//设置成默认形状
else
setCursor(newCursor(Cursor.HAND_CURSOR));//设置成手型
}
});
}
4.4画棋盘模块
位于ChessBoard.java
1功能设计
绘制棋盘,横竖各有11条线,121个交点。
底色橘黄黄色。
棋盘的边距30像素。
绘制白棋子和黑棋子,最后下的子用红色矩形标记。
2界面设计
3模块算法
//绘制
publicvoidpaintComponent(Graphicsg){
super.paintComponent(g);
//画棋盘
for(inti=0;i<=ROWS;i++){//画横线
g.drawLine(MARGIN,MARGIN+i*GRID_SPAN,MARGIN+COLS
*GRID_SPAN,MARGIN+i*GRID_SPAN);
}
for(inti=0;i<=COLS;i++){//画直线
g.drawLine(MARGIN+i*GRID_SPAN,MARGIN,MARGIN+i*GRID_SPAN,
MARGIN+ROWS*GRID_SPAN);
}
//画棋子
for(inti=0;iintxPos=chessList[i].getX()*GRID_SPAN+MARGIN;//网格交叉点的x坐标
intyPos=chessList[i].getY()*GRID_SPAN+MARGIN;//网格交叉点的y坐标
g.setColor(chessList[i].getColor());//设置颜色
g.fillOval(xPos-Point.DIAMETER/2,yPos-Point.DIAMETER/2,
Point.DIAMETER,Point.DIAMETER);
//标记最后一个棋子的红矩形框
if(i==chessCount-1){//最后一个棋子
g.setColor(Color.red);
g.drawRect(xPos-Point.DIAMETER/2,
yPos-Point.DIAMETER/2,Point.DIAMETER,
Point.DIAMETER);
}
}
4.5鼠标按下模块
1功能设计
是对所下的棋子进行处理,定义MousePress方法,预先定义isBlack表示下的是黑棋还是白棋,PointCount表示当前棋子数,添加相应的判断,不能画到棋盘外,下过的地方不能再下。
(需要辅助方法findPiont),然后将棋子的坐标转换成索引,在创建Point对象添加到PointList中,再重新绘制,当游戏没结束时,落子播放声音,当有一方胜利时,播放胜利音乐,弹出提示窗口。
2模块算法
publicvoidmousePressed(MouseEvente){//鼠标按键在组件上按下时调用。
//游戏已经结束,不能下
if(gameOver)
return;
StringcolorName=isBlack?
"黑棋":
"白棋";
xIndex=(e.getX()-MARGIN+GRID_SPAN/2)/GRID_SPAN;//将鼠标点击的坐标位置转换成网格索引。
yIndex=(e.getY()-MARGIN+GRID_SPAN/2)/GRID_SPAN;
//落在棋盘外,不能下
if(xIndex<0||xIndex>ROWS||yIndex<0||yIndex>COLS)
return;
//x,y位置已经有棋子存在,不能下
if(findChess(xIndex,yIndex))
return;
Pointch=newPoint(xIndex,yIndex,isBlack?
Color.black:
Color.white);
chessList[chessCount++]=ch;
repaint();//通知系统重新绘制
if(isWin()==false){//播放落子音
musicFile=newFile("qi.wav");
uri=musicFile.toURI();
try{url=uri.toURL();}
catch(Exceptionexp){}
AudioClipclip=Applet.newAudioClip(url);
clip.play();
}
if(isWin()){//播放胜利音乐
musicFile=newFile("win.wav");
uri=musicFile.toURI();
try{url=ur