版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
九江职业技术学院JAVA课程设计计算机网络技术专业专业代码:590102《动态网站基础程序设计》课程设计班级:网站1101班学号:201127492011317020110394201148392011264620112647201136192011214420112925姓名:兰辉程进呈向子剑万晨刘开鑫刘燕平周莹黄双凤徐玉书课题:单机版五子棋指导教师:胡志锋答辩日期:TIME\@"yyyy'年'M'月'd'日'"2013年1月11日目录一、任务描述 1二、任务分析 11、OOA分析 12、OOD分析 13、java源文件及其功能 34、ChessBoard类使用的方法及功能 3三、任务解决过程与方法 41、主窗体设计 52、棋子设计 73、棋盘对弈算法设计 8四、运行结果 161、图4.1 162、图4.2 16五、总结 17任务描述设计一个18╳18围棋棋盘由两玩家交替进行对战并可以实现以下功能1.选择落子的先后顺序。2.重置棋盘。3.刷新重新开始。4.退出提示并且规定退出者判为负,但退出过程中要有提示。以防不小心点错了。最后判断某一方是否为五子连珠。实现一个简单的多用户五子棋的游戏程序,包括如下两个界面:1.选择对弈桌执黑、执白。2.在游戏界面,有开始,退出,悔棋。任务分析五子棋是一种深受大众喜爱的棋牌类游戏,其规则简单,变化多端,非常富有趣味性。这里设计和实现了双人对下的五子棋程序。根据当前最后一个落子的情况来判断来判断胜负,实际上需要从四个位置判断,以该子为出发点的水平、竖直及两条分别为45度角和135度角的线,目的是看在这四个方向是否最后落子的一个构成连续五个的棋子,如果是的话,就表示该盘棋局已经分出胜负。该游戏还提供悔棋的功能。OOA分析:单机版五子棋游戏的程序由chessboard.java、point.java和startchessjframe.java三个文件组成。Chessboard.java由兰辉、向子剑、程进呈完成。Chessboard.java包含名为ChessBoard的public类,其重要功能是绘制棋盘、棋子,并提供判断输赢的方法。Point.java由徐玉书完成。Point.java包含名为point的public类。其主要功能定义棋子的颜色,获棋子的索引值。StartChessJFrame.java由万晨完成。StartChessJFrame.java包含名为StartChessJFrame的public类,主要用来显示主窗体界面。包含工具台面板,按钮的菜单栏,“系统”菜单栏。“重新开始”“悔棋”“退出”菜单项,设置界面关闭事件。刘燕平、黄双凤负责页面的运行及调试。周莹、刘开鑫负责文件的整理和网上查找资料。OOD:Point类图:图1.1Chessboard类图: StartchessJFrame类图:StartchessJFrame类图:图1.2图1.3Point类、Chessboard类和StartchessJFrame之间的类关系:图1.4java源文件及其功能id文件名主要功能备注1ChessBoard本程序的主函数初始化棋盘2Point棋子设计函数棋子的定位以及颜色3StartChessJFrame五子棋主框架的构造程序的框架图1.5ChessBoard类的属性及类型成员变量描述变量类型名称对战面板ChessBoardchessboard工具条面板JPaneltoolbar重新开始JButtonstartButton悔棋JButtonbackButton退出JButtoneximButton菜单栏JMenuBarmenuBar系统菜单JMeusysMenu图1.6ChessBoard类使用的方法及功能方法名功能备注ChessBoard()初始化棋盘设置棋盘颜色,Voidpaint(Graphicsg)对棋子等图像进行初始化设置棋子大小,颜色等Publicvoid鼠标的实践监听单击实践mousePressed(MouseEvente)publicvoidpaint(Graphicsg)画出图像控制图像大小范围publicvoidmousePressed(MouseEvente)处理按下鼠标的事件选中下棋的位置publicvoidmouseReleased(MouseEvente)处理鼠标离开的事件本步下棋结束publicvoidmouseExited(MouseEvente)处理鼠标离开棋盘时鼠标离开组件不实现任何事件publicvoidmouseClicked(MouseEvente)处理发生单击的事件实现下棋以及重新开始游戏表1.7三、任务解决过程及方法一个单机版五子棋的主要设计点由以下三个:五子棋主窗体设计。五子棋棋子设计。对弈算法相关问题的设计。编写一个StartchessJFrame类主要用来显示主窗体界面,StartChessJFrame.java包含名为StartChessJFrame的public类,主要用来显示主窗体界面。包含工具台面板,按钮的菜单栏,“系统”菜单栏。“重新开始”“悔棋”“退出”菜单项,设置界面关闭事件。并编写一个内部MyItemListener类来监听按钮和菜单项单击事件。编写Point类,包含棋子的x/y索引,、颜色,构造函数的相应的get方法。编写ChessBoard类,设置棋盘背景颜色为粉红色,然后再主窗体中创建Chessboard对象,并添加到主框架中。编写paintComponent方法中绘制棋子数组,需要将索引转换为坐标。在ChessBoar中创建point[],然后在paintComponnet方法中绘制棋子数组。为ChessBoard实现监听器MouseListener,覆盖相应的抽象方法,在构造方法中增加监听器。编写mousePressed方法的内容,预先定义isBlack表示下的是黑棋还是白棋,pointCount表示当前棋子的个数。将在mousePressed中获得坐标,转换成索引,在创建point对象。添加到pointlist中。在重新绘制。添加相应的判断。不能画在棋盘外。下过的地方不能再下。需要辅助方法findpoint。在添加胜利的判断iswin,添加标记变量。Gameover。在mousepressd方法的最前面调用加入gameover的判断。在mousepressed方法的最后调用iswin,返回true则给出消息提示。Gameover设置为true。iswin方法的具体编写,判断水平,竖直以及两条分别为45度和135度是否有梁旭的同色棋子。五子棋主窗体设计packageChessBoard;importjavax.swing.*;importjava.awt.event.*;importjava.awt.*;/**五子棋-主框架,程序启动类*/publicclassStartChessJFrameextendsJFrame{privateChessBoardchessBoard;//对战面板privateJPaneltoolbar;//工具条面板privateJButtonstartButton;privateJButtonbackButton;privateJButtonexitButton;//“重新开始”按钮,“悔棋”按钮和“退出”按钮/**主要实现菜单*/privateJMenuBarmenuBar;//菜单栏privateJMenusysMenu;//系统菜单privateJMenuItemstartMenuItem;privateJMenuItemexitMenuItem;privateJMenuItembackMenuItem;//“重新开始”,“退出”和“悔棋”菜单项publicStartChessJFrame(){setTitle("单机版五子棋");//设置标题chessBoard=newChessBoard();//初始化面板对象//创建和添加面板menuBar=newJMenuBar();//初始化菜单栏sysMenu=newJMenu("菜单");//初始化菜单startMenuItem=newJMenuItem("重新开始");exitMenuItem=newJMenuItem("退出");backMenuItem=newJMenuItem("悔棋");//初始化菜单项sysMenu.add(startMenuItem);//将三个菜单项添加到菜单上sysMenu.add(backMenuItem);sysMenu.add(exitMenuItem);MyItemListenerlis=newMyItemListener();//初始化按钮事件监听器内部类this.startMenuItem.addActionListener(lis);//将那三个菜单项注册到事件监听器上backMenuItem.addActionListener(lis);exitMenuItem.addActionListener(lis);menuBar.add(sysMenu);//将“系统”菜单添加到菜单栏上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.EXIT_ON_CLOSE);//设置界面关闭事件setSize(620,695);setResizable(false);//pack();//自适应大小}//事件监听器内部类privateclassMyItemListenerimplementsActionListener{publicvoidactionPerformed(ActionEvente){Objectobj=e.getSource();//取得事件源if(obj==StartChessJFrame.this.startMenuItem||obj==StartChessJFrame.this.startButton){//重新开始//JFiveFrame.this内部类应用外部System.out.println("重新开始...");chessBoard.restartGame();}elseif(obj==StartChessJFrame.this.exitMenuItem||obj==StartChessJFrame.this.exitButton){System.exit(0);//结束应用程序}elseif(obj==StartChessJFrame.this.backMenuItem||obj==StartChessJFrame.this.backButton){//悔棋System.out.println("悔棋...");chessBoard.goback();}}}publicstaticvoidmain(String[]args){StartChessJFramef=newStartChessJFrame();//创建主框架f.setVisible(true);//显示主框架}}五子棋的棋子设计。packageChessBoard;importjava.awt.Color;publicclassPoint{privateintx;//棋盘中的x索引privateinty;//棋盘中的y索引privateColorcolor;//颜色publicstaticfinalintDIAMETER=15;//直径publicPoint(intx,inty,Colorcolor){this.x=x;this.y=y;this.color=color;}//拿到棋盘中的x索引publicintgetX(){returnx;}//拿到棋盘中的y索引publicintgetY(){returny;}//得到颜色publicColorgetColor(){returncolor;}}棋盘对弈算法设计。/**Tochangethistemplate,chooseTools|Templates*andopenthetemplateintheeditor.*/packageChessBoard;/****@authorAdministrator*/importjavax.swing.*;importjava.awt.*;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjavax.swing.JPanel;/**五子棋-棋盘类*/publicclassChessBoardextendsJPanelimplementsMouseListener{publicstaticfinalintMARGIN=18;//边距publicstaticfinalintGRID_SPAN=18;//网格间距publicstaticfinalintROWS=32;//棋盘行数publicstaticfinalintCOLS=32;//棋盘列数Point[]chessList=newPoint[(ROWS+1)*(COLS+1)];//初始每个数组元素为nullbooleanisBlack=true;//默认开始时黑棋先下booleangameOver=false;//游戏是否结束intchessCount;//当前棋盘的棋子个数intxIndex,yIndex;//当前刚下的棋子的索引publicChessBoard(){setBackground(Color.ORANGE);//设置背景颜色为橘黄色addMouseListener(this);//添加监视器addMouseMotionListener(newMouseMotionListener(){//匿名内部类publicvoidmouseDragged(MouseEvente){}@OverridepublicvoidmouseMoved(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));//设置成手型}}privatebooleanfindChessint(intx1,inty1)throwsUnsupportedOperationException{thrownewUnsupportedOperationException("Notyetimplemented");}});}//绘制@OverridepublicvoidpaintComponent(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;i<chessCount;i++){intxPos=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);}}}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;}//xy已经有棋子在存在,不能下if(findChess(xIndex,yIndex)){return;}Pointch=newPoint(xIndex,yIndex,isBlack?Color.black:Color.white);chessList[chessCount++]=ch;repaint();//通知系统从新绘制if(isWin()){//给出胜利信息,不能再继续下棋。Stringmsg=String.format("恭喜,%s赢了!",colorName);JOptionPane.showMessageDialog(this,msg);gameOver=true;}isBlack=!isBlack;}publicvoidmouseClicked(MouseEvente){}//鼠标按键在组件上单击(按下并释放)时调用publicvoidmouseEntered(MouseEvente){}//鼠标进入到组件上时调用publicvoidmouseExited(MouseEvente){}//鼠标离开组件时调用publicvoidmouseReleased(MouseEvente){}//鼠标按钮在组件上释放时调用。//在棋子数组中查找是否有索引为xy的棋子存在privatebooleanfindChess(intx,inty){for(Pointc:chessList){if(c!=null&&c.getX()==x&&c.getY()==y){returntrue;}}returnfalse;}//判断哪方赢privatebooleanisWin(){intcontinueCount=1;//连续棋子的个数//横向向西寻找for(intx=xIndex-1;x>=0;x--){Colorc=isBlack?Color.black:Color.white;if(getChess(x,yIndex,c)!=null){continueCount++;}else{break;}}//横向向东寻找for(intx=xIndex+1;x<=ROWS;x++){Colorc=isBlack?Color.black:Color.white;if(getChess(x,yIndex,c)!=null){continueCount++;}else{break;}}//判断记录数大于等于5.即表示此方取胜if(continueCount>=5){returntrue;}else{continueCount=1;}//继续另一种情况的搜索:纵向//纵向向上寻找for(inty=yIndex-1;y>=0;y--){Colorc=isBlack?Color.black:Color.white;if(getChess(xIndex,y,c)!=null){continueCount++;}else{break;}}//纵向向下for(inty=yIndex+1;y<=ROWS;y++){Colorc=isBlack?Color.black:Color.white;if(getChess(xIndex,y,c)!=null){continueCount++;}else{break;}}if(continueCount>=5){returntrue;}else{continueCount=1;}//继续另一种情况的搜索:斜向//东北寻找for(intx=xIndex+1,y=yIndex-1;y>=0&&x<=COLS;x++,y--){ Colorc=isBlack?Color.black:Color.white; if(getChess(x,y,c)!=null) { continueCount++; }else break;}//西南寻找for(intx=xIndex-1,y=yIndex+1;y<=ROWS&&x>=0;x--,y++){ Colorc=isBlack?Color.black:Color.white; if(getChess(x,y,c)!=null) { continueCount++; }else break;}if(continueCount>=5){returntrue;}elsecontinueCount=1;//继续另一种情况的搜索:斜向//西北寻找for(intx=xIndex-1,y=yIndex-1;y>=0&&x>=0;x--,y--){ Colorc=isBlack?Color.black:Color.white; if(getChess(x,y,c)!=null) { continueCount++; }else break;}//西南寻找for(intx=xIndex+1,y=yIndex+1;y<=ROWS&&x<=COLS;x++,y++){ Colorc=isBlack?Color.black:Color.white; if(getChess(x,y,c)!=null) { continueCount++; }else break;}if(continueCount>=5){ returntrue;}else continueCount=1;returnfalse;}privatePointgetChess(intxIndex,intyIndex,Colorcolor){for(Pointc:chessList){if(c!=null&&c.getX()==xIndex&&c.getY()==yIndex&&c.getColor()==color){returnc;}}returnnull;}publicvoidrestartGame(){//清除棋子for(inti=0;i<chessList.length;i++){chessList[i]=null;}//恢复游戏相关的变量值isBlack=true;gameOver=false;//游戏结束chessCount=0;//当前棋盘的棋子个数repaint();}//悔棋publicvoidgoback(){if(chessCount==0){return;}chessList[chessCount-1]=null;chessCount--;if(chessCount>0){xIndex=chessList[chessCount-1].getX();yIndex=chessList[chessCount-1].getY();}isBlack=!isBlack;repaint();}//矩形publicDimensiongetpreferredSize(){returnnewDimension(MARGIN*2+GRID_SPAN*COLS,MARGIN*2+GRID_SPAN*ROWS);}}四、运行结果:图4.1图4.2五、总结兰辉:在这次课程设计中,我和程进程、向子剑主要负责ChessBoard.java对弈棋盘算法的编写。利用算法需要实现几个重要的功能。1、编写ChessBoardextendsJPane1,通过定义构造函数,来设置背景颜色,在主框架中创建ChessBoard对象。添加到主窗体。2、绘制棋盘,定义边距、行数、列数、网格宽度等常量。绘制棋子数组。利用在ChessBoard类中覆写painComponent方法来实现。3、设置监听。利用ChessBoard类实现MouseListener接口。4、处理棋子。先定义一个MousePressed方法,预先定义isBlack表示下是黑棋还是白棋。Pointcount表示当前棋子个数。添加判断,不能画在棋盘外,下过的地方不能下。5、判断胜负。分析是从横向、纵向、斜向判断是否有5个同色棋子。先写一个iswin方法、标记为gameover变量。在mousepressed方法中调用gameover判断。在mousepressed方法的最后调用iswin,返回true则给出消息提示。以上方法通过上网,看课本,以及组员一起讨论完成。并且查阅了java帮助文档。通过这次课程设计,五子棋程序可以运行。需要在代码中我们进行严谨的构思。这次课程设计我获益匪浅。程进呈:以前总结觉得学java,代码看看就懂了,其实不然。例如:这次的课程设计遇到了鼠标在棋盘上移动点击出现了棋子的问题,2判断黑白棋输赢3、清除棋子4、悔棋问题解决办法:1、在ChessBoard继承JPane以及实现接口MouseListener中定义好了棋盘的边距、网格间距、行数、列数画好之后,采用publicvoidmousePessed(MouseEvent){};来解决棋子存在不下和使用MouseEvent调用鼠标事件发生的方法2、在出现棋子后采用privateBooleaniswin(){}方法中采用for循环和if语句来实现黑白棋输赢。3、清除棋子采用publicvoidrestarGame(){}方法来实现棋子清除。4、悔棋采用publicvoidgoback(){};中
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 小学数学实践活动实施方案
- 智能物联网系统集成人才培养方案
- 麻醉药品经营质量管理手册
- 无人机操作人员等级评定方案
- 制造企业危险废物管理制度
- 小学探究式学习教学实施方案
- 流域生态环境保护补偿实施方案
- 医疗器械经营运输过程管理规范
- 绿色农产品生产提升实施方案
- 小学语文课堂教学改进方案
- 中途入股合作协议书范本
- 2025年辅警考试题库题目(含答案)
- 理解当代中国 大学英语视听说教程1(拓展版) 课件 B1U2 Planting seeds,harvesting the future
- 2025年高校二级学院教学管理笔试真题(附答案)
- 国企党务工作者(党建岗)面试题和专题题20问及答案
- 新时代陕西省立德树人工作指南细则
- GB/T 1539-2026纸板耐破度的测定
- 《鸦胆子油乳注射液治疗消化道恶性肿瘤临床应用专家共识-公示稿》
- 2025-2030株洲轨道交通行业竞争格局分析及智能化升级研究
- dbj41现浇混凝土内置保温墙体技术规程
- 深度解析(2026)《HJT 81-2001畜禽养殖业污染防治技术规范》
评论
0/150
提交评论