实验报告
课程名称 程序设计课程设计
实验项目名称 五子棋游戏子系统实现
班级与班级代码 09信息管理与信息系统2班 092511012
实验室名称(或课室)
专 业 信息管理与信息系统
任课教师 罗东俊 老师
学 号: 09251101218
姓 名: 江洁梅
实验日期: 2010 年 6 月 21 日
广东商学院教务处 制
姓名 江洁梅 实验报告成绩
评语:
| 检查项目 | 满分 | 得 分 |
| 实验目的明确程度 | 10 | |
| 实验原理理解程度 | 20 | |
| 实验步骤正确性和完整性 | 20 | |
| 实验结果及其评价 | 30 | |
| 实验中遇到的主要问题的分析与处理 | 10 | |
| 实验报告美观性和可读性 | 10 | |
| 其他 | ||
| 合计 | 100 |
年 月 日
说明:指导教师评分后,实验报告交院(系)办公室保存。
五子棋游戏子系统实现
一、实验目的
用JAVA程序设计五子棋子窗口,实现五子棋的人机对弈,人人对弈,
网络对弈,背景音乐,视图的转换等功能。而五子棋计算器子系统以五子棋子窗口为界面,由ChessInternalFrame,ChessModel,MainPanel,SocketThread,Sound五个类组成。
通过“五子棋游戏子系统实现”实验,掌握课程设计项目实现的思路,进一步掌握面向对象程序设计的思想,以及JAVA语言运用的方法和技巧。
二、实验环境
在jdk1.5.0_04运行环境下,在Eclipse界面下,开发调试和运行JAVA
实验项目。
三、实验原理
运用面向对象的JAVA语言编程原理,应用JAVA语言中类的设计,JAVA图形用户界面的设计,数组的运用等,实现五子棋子系统的设计和功能的实现。
四、实验步骤及实验结果
(一)整体结构
1.新建Java Project“Program Design”(图1) ,然后“Program Design”下新建chess等5个包 (图2),在各个包下建立各自的类.
图1
图2
2.五子棋游戏子系统由主要由包chess组成,包chess下有ChessInternalFrame,ChessModel,MainPanel,SocketThread,Sound五个类。
3.分别输入每个包中各类的源程序,然后编译调试。
(二)ChessInternalFrame.java
1.ChessInternalFrame.java是五子棋游戏子系统的核心,实现与其他模块的接口。
2.构造函数 public ChessInternalFrame(String title) 设置了棋盘面板,定义了各项菜单,及其相应的下拉选项。例如下面的“游戏”菜单下有“开局,棋盘,音乐,退出”四个选项。
//“游戏”菜单
JMenu gameMenu = new JMenu("游戏");
mbar.add(makeMenu(gameMenu, new Object[] {
"开局", "棋盘",null, "音乐",null,"退出"}, this));
boardMenuItem=gameMenu.getItem(1);
3.方法 public JMenu makeMenu(Object parent, Object items[], Object target){
设置各个菜单项的方法。
4.方法public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target){
设置各个单选菜单的方法,实现相应的功能。例如以下对“开局”菜单的处理if(arg.equals("开局")){
if(!this.isnet)
//如果是本地对弈,那么直接调用方法restart()开始新的一局
restart();
else{
//如果是网路对战,那么首先给对方发送一个新开局命令,然后调用restart()方法
byte msg[]=new byte[2];
msg[0]=-1;
msg[1]=0;
//新开局命令,第一个字节为-1,第二个字节为0
try{
out.write(msg); //将新开局命令传送给对方
System.out.println("开局信息发送出>>>>>>>>>");
}catch(IOException ex){
System.out.println(ex);
}
try{
Thread.sleep(1000);
}catch(InterruptedException ito){
System.out.println(ito);
}
if(this.isserver)
this.istoken=true;
else
this.istoken=false;
restart();
}
}
(三) ChessModel.java
1. ChessModel.java主要实现本地对弈,网络对弈不同情况下五子棋游戏进行的方法,以及输赢的判断和提示。
2.以下方法用条件判断语句,分别对本地对弈,网络对弈进行处理。
public void play(int x,int y){
if(badxy(x,y))
return;
if(chessExist(x,y)){
this.isExist=true;
return;
}
else
this.isExist=false;
if(!ChessInternalFrame.isnet){ //如果是本地对弈
if(getisOdd()){
setisOdd(false);
this.arrMapShow[x][y]=1;
}
else{
setisOdd(true);
this.arrMapShow[x][y]=2;
}
}
else{ //如果时网络对弈
if(ChessInternalFrame.istoken) //如果x,y是本方走棋时的坐标
this.arrMapShow[x][y]=1;
else //如果x,y是对方传送过来的坐标
this.arrMapShow[x][y]=2;
}
}
3.输赢的判断和提示
//判断输赢的方法
public boolean judgeSuccess(int x,int y,boolean isodd){
public void showSuccess(JPanel jp){
JOptionPane.showMessageDialog(jp,"恭喜!你赢了游戏!",
"胜利",JOptionPane.INFORMATION_MESSAGE);
}
public void showDefeat(JPanel jp){
JOptionPane.showMessageDialog(jp,"你输了游戏,请继续努力!",
"失败",JOptionPane.INFORMATION_MESSAGE);
}
(四)MainPanel.java
1.主要实现对鼠标事件的处理,以及相应走棋声音和输赢信息提示的控制。
2.方法分别说明本地对弈和网络对弈对鼠标事件的不同处理。
public void mousePressed(MouseEvent evt){
public void mousePressed(MouseEvent evt){
int x = (evt.getX()-10) / 20; //鼠标点击处对应棋盘上的x坐标
int y = (evt.getY()-10) / 20; //鼠标点击处对应棋盘上的y坐标
if (evt.getModifiers()==MouseEvent.BUTTON1_MASK){
//本地对弈的鼠标事件处理
if(!ChessInternalFrame.isnet){
cm.play(x,y);
System.out.println(cm.getisOdd()+" "+cm.getarrMapShow()[x][y]);
repaint();
if(cm.judgeSuccess(x,y,cm.getisOdd())){
cm.showSuccess(this);
evt.consume();
ChessInternalFrame.iscomputer=false;
}
if(ChessInternalFrame.iscomputer&&!cm.getisExist()){
//判断是否为人机对弈
cm.computerdo(cm.getWidth(),cm.getHeight()); //计算机走棋
repaint(); //重绘棋盘
if(cm.judgeSuccess(cm.getX(),cm.getY(),cm.getisOdd())){
cm.showDefeat(this);
evt.consume(); //销毁鼠标事件
}
}
}
//网络对弈的鼠标事件处理
else{
if(ChessInternalFrame.istoken){
//只有在本方获得令牌时方可点击棋盘走棋
cm.play(x,y);
//将ChessModel实例cm中与坐标x,y对应的二维数组arrMapShow的元素置位为1
System.out.println("local :"+"
"+cm.getarrMapShow()[x][y]+
" coordinate: ("+x++y+")");
repaint();
ChessInternalFrame.istoken=false; //令牌交给对方
byte msg[]=new byte[2]; //棋盘坐标命令
msg[0]=(byte)x; //第一个字节为x坐标
msg[1]=(byte)y; //第二个字节为y坐标
OutputStream out=cf.getout(); //得到连接套接字的输出流
try{
out.write(msg); //将棋盘坐标命令传送给对方
}catch(IOException ex){
System.out.println(ex);
}
3. 走棋声音的控制
}
postsound.play(); //走棋声音
}
(五)SocketThread.java
1. SocketThread.java主要实现网络对弈的进行,包括网络连接和中断,网络对弈下双方的通讯。
2.构造函数接收并记录网络连接和对弈前的信息,为判断开局作准备。
public SocketThread(ChessInternalFrame cframe,MainPanel mpanel){
this.cf=cframe;
this.mp=mpanel;
this.socketin=cframe.getin();
this.socketout=cframe.getout();
this.socket=cframe.getsocket();
}
3.方法public void run(){
在不同情况下实现双方的提示和通讯,例如发出开局命令
if(message[1]==0){ //新开局命令
System.out.println("收到开局信息>>>>>>>>>>");
(六)Sound.java
1. Sound.java由5个方法组成,控制五子棋游戏过程中声音的播放
2.构造函数
public Sound(String soundfile) {
在条件满足下连接声音文件
url = urlLoader.findResource("audio/"+soundfile);
} catch (Exception e) {
3. public void getMedia() {
if (url != null && soundData == null) {
soundData = ap.newAudioClip(url);
}
if (soundData == null) {
System.out.println("SoundArea: Unable to load data "+url);
}
实现提示信息
如无法下载数据
if (soundData == null) {
System.out.println("SoundArea: Unable to load data "+url);}
4. 方法public void play()在条件满足下开始声音的播放
5. 方法在public void loop(){
soundData.loop();
hasPlayed = true;
}
条件满足下暂停声音的播放
6. 方法public void stop(){soundData.stop();
hasPlayed = false;}
在条件满足下停止声音的播放
(七)运行结果
1.Mental视图:
。
2.Montif视图:
3.Windows视图:
4.“关于”的提示
5本地对弈与网络对弈
6.游戏结果判断
五、实验总结
1.实验过程中源程序的编辑要注意大小写,否则造成编译错误。所以操作过程要细心谨慎。
2.出现错误时不要气馁,要善于利用提示信息,全面镇定考虑错误的原因。,从错误中学习经验。
3.要联系程序的上下语句找出错误,在MainPanel.java中
if(v == 2 ){
g.setColor(Color.gray);
g.drawOval(x-8,y-8,16,16);
g.setColor(Color.red);
g.fillOval(x-8,y-8,16,16);
语句出现错误,后仔细检查,从该语句前的if(v == 1 )语句中得到启示,分别在前面加上g.即可
4.遇到疑问,先思考,再多与同学讨论或与老师交流,这样印象深刻又提高效率。下载本文