软件测试课程设计五子棋_第1页
软件测试课程设计五子棋_第2页
软件测试课程设计五子棋_第3页
软件测试课程设计五子棋_第4页
软件测试课程设计五子棋_第5页
已阅读5页,还剩59页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

软件测试课程设计(五子棋) 软件测试小论文题目:五子棋的开发与测试班级:12计算机科学与技术特色本(2)班小组成员:刘文志(18)、刘学(19)、朱和中(51)完成日期:201指导教师:钱丽摘要五子棋游戏不仅能增强思维能力,提高记忆力,而且富含哲理,有助于修身养性。既有“场”的概念,亦有“点”的连接,是古今哲理的结晶。因此,开发出一款简单实用的单机版五子棋软件很有意义。

本论文分析了五子棋游戏的游戏规则,设计了游戏算法,并选择eclipse作为该软件的开发平台,实现了五子棋的多种对战模式,既可人与人对战,也可人与电脑对战。还实现了,自定义棋盘行列数。本文将从开发环境的安装,到五子棋的功能分析与设计,到各功能模块的实现,逐步向您展现五子棋的实现过程。经测试,本游戏系统功能齐全,能平稳运行,具有较强的使用价值。

关键词:五子棋;思考算法;多人对战;人机对战;目录TOC\o"1-3"\h\u311701.引言 1103391.1编写目的 1319531.2背景 1105042.单机版五子棋系统介绍 221932.1平台简介 2233872.2游戏概述 2299533.基于Java的五子棋游戏的设计 3326243.1游戏模块 329100 324398 478363.2游戏流程图 421784.软件测试 5210084.1测试的目的 591094.2测试的方法 563144.3白盒测试 624565 7113024.4黑盒测试 10246484.5测试游戏存在的问题 12155984.6游戏不足的解决方案 1212876 1233164.7回归测试 13303755.总结 153773参考文献 1616474附录 171.引言1.1编写目的根据测试计划报告,对软件进行测试,详细记录测试过程,以对软件的质量进行评价,为软件设计人员提供BUG依据,故做产生测试分析报告。1.2背景为了使游戏更加完善,使玩家有更好的游戏体验,针对游戏出现的一些问题,做出修复,使游戏更加生动,符合玩家的游戏习惯。

2.单机版五子棋系统介绍2.1平台简介Eclipse是一个开放源代码的、基于Java的可扩展开发平台。就其本身而言,它只是一个框架和一组服务,用于通过插件组件构建开发环境。幸运的是,Eclipse附带了一个标准的插件集,包括Java开发工具(JavaDevelopmentKit,JDK)。2.2游戏概述该游戏软件采用Java语言设计,在Windows系统为玩家提供五子棋游戏人机对战的基本功能。玩家可以通过鼠标在棋盘的相应位置下子,一方为白色,另一方为黑色,先下的为黑子(主场)。游戏过程中,只要有一人先连成五个棋子,不论横、竖或斜,就会在屏幕上显示是谁赢了比赛,也可以是平局收场,从而可以进行下一场比赛。在比赛过程中,如果一方需要悔棋,先得通过对手的同意才可以。

3.基于Java的五子棋游戏的设计本项目中五子棋主要包含两大主要模块,如下图3.1(a)所示。第一个模块为主要模块,用于实现五子棋的游戏功能。第二个模块为辅助模块,用于实现五子棋的相关辅助设置。游戏主界面如图3.1(b)。五子棋游戏五子棋游戏视图帮助块游戏模块图3.1(a)主要模块图3.1(b)游戏主界面3.1游戏模块该模块实现游戏的主要功能,共包含两个小模块,如下图3.2(a)所示。第一个模块为棋盘栏,实现游戏玩家点击下棋的功能。第二个小模块为模式栏,对下棋的方式进行选择。游戏菜单如图3.2(b)所示。游戏模块游戏模块模式栏开局、退出、棋盘栏图3.2(a)游戏模块图3.2(b)游戏菜单开局、退出、棋盘实现可视化的开局与退出功能,以及棋盘选择对战模式。图3.3开局、退出、棋盘模式栏,主要实现游戏过程中的各种控制功能,包括人人、人机实例化对战模式。图3.4模式选择是电脑下子电脑是否下子是电脑下子电脑是否下子是电脑下子电脑是否下子是电脑下子电脑是否下子否游戏结束是白子或黑子是否有5个连成一线否游戏者是否下子否游戏者下子模式选择开局

4.软件测试4.1测试的目的软件测试是为了发现错误而执行程序的过程。或者说,软件测试是根据软件开发各阶段的规格说明和程序的内部结构而精心设计一批测试用例{即输入数据及其预期的输出结果},并利用这些测试用例去运行程序,以发现程序错误的过程。设计测试的目标是想以最少的时间和人力,系统地找出软件中潜在的各种错误和缺陷。如果成功地实施了测试,就能够发现软件中的错误。测试的附带收获是,它能够证明软件的功能和性能与需求说明相符合。此外,实施测试收集到的测试结果数据为可靠性分析提供了依据。而测试的目的就是在软件投入生产性运行之前,尽可能地发现软件中的错误。4.2测试的方法常见的软件测试阶段的工作主要分为单元测试、集成测试、确认测试和系统测试四个步骤,测试方法有黑盒测试和白盒测试两种方法:黑盒测试(已经知道产品应该具有的功能,可以通过测试来检验是否每个功能都正常);白盒测试(如果知道产品内部工作过程,可以通过测试来检验内部动作是否按照说明书的规定正常进行)。本游戏测试的主要方法包括黑盒测试和白盒测试,由小组人员通过自己亲自去玩,然后观察游戏在运行过程中,所需要实现的功能有没有实现,以及在测试过程中有没有发现新的问题记录在案。然后根据测试后所产生的一系列的问题,有本组负责编码人员对游戏进行改进,然后在进行测试,就这样重复的进行这样的工作,直到游戏的运行与预想时的状况基本一致时,才算通过测试。图4.1完整游戏图4.3白盒测试通过程序的源代码进行测试而不使用用户界面。这种类型的测试需要从代码句法发现内部代码在算法,溢出,路径,条件等等中的缺点或者错误,进而加以修正,这一方法是把测试对象看作一个打开的盒子,测试人员依据程序内部逻辑结构相关信息,设计或选择测试用例,对程序所有逻辑路径进行测试,通过在不同点检查程序的状态,确定实际的状态是否与预期的状态一致。用软件白盒测试产生的测试用例能够:1.保证一个模块中的所有独立路径至少被使用一次;2.对所有逻辑值均需测试true和false;3.在上下边界及可操作范围内运行所有循环;4.检查内部数据结构以确保其有效性。(1)用例1:因为类ChessFrame主要功能是创建五子棋游戏主窗体,所以对其进行测试,看其构造五子棋游戏的主窗体的方法是否正确。classChessFrameextendsJFrameimplementsActionListener{privateString[]strsize={"20x15","30x20","40x30"};privateString[]strmode={"人机对弈","人人对弈"};publicstaticbooleaniscomputer=true,checkcomputer=true;privateintwidth,height;privateChessModelcm;privateMainPanelmp;publicChessFrame(){ this.setTitle("五子棋游戏"); cm=newChessModel(1); mp=newMainPanel(cm); Containercon=this.getContentPane(); con.add(mp,"Center"); this.setResizable(false); this.addWindowListener(newChessWindowEvent()); MapSize(20,15); JMenuBarmbar=newJMenuBar(); this.setJMenuBar(mbar); JMenugameMenu=newJMenu("游戏"); mbar.add(makeMenu(gameMenu,newObject[]{ "开局","棋盘","模式",null,"退出"},this)); JMenulookMenu=newJMenu("视图"); mbar.add(makeMenu(lookMenu,newObject[]{ "Metal","Motif","Windows" },this)); JMenuhelpMenu=newJMenu("帮助"); mbar.add(makeMenu(helpMenu,newObject[]{ "关于" },this));}(2)用例2:用play(intx,inty)方法实现电脑下子,并先通过方法readyplay(intx,inty)判断某坐标位置是否可下棋子。publicvoidreadyplay(intx,inty){if(badxy(x,y))return;if(chessExist(x,y))return;this.arrMapShow[x][y]=3;}publicvoidplay(intx,inty){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}(3)用例3: 计算机走棋方法(computerDo)测试通过方法computerDo实现电脑下子的思想publicvoidcomputerDo(intwidth,intheight){intmax_black,max_white,max_temp,max=0;setisOdd(true);for(inti=0;i<=width;i++){ for(intj=0;j<=height;j++){ if(!chessExist(i,j)){ max_white=checkMax(i,j,2); max_black=checkMax(i,j,1); max_temp=Math.max(max_white,max_black); if(max_temp>max){ max=max_temp; this.x=i; this.y=j;}}}}(4)用例4:根据提供的棋子信息(颜色、坐标)画棋子方法(draw)的测试publicvoiddraw(Graphicsg,inti,intj,intv){intx=20*i+20;inty=20*j+20;//画棋盘if(i!=width&&j!=height){g.setColor(Color.white);g.drawRect(x,y,20,20);}//画黑色棋子if(v==1){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.black);g.fillOval(x-8,y-8,16,16);}//画白色棋子if(v==2){g.setColor(Color.gray);g.drawOval(x-8,y-8,16,16);g.setColor(Color.white);g.fillOval(x-8,y-8,16,16);}if(v==3){g.setColor(Color.cyan);g.drawOval(x-8,y-8,16,16);}}(5)用例5:响应鼠标的点击事件,构造方法(mousePressed)实现鼠标的点击来实现下棋的动作。publicvoidmousePressed(MouseEventevt){intx=(evt.getX()-10)/20;inty=(evt.getY()-10)/20;if(evt.getModifiers()==MouseEvent.BUTTON1_MASK){cm.play(x,y);repaint();if(cm.judgeSuccess(x,y,cm.getisOdd())){cm.showSuccess(this);evt.consume();ChessFrame.iscomputer=false;}(6)用例6:构造方法judgeSuccess(intx,inty,booleanisodd)对当前棋子各个位置的判断来得出是否胜负。publicbooleanjudgeSuccess(intx,inty,booleanisodd){intnum=1;intarrvalue;intx_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;intx_temp1=x_temp,y_temp1=y_temp;4.4黑盒测试软件黑盒测试也是软件测试的主要方法之一,也可以称为功能测试、数据驱动测试或基于规格说明的测试。测试者不了解程序的内部情况,只知道程序的输入、输出和系统的功能,这是从用户的角度针对软件界面、功能及外部结构进行测试,而不考虑程序内部逻辑结构。软件黑盒测试法注重于测试软件的功能需求,主要试图发现下列几类错误:1)功能不正确或遗漏;2)界面错误;3)数据库访问错误;4)性能错误;5)初始化和终止错误等。测试方法可以分为以下几种:等价类划分法、边界值分析法、错误推测法、因果图法、判定表驱动法、正交试验设计法、功能图法等。从理论上讲,软件黑盒测试只有采用穷举输入测试,把所有可能的输入都作为测试情况考虑,才能查出程序中所有的错误。实际上测试情况有无穷多个,人们不仅要测试所有合法的输入,而且还要对那些不合法但可能的输入进行测试。这样看来,完全测试是不可能的,所以我们要进行有针对性的测试,通过制定测试案例指导测试的实施,保证软件测试有组织、按步骤,以及有计划地进行。软件黑盒测试行为必须能够加以量化,才能真正保证软件质量,而测试用例就是将测试行为具体量化的方法之一。五子棋游戏测试用例如下表所示:用例操作预期结果实际结果用例1能否在不同版本的eclipese中运行该游戏游戏能够在设计该游戏版本及以上中正常运行Pass用例2运行时能否正常显示主界面运行时能正常显示主界面Pass用例3鼠标单击菜单—开始,是否可以运行游戏可以运行游戏Pass用例4鼠标单击棋盘,是否会有棋子落于该位置棋子落于鼠标单击位置Pass用例5当人下子出现“活三”、“冲四”,电脑是否会下子堵截电脑会下子阻挡Pass用例6多次游戏测试:在人(黑棋)没有出现“活三”、“冲四”的情况下,电脑(白棋)落子是否存在规律黑棋没有出现“活三”、“冲四”的情况下,电脑(白棋)随机落子,不存在规律Pass用例7进行对战时,按照规则下棋能否正常输赢可以正常输赢Pass用例8判断在横线上5子能否获得胜利可以Pass用例9判断在竖线上5子能否获得胜利可以Pass用例10判断在斜线上5子能否获得胜利可以Pass4.5测试游戏存在的问题1.通过小组以外人员的游戏测试发现,由于棋盘大小问题,使得可能导致有时棋子满格也没有分出胜负,这样,就很难显示博弈者的水平。2.小组以外人员的游戏测试后建议认为,我们所设计的五子棋游戏只能实现人机博弈,不能实现人与人之间的博弈,这样很难让更多的人一展他们的高超棋艺。4.6游戏不足的解决方案1.通过对后台代码的修改实现对游戏棋盘大小的规格控制选择,新添规格30*20格和40*30格模式,让博弈者尽展各自高超棋艺。2.在人机对战的基础上新增人人对战模式,以方便人与人之间棋艺博弈的乐趣让更多的爱好五子棋的玩家参与进来。在菜单中新加棋盘选项,再在模式中新增规格30*20格和40*30格模式实现代码如下:publicChessModel(intmodeChess){this.isOdd=true;if(modeChess==1){PanelInit(20,15,modeChess);}if(modeChess==2){PanelInit(30,20,modeChess);}if(modeChess==3){PanelInit(40,30,modeChess);}}privatevoidPanelInit(intwidth,intheight,intmodeChess){this.width=width;this.height=height;this.modeChess=modeChess;arrMapShow=newint[width+1][height+1];for(inti=0;i<=width;i++){for(intj=0;j<=height;j++){arrMapShow[i][j]=-5;}}}2在菜单中新加模式选项,新增人人对战模式if(arg.equals("人人对弈")){this.checkcomputer=false;this.iscomputer=false;cm=newChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}4.7回归测试对修改后的游戏版本执行回归测试用例操作预期结果测试结果用例1选择不同规格棋盘,能否正常运行能正常运行Pass用例2选择人人对战,能否正常运行能正常运行Pass用例3选择不同规格棋盘,对其他功能正常运行是否产生影响没有影响Pass用例4选择人人对战模式,对其他功能正常运行是否产生影响没有影响Pass

5.总结在测试阶段,一系列的测试方案都是为了“破坏”已经建造好的软件系统而特地设计的,它的存在是为了竭力证明程序中的错误不能按照预定要求正确工作。软件测试从不同的角度出发会派生出两种不同的测试原则,从用户的角度出发,就是希望通过软件测试能充分暴露软件中存在的问题和缺陷,从而考虑是否可以接受该产品,从开发者的角度出发,就是希望测试能表明软件产品不存在错误,已经正确地实现了用户的需求,确立人们对软件质量的信心。

通过此次软件测试的课程设计,深刻学习掌握了软件测试和软件测试过程的基本方法和基本技术,关于黑盒、白盒的测试用例的设计,也进行了认真学习研究,从而进一步提高了自己在程序上的编写能力,以及一些之前未触及的问题。总之,收获颇丰,增强了自己动手以及团队合作的能力。付出才会有回报,实践才能出真知。为即将踏上社会的自己又做了一份理论和实践的准备。

参考文献[1]

谢希仁.

计算机网络(第五版)[M].

北京:电子工业出版社,2008年2月

[2]

胡小强

计算机网络[M]

北京:北京邮电大学出版社2005年1月

[3]

刘群策

LoadRunner和软件项目性能测试

[M]

机械工业出版社

2008年

[4]

朱少民

软件测试方法和技术

[M]

清华大学出版社

2005年

[5]

郑人杰

软件测试

[M]

人民邮电出版社

2013年

附录//Java编程:五子棋游戏源代码/**main方法创建了ChessFrame类的一个实例对象(cf),*并启动屏幕显示显示该实例对象。**/publicclassFiveChessAppletDemo{publicstaticvoidmain(Stringargs[]){ChessFramecf=newChessFrame();cf.show();}}/**类ChessFrame主要功能是创建五子棋游戏主窗体和菜单**/classChessFrameextendsJFrameimplementsActionListener{privateString[]strsize={"20x15","30x20","40x30"};privateString[]strmode={"人机对弈","人人对弈"};publicstaticbooleaniscomputer=true,checkcomputer=true;privateintwidth,height;privateChessModelcm;privateMainPanelmp;//构造五子棋游戏的主窗体publicChessFrame(){this.setTitle("五子棋游戏");cm=newChessModel(1);mp=newMainPanel(cm);Containercon=this.getContentPane();con.add(mp,"Center");this.setResizable(false);this.addWindowListener(newChessWindowEvent());MapSize(20,15);JMenuBarmbar=newJMenuBar();this.setJMenuBar(mbar);JMenugameMenu=newJMenu("游戏");mbar.add(makeMenu(gameMenu,newObject[]{"开局","棋盘","模式",null,"退出"},this));JMenulookMenu=newJMenu("视图");mbar.add(makeMenu(lookMenu,newObject[]{"Metal","Motif","Windows"},this));JMenuhelpMenu=newJMenu("帮助");mbar.add(makeMenu(helpMenu,newObject[]{"关于"},this));}//构造五子棋游戏的主菜单publicJMenumakeMenu(Objectparent,Objectitems[],Objecttarget){JMenum=null;if(parentinstanceofJMenu)m=(JMenu)parent;elseif(parentinstanceofString)m=newJMenu((String)parent);elsereturnnull;for(inti=0;i<items.length;i++)if(items[i]==null)m.addSeparator();elseif(items[i]=="棋盘"){JMenujm=newJMenu("棋盘");ButtonGroupgroup=newButtonGroup();JRadioButtonMenuItemrmenu;for(intj=0;j<strsize.length;j++){rmenu=makeRadioButtonMenuItem(strsize[j],target);if(j==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elseif(items[i]=="模式"){JMenujm=newJMenu("模式");ButtonGroupgroup=newButtonGroup();JRadioButtonMenuItemrmenu;for(inth=0;h<strmode.length;h++){rmenu=makeRadioButtonMenuItem(strmode[h],target);if(h==0)rmenu.setSelected(true);jm.add(rmenu);group.add(rmenu);}m.add(jm);}elsem.add(makeMenuItem(items[i],target));returnm;}//构造五子棋游戏的菜单项publicJMenuItemmakeMenuItem(Objectitem,Objecttarget){JMenuItemr=null;if(iteminstanceofString)r=newJMenuItem((String)item);elseif(iteminstanceofJMenuItem)r=(JMenuItem)item;elsereturnnull;if(targetinstanceofActionListener)r.addActionListener((ActionListener)target);returnr;}//构造五子棋游戏的单选按钮式菜单项publicJRadioButtonMenuItemmakeRadioButtonMenuItem(Objectitem,Objecttarget){JRadioButtonMenuItemr=null;if(iteminstanceofString)r=newJRadioButtonMenuItem((String)item);elseif(iteminstanceofJRadioButtonMenuItem)r=(JRadioButtonMenuItem)item;elsereturnnull;if(targetinstanceofActionListener)r.addActionListener((ActionListener)target);returnr;}publicvoidMapSize(intw,inth){setSize(w*20+50,h*20+100);if(this.checkcomputer)this.iscomputer=true;elsethis.iscomputer=false;mp.setModel(cm);mp.repaint();}publicbooleangetiscomputer(){returnthis.iscomputer;}publicvoidrestart(){intmodeChess=cm.getModeChess();if(modeChess<=3&&modeChess>=1){cm=newChessModel(modeChess);MapSize(cm.getWidth(),cm.getHeight());}else{}}publicvoidactionPerformed(ActionEvente){Stringarg=e.getActionCommand();try{if(arg.equals("Windows"))UIManager.setLookAndFeel(elseif(arg.equals("Motif"))UIManager.setLookAndFeel(elseUIManager.setLookAndFeel(SwingUtilities.updateComponentTreeUI(this);}catch(Exceptionee){}if(arg.equals("20x15")){this.width=20;this.height=15;cm=newChessModel(1);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("30x20")){this.width=30;this.height=20;cm=newChessModel(2);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("40x30")){this.width=40;this.height=30;cm=newChessModel(3);MapSize(this.width,this.height);SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人机对弈")){this.checkcomputer=true;this.iscomputer=true;cm=newChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("人人对弈")){this.checkcomputer=false;this.iscomputer=false;cm=newChessModel(cm.getModeChess());MapSize(cm.getWidth(),cm.getHeight());SwingUtilities.updateComponentTreeUI(this);}if(arg.equals("开局")){restart();}if(arg.equals("关于"))JOptionPane.showMessageDialog(this,"五子棋游戏测试版本","关于",0);if(arg.equals("退出"))System.exit(0);}}/**类ChessModel实现了整个五子棋程序算法的核心*/classChessModel{//棋盘的宽度、高度、棋盘的模式(如20×15)privateintwidth,height,modeChess;//棋盘方格的横向、纵向坐标privateintx=0,y=0;//棋盘方格的横向、纵向坐标所对应的棋子颜色,//数组arrMapShow只有3个值:1,2,3,-5,//其中1代表该棋盘方格上下的棋子为黑子,//2代表该棋盘方格上下的棋子为白子,//3代表为该棋盘方格上没有棋子,//-5代表该棋盘方格不能够下棋子privateint[][]arrMapShow;//交换棋手的标识,棋盘方格上是否有棋子的标识符privatebooleanisOdd,isExist;publicChessModel(){}//该构造方法根据不同的棋盘模式(modeChess)来构建对应大小的棋盘publicChessModel(intmodeChess){this.isOdd=true;if(modeChess==1){PanelInit(20,15,modeChess);}if(modeChess==2){PanelInit(30,20,modeChess);}if(modeChess==3){PanelInit(40,30,modeChess);}}//按照棋盘模式构建棋盘大小privatevoidPanelInit(intwidth,intheight,intmodeChess){this.width=width;this.height=height;this.modeChess=modeChess;arrMapShow=newint[width+1][height+1];for(inti=0;i<=width;i++){for(intj=0;j<=height;j++){arrMapShow[i][j]=-5;}}}//获取是否交换棋手的标识符publicbooleangetisOdd(){returnthis.isOdd;}//设置交换棋手的标识符publicvoidsetisOdd(booleanisodd){if(isodd)this.isOdd=true;elsethis.isOdd=false;}//获取某棋盘方格是否有棋子的标识值publicbooleangetisExist(){returnthis.isExist;}//获取棋盘宽度publicintgetWidth(){returnthis.width;}//获取棋盘高度publicintgetHeight(){returnthis.height;}//获取棋盘模式publicintgetModeChess(){returnthis.modeChess;}//获取棋盘方格上棋子的信息publicint[][]getarrMapShow(){returnarrMapShow;}//判断下子的横向、纵向坐标是否越界privatebooleanbadxy(intx,inty){if(x>=width+20||x<0)returntrue;returny>=height+20||y<0;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下publicbooleanchessExist(inti,intj){if(this.arrMapShow[i][j]==1||this.arrMapShow[i][j]==2)returntrue;returnfalse;}//判断该坐标位置是否可下棋子publicvoidreadyplay(intx,inty){if(badxy(x,y))return;if(chessExist(x,y))return;this.arrMapShow[x][y]=3;}//在该坐标位置下棋子publicvoidplay(intx,inty){if(badxy(x,y))return;if(chessExist(x,y)){this.isExist=true;return;}elsethis.isExist=false;if(getisOdd()){setisOdd(false);this.arrMapShow[x][y]=1;}else{setisOdd(true);this.arrMapShow[x][y]=2;}}//计算机走棋/**说明:用穷举法判断每一个坐标点的四个方向的的最大棋子数,*最后得出棋子数最大值的坐标,下子**/publicvoidcomputerDo(intwidth,intheight){intmax_black,max_white,max_temp,max=0;setisOdd(true);for(inti=0;i<=width;i++){for(intj=0;j<=height;j++){if(!chessExist(i,j)){//算法判断是否下子max_white=checkMax(i,j,2);//判断白子的最大值max_black=checkMax(i,j,1);//判断黑子的最大值max_temp=Math.max(max_white,max_black);if(max_temp>max){max=max_temp;this.x=i;this.y=j;}}}}setX(this.x);setY(this.y);this.arrMapShow[this.x][this.y]=2;}//记录电脑下子后的横向坐标publicvoidsetX(intx){this.x=x;}//记录电脑下子后的纵向坐标publicvoidsetY(inty){this.y=y;}//获取电脑下子的横向坐标publicintgetX(){returnthis.x;}//获取电脑下子的纵向坐标publicintgetY(){returnthis.y;}//计算棋盘上某一方格上八个方向棋子的最大值,//这八个方向分别是:左、右、上、下、左上、左下、右上、右下publicintcheckMax(intx,inty,intblack_or_white){intnum=0,max_num,max_temp=0;intx_temp=x,y_temp=y;intx_temp1=x_temp,y_temp1=y_temp;//judgerightfor(inti=1;i<5;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}//judgeleftx_temp1=x_temp;for(inti=1;i<5;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}if(num<5)max_temp=num;//judgeupx_temp1=x_temp;y_temp1=y_temp;num=0;for(inti=1;i<5;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}//judgedowny_temp1=y_temp;for(inti=1;i<5;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judgeleft_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(inti=1;i<5;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0||x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}//judgeright_downx_temp1=x_temp;y_temp1=y_temp;for(inti=1;i<5;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height||x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;//judgeright_upx_temp1=x_temp;y_temp1=y_temp;num=0;for(inti=1;i<5;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0||x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}//judgeleft_downx_temp1=x_temp;y_temp1=y_temp;for(inti=1;i<5;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height||x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==black_or_white)num++;elsebreak;}if(num>max_temp&&num<5)max_temp=num;max_num=max_temp;returnmax_num;}//判断胜负publicbooleanjudgeSuccess(intx,inty,booleanisodd){intnum=1;intarrvalue;intx_temp=x,y_temp=y;if(isodd)arrvalue=2;elsearrvalue=1;intx_temp1=x_temp,y_temp1=y_temp;//判断右边for(inti=1;i<6;i++){x_temp1+=1;if(x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断左边x_temp1=x_temp;for(inti=1;i<6;i++){x_temp1-=1;if(x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)returntrue;//判断上方x_temp1=x_temp;y_temp1=y_temp;num=1;for(inti=1;i<6;i++){y_temp1-=1;if(y_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断下方y_temp1=y_temp;for(inti=1;i<6;i++){y_temp1+=1;if(y_temp1>this.height)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)returntrue;//判断左上x_temp1=x_temp;y_temp1=y_temp;num=1;for(inti=1;i<6;i++){x_temp1-=1;y_temp1-=1;if(y_temp1<0||x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断右下x_temp1=x_temp;y_temp1=y_temp;for(inti=1;i<6;i++){x_temp1+=1;y_temp1+=1;if(y_temp1>this.height||x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)returntrue;//判断右上x_temp1=x_temp;y_temp1=y_temp;num=1;for(inti=1;i<6;i++){x_temp1+=1;y_temp1-=1;if(y_temp1<0||x_temp1>this.width)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}//判断左下x_temp1=x_temp;y_temp1=y_temp;for(inti=1;i<6;i++){x_temp1-=1;y_temp1+=1;if(y_temp1>this.height||x_temp1<0)break;if(this.arrMapShow[x_temp1][y_temp1]==arrvalue)num++;elsebreak;}if(num==5)returntrue;returnfalse;}//赢棋后的提示publicvoidshowSuccess(JPaneljp){JOptionPane.showMessageDialog(jp,"你赢了,好厉害!","win",JOptionPane.INFORMATION_MESSAGE);}//输棋后的提示publicvoidshowDefeat(JPaneljp){JOptionPane.showMessageDialog(jp,"你输了,请重新开始!",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论