五子棋游戏总体设计与实现_第1页
五子棋游戏总体设计与实现_第2页
五子棋游戏总体设计与实现_第3页
五子棋游戏总体设计与实现_第4页
五子棋游戏总体设计与实现_第5页
已阅读5页,还剩4页未读 继续免费阅读

下载本文档

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

文档简介

/4.系统总体设计和实现4.1总体设计分析总体设计是软件开发过程中的另一个重要阶段,在这一阶段中将依据需求分析中提出的逻辑模型,科学合理地进行物理模型的设计。这个阶段的主要目标是将反映用户信息需求的逻辑方案转换成物理方案,并为下一阶段供应必要的技术资料。4.1.1总体设计原则(1)整体性:软件是作为统一整体而存在的。因此,在总体设计中要从整个软件的角度进行考虑。(2)敏捷性:为保持软件许久的生命力,要求该手机嬉戏软件具有很强的环境适应性。为此,嬉戏软件应具有较好的开放性和结构的可变性。(3)牢靠性:牢靠性是指软件抵挡外界干扰的实力及受外界干扰时的复原实力。(4)经济性:经济性是指在满意嬉戏软件需求的前提下,尽可能地减小嬉戏软件的开销。4.1.2软件模块总体设计软件中各模块之间的关系通常利用层次图来表示。它是一种一系列多层次的用树形结构的矩形框描绘数据的层次结构框图。一个单独的矩形框作为树形结构的顶层,各个数据的子集由下面的各层矩形框代表,最底层的各个矩形框代表组成这个数据的实际数据元素(不能再分割的元素),它代表完整的数据结构。这模式特别适合于需求分析阶段的须要,层次方框图对数据结构描绘随着结构精细化也越来越具体。反复细化沿着图中每条路径,从对顶层信息的分类起先,直到确定了数据结构的全部细微环节为止。图4-1嬉戏功能结构本探讨中将嬉戏软件分为三大模块,如图4-1所示,包括:嬉戏选项、嬉戏设置和帮助。依据在调研中搜集的资料对每个模块的功能进行编排制作。依据上述功能的分析,本探讨中,将嬉戏软件在三大模块的基础上又对每一大模块又分为几个子模块:嬉戏选项包括六个模块:起先嬉戏、重新嬉戏、悔棋、认输、背景音乐和退出嬉戏。嬉戏设置包括三个模块:先后手设置、棋盘底纹颜色设置和棋盘大小设置。帮助包括两个模块:嬉戏帮助和关于。4.2嬉戏设计4.2.1嬉戏前的打算本嬉戏在开发之前须要做一些前期打算工作,尤其是对于精通五子棋嬉戏的Java嬉戏开发者来说。通常状况下,一款运用起来比较娴熟地J2ME开发工具是必不行少的。本嬉戏运用的是J2ME的简化开发工具SunJava(TM)WirelessToolkit2.5.2forCLDC,他需先将Java虚拟机安装调试好之后才能运用。WTK2.5.2不带有文本编辑功能,所以须要另寻搭配运用。本嬉戏采纳UltraEdit进行编辑。本嬉戏须要几张后缀名为.png格式的卡通图,除了一张用作五子棋嬉戏的Logo外,其余的都将在嬉戏中运用。4.2.2嬉戏界面和事务驱动设计嬉戏的界面设计实行传统嬉戏界面风格,如图4-2所示。嬉戏设计中采纳传统界面嬉戏风格,首先启动嬉戏,然后进入嬉戏起先界面,界面中放置“设置”、“开局”、“帮助”、“关于”四个选项供玩家选择。其中“设置”选项主要是对嬉戏的相关功能进行设置,如嬉戏难度设置。另外还有“悔棋”、“重玩”等项目的设置。除此之外还包括查看嬉戏帮助、嬉戏介绍等。图4-2嬉戏界面设计所谓事务驱动,简洁地说就是你点什么按钮(即产生什么事务),电脑执行什么操作(即调用什么函数)。当然事务不仅限于用户的操作。我们知道,事务是事务驱动的核心自然是。从事务角度说,一个事务收集器、一个事务发送器和一个事务处理器组成了事务驱动程序的基本结构。事务收集器特地负责收集包括来自硬件的(如时钟事务等)、来自用户的(如键盘、鼠标事务等)及来自软件的(如应用程序本身、操作系统等)的全部事务。将收集器收集到的事务分发到目标对象中则由事务发送器负责完成。具体的事务响应工作则由事务处理器完成,它须要运用虚函数机制(函数名取为类似于HandleMsg的一个名字),它往往要到实现阶段才完全确定。事务处理器对于框架的运用者来说是他们唯一能够看到的。棋类嬉戏通常具备两个重要特性,首先是对战双方轮番落子,其次是落子间隔通常是不确定的,尤其是对战后期,可能每一步棋都要经过深思熟虑,无论是人还是计算机,都无法对时间间隔有事先的预期。基于以上两个特性,本嬉戏摒弃了大多数嬉戏采纳的线程或定时器驱动嬉戏的方法,而采纳了事务驱动的方法,即玩家的键盘或触摸笔触发嬉戏的下一个动作。事务驱动大大削减了不必要的工作量,只有玩家发出消息时,计算机才启动运算,而在玩家思索期间,计算机不做任何运算和重绘操作。4.2.3嬉戏的类设计五子棋嬉戏属于二维棋类嬉戏,因此可以定义一个Chesses类来表示棋子,用一个Chess类型的二维数组来包含棋盘上的全部棋子,对于该棋子玩家的区分运用Chesses的boolean型的变量isPlayer1来区分。可以考虑干脆生成数组的每一个对象而不是在数组建立后,而是把每一个棋子对象(Chesses)放在嬉戏的进行中生成,这主要是考虑到移动设备的资源有限,尽可能削减系统资源占用。这样在嬉戏进行时,可以避开还没有下的棋子在一起先就占用了系统内存,玩家每下一步棋,在数组相应位置生成该棋子的对象。对于嬉戏中的每一类的设计,首先就是一个MIDlet类,Gobang类继承自MIDlet类,通过方法startApp,pauseApp,destroyApp来通知嬉戏的起先,暂停和销毁结束,用于连接设备的应用程序管理器(ApplicationManager)。本嬉戏共由7个类组成,它们各自的功能如下:(1)GobangMIDlet类负责程序的启动和屏幕之间的切换;(2)GobangCanvas类玩家的对战平台,他继承于Canvas类;(3)Setting类用于创建嬉戏的各项设置参数表单;(4)GobangLogic类嬉戏的逻辑类,负责输赢推断和计算机落子;(5)Dot类棋子类,包含了棋子的位置信息;(6)Help类嬉戏的帮助类,包含五子棋的一些常识信息和五子棋教学内容;(7)About类嬉戏的关于类,包含嬉戏的版本、版权等信息。各个类之间的关系如图4-3所示:图4-3嬉戏类设计4.2.4嬉戏的流程设计对于棋盘界面的更新,嬉戏进行绘制棋子时是依据棋子的二维数组来完成的,玩家下棋后,设置isPlayer1值,程序修改数组相应位置,然后重新绘制(repaint)。为了使嬉戏的操作尽可能的简便,本文设计上不在嬉戏进入时设计菜单,玩家可以干脆起先对战,而是在起先嬉戏的过程中设置重新起先和退出的按钮。即一键起先,运行即玩,重来或退出都运用一键操作。嬉戏流程的设计依据主要是嬉戏的界面设计和嬉戏的类的设计。嬉戏启动时,GobangMIDlet对象先显示嬉戏的主屏幕,在屏幕下方一侧是出软键(软键指描述抽象客户端设备如何显示),另一侧是用软件构成的菜单,菜单元素主要有“开局”、“嬉戏设置”、“嬉戏帮助”、“关于”选项。当玩家选择“嬉戏设置”软键时,则显示嬉戏参数设置表单;当玩家选择“开局”软键时,则显示嬉戏对战主界面;当玩家选择“嬉戏帮助”软键时,则显示嬉戏帮助表单;当玩家选择“关于”软键时,则显示嬉戏关于表单。玩家进入嬉戏参数设置表单,当玩家按下“确定”软键时,则确认当前嬉戏参数,返回嬉戏主屏幕;当玩家按下“取消”软键时,则放弃此次对嬉戏的修改,干脆返回嬉戏主屏幕。玩家进入嬉戏对战画布,对战中画布有两个软键,当玩家按下“返回主菜单”软键时,则退出嬉戏到达嬉戏主菜单;当玩家按下“悔棋”软键时,则进行悔棋操作;当嬉戏结束时,“悔棋”软键被换成了“重玩”软键。玩家进入嬉戏介绍表单,当玩家按下“确定”软键时,返回嬉戏主屏幕。4.2.5嬉戏算法的设计1、五子棋的获胜组合有哪些获胜组合是在一场五子棋的嬉戏中计算机必须要知道的,因此,获胜组合的总数必须要求得。在本文中我们假定当前的棋盘为15*15:(1)每一列的获胜组合是11,共15列,计算水平方向的获胜组合数,所以水平方向的获胜组合数为:11*15=165。(2)每一行的获胜组合是11,共15列,则可计算垂直方向的获胜组合总数,垂直方向的获胜组合数为:11*15=165。(3)同理,可计算正对角线方向的获胜组合总数,正对角线上的获胜组合总数为11+(10+9+8+7+6+5+4+3+2+1)*2=121。(4)计算反对角线上的获胜组合总数。计算反对角线方向的获胜组合总数可计算为11+(10+9+8+7+6+5+4+3+2+1)*2=121。这样可计算得全部的获胜组合数为:165+165+121+121=572。2、设计获胜棋型通过上面的计算,一个15*15的屋子棋盘在此已经计算出了会有572中获胜方式,因此,我们就可以利用数组建立一些常规棋型,棋型的主要作用是:(1)推断是否有任何一方获胜;(2)依据当前格局推断最可能的落子方式。然而在现实中,高手留给我们的阅历就是把握前奏,如“冲四”、“活三”,除了“连五”以外,这些也是同向成功的捷径。3、攻击和防守获胜棋型的算法是中性的,不区分计算机和玩家,这就涉及到攻击和防守何者优先的问题。而很多高手都认为五子棋的根本是“防守”,“攻击”是灵魂。进攻是取胜的手段,是防守的持续和发展。很多阅历和探讨表明,一个棋手只要驾驭了全面的、基本的防守原理和技巧,就能和比自己棋力高一个等级的进攻型选手对抗,至少能立于不败之地。对手进过越偏激,则防守的效果越好。没有进攻的防守就像只开花不结果,没有实际意义,坚韧的防守是反攻的前奏,没有进攻的持续,防守也失去了价值。而这缺一不行。依据以上原理,计算机在接受最佳的攻击位置之前,还要计算当前玩家的最佳攻击位置。假如玩家存在最佳攻击位置,那么计算机就将下一步的棋子摆在玩家的最佳攻击位置上以阻挡玩家的进攻,否则计算机便将棋子下在自己的最佳攻击位置上进行攻击。4、用到的典型算法(1)坐标变换算法嬉戏的实质其实是对所下棋子的位置进行操作和推断,因此将己方、对方以及棋盘上空点的位置坐标存储在相应的List中。我对所下棋子的坐标进行了处理,因为我所采纳的棋盘为15*15,所以棋子横坐标为0到14的整数,纵坐标也为0到14的整数。因此,每次在棋盘上下子之后,计算机在存储该点的坐标时,便要对坐标进行加工。假设左上角点为firstPoint,它的实际坐标为(x1,y1),而我是将它作为(0,0)存储的,其它的坐标,其它点都是以该点为标准进行变换的,假设棋盘上每个格子的宽度为w,某实际点为(x2,y2),变换后的坐标为(x,y),x=(x2-x1)/w,y=(y2-y1)/w。(2)输赢推断算法输赢推断的规则很简洁,就是推断嬉戏双方的棋子在同一条水平线、同一条竖线或是同一条斜线上谁先出现5个连续的棋子,谁先达到这样的目标,谁就获得成功。在本设计中,是在每次下完一个子后进行推断,看己方是否达到了成功的标准,若成功嬉戏便结束;否则,嬉戏接着。(3)人工智能算法人工智能算法的主体思想分为以下三个步骤:第一步:依据双方的当前的形势循环地假设性的分别给自己和对方下一子(在某个范围内下子),并推断此棋子能带来的形势上的变更,如能不能冲4,能不能形成我方或敌方双3等。其次步:依据上一步结果,组合每一步棋子所带来的全部结果(如某一步棋子可能形成我方1个活3,1个冲4(我叫它半活4)等),包括敌方和我方的。第三步:依据用户给的规则对上一步结果进行排序,并选子(有进攻形、防守形规则)。5、典型类的具体设计(1)应用程序类Gobang类用于连接设备的应用程序管理器(ApplicationManager),Gobang类继承自MIDlet类,通过Gobang类的方法startApp,pauseApp,destroyApp来通知嬉戏的起先,暂停和销毁结束。源代码如下:packagecom.occo.j2me.game.gobang;importjavax.microedition.lcdui.Display;importjavax.microedition.midlet.MIDlet;publicclassGobangextendsMIDlet//定义嬉戏界面的Canvas类GobangCanvas的对象Gobangpublic{GobangCanvasgobang;Gobang(){super();gobang=newGobangCanvas(this);//生成GobangCanvas类的对象gobang}protectedvoidstartApp(){Display.getDisplay(this).setCurrent(gobang);}protectedvoidpauseApp(){}protectedvoiddestroyApp(booleanarg0){}}//在屏幕上绘出嬉戏见面gobang(2)嬉戏界面类GobangCanvas类继承自Canvas,嬉戏的核心类是GobangCanvas类,此类将完成嬉戏的绘图、互动、限制、逻辑、等全部功能,此类的框架代码如下:Packagecom.occo.j2me.game.gobang;importjavax.microedition.lcdui.Displayable;importjavax.microedition.lcdui.Command;importjavax.microedition.lcdui.Canvas;importjavax.microedition.lcdui.CommandListener;publicGobangCanvas(Gobanggobang){this.gobang=gobang;}protectedvoidpaint(Graphicsg){}importjavax.microedition.lcdui.Graphics;publicclassGobangCanvasextendsCanvasimplementsCommandListener{protectedGobanggobang;publicGobangCanvas(){}}(3)棋子类整个棋盘是一个Chesses类型的二维数组,棋盘上的每一个棋子都对应着一个Chesses的对象,此类定义了一个棋子,源代码如下:packagecom.occo.j2me.game.gobang;publicChesses(){}publicclassChesses{booleanisPlayer1;publicChesses(booleanisPlayer1){this.isPlayer1=isPlayer1;}}4.3嬉戏实现4.3.1主类的实现YpkWuZiQiActivity类是五子棋嬉戏的主类,同时也是五子棋嬉戏的入口,它继承自Activity类。进入程序后,首先调用init()方法,init()方法通过调用setContentView(R.layout.welcomeview)显示登录该嬉戏的第一个界面。welcomeview.xml是一个布局文件,里面存储了界面信息。该界面中有四个Button,分别为welButton1、welButton12、welButton3、welButton4,点击每个Button都会触发一个事务,其中点击welButton1和welButton2还会给它的成员变量FIGHTINGMODE赋值,因为在人人对战和人机对战是写在同一个ChessBoard类中的,所以须要通过FIGHTINGMODE的值来区分是人人对战还是人机对战。点击welButton1时,FIGHTINGMODE=1,然后会调用initTwo()方法,该方法通过调用setContentView(R.layout.chess)方法,来显示对战的界面。chess.xml文件存储了对战界面的信息。在chess.xml文件中调用了ChessBoard类,该类中主要定义了棋盘的信息,下文会对该类做具体的介绍的。在对战界面中也有四个Button,分别是b1、b2、b3、b4。首先来介绍一下b2,该Button的功能是返回主页,调用init()方法就可以实现。b3的功能是重新起先,这个也只须要调用initTwo()方法。b3的功能是退出,调用了系统方法:System.exit(1)。下面重点介绍一下b1,该Button的功能是悔棋。该Button设定的点击事务具体内容如下:b1.setOnClickListener(newOnClickListener(){publicvoidonClick(Viewv){ChessBoardchess=(ChessBoard)findViewById(R.id.chess);Pointtemp=null;if(chess.whoRun==1){ if(chess.firstPlayer.getMyPoints().size()>=1&&chess.secondPlayer!=null){temp=chess.secondPlayer.getMyPoints().get(chess.secondPlayer.getMyPoints().size()-1);chess.secondPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);temp=chess.firstPlayer.getMyPoints().get(chess.firstPlayer.getMyPoints().size()-1);chess.firstPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);chess.freshCanvas(); } }if(chess.whoRun==2){if(chess.firstPlayer.getMyPoints().size()>=1&&chess.secondPlayer!=null){temp=chess.firstPlayer.getMyPoints().get(chess.firstPlayer.getMyPoints().size()-1);chess.firstPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);temp=chess.secondPlayer.getMyPoints().get(chess.secondPlayer.getMyPoints().size()-1);chess.secondPlayer.getMyPoints().remove(temp);chess.freePoints.add(temp);chess.freshCanvas(); } }}})首先获得ChessBoard对象,该对象继承自View,具体的定义了棋盘信息,主要负责显示棋盘的内容。接下来推断一下触发悔棋事务的是哪一个玩家,再推断是否符合悔棋的条件,这个条件很简洁,就是棋盘上至少要有两个棋子。之后便进行悔棋操作,分别将两个玩家最终下的棋子取出,程序实现就是将两个ArrayList的最终一个元素remove出来,再分别放到记录棋盘中没有棋子的点的集合中,最终更新一下画布,主要是调用ChessBoard的invalidate()方法。通过以上步骤之后,呈现在我们面前的便是悔完棋的画面了。点击welButton2时,FIGHTINGMODE=2,之后的步骤便会点击welButton1是相同的了,不同的是,由于对战模式的变更,从人人对战变成了人机对战。点击welButton3时,通过initThree()方法调用setContentView(R.chess)方法实现网络对战。具体的对战实现细微环节将会在下文一一介绍。在这个界面中只保留了两个Button:b2和b4。这两个Button所实现的功能和上面的b2和b4是相同的。最终,welButton4比较简洁。它所实现的功能为退出应用程序,调用System.exit(1)方法。4.3.2嬉戏设置类的实现嬉戏设置表单用来对嬉戏参数进行设置,包括棋盘大小、先手选择、智能级别。表单中运用了Gauge和ChoiceGroup两种高级用户界面组件。1、棋盘尺寸选择标准的五子棋棋盘为15*15,但为了满意不同玩家的需求,这里供应了大小为10*10到20*20的棋盘,用户可以通过Gauge组件变更。棋盘的最小值为10,而Gauge组件的最小值为0,所以当前的Gauge值须要角上10才是当前棋盘大小。创建Gauge组件的代码如下:form=newForm("嬉戏设置");//创建参数设置表单并添加标签gaugeSize=newGauge("棋盘规格:"+boardSize+"X"+boardSize,true,10,boardSize-10);//棋盘规格form.append(gaugeSize);图4-4棋盘尺寸的设计在Gauge交互模式下可以为Gauge对象所在的表单对象绑定一个ItemStateListener事务监听器,并在监听器上捕获Gauge对象的事务,当Gauge的值发生变更时就会触发事务。这里将依据Gauge的当前值变更标签,显示当前的棋盘大小。其代码如下:publicvoiditemStateChanged(Itemitem){if(item==gaugeSize)//当Gauge组件发生变更时{intbs=gaugeSize.getValue()+10;//获得当前的Gauge值并计算棋盘大小(加10)gaugeSize.setLabel("棋盘规格:"+bs+"X"+bs);//变更Gauge组件的标签}}2、难度选择嬉戏的难易程度依据计算机的智能级别来限制,创建及添加选项的方法和复选框一样,所不同的是在创建ChoiceGroup对象时,类型设置为1(单选)。对于单选框,setSelectedIndex只能用来指定某个选项被选中,因此,布尔值selected的值必定为true,否则便没有意义。嬉戏共有3个难度级别,分别是:拜师学艺、棋行天下、谁和争锋(此嬉戏中并未作出区分),初始状况下为拜师学艺,该选项的索引值为0。创建难度选择单选框的代码如下:level=1;//默认状况下的难度级别choicelevel=newChoiceGroup("电脑智能级别:",1);//创建难度级别选项组choicelevel.append("拜师学艺",null);//难度1choicelevel.append("棋行天下",null);//难度2choicelevel.append("谁和争锋",null);//难度3choicelevel.setSelectedIndex(level-1,true);//设置默认状况犯难度1,索引值为0form.append(choicelevel);//将选项组添加到主表单中嬉戏设置选项表单还有两个Command对象,分别用于玩家却热和取消,所以表单须要监听软键事务和组件事务:publicclassSettingimplementsCommandListener,ItemStateListener3、棋手选择选择先手和难度等级用ChoiceGroup组件来实现。ChoiceGroup组件用来构造选择框,其构造函数如下:ChoiceGroup(Stringlabel,intchoiceType)选择先手的选项框为选择组件,属性为复选框,标签名为空。创建好选择组件后,逐条添加选项元素。添加选项的方法如下:intappend(StringstringPart,ImageimagePart)该方法追加一个选项元素到选择组中,追加的选项为选择组中的最终一个元素,选择组的大小加1。对于多选类型的ChoiceGroup,还可以设置个别选项的选择状态。设置初始选择状态的方法如下:voidsetSelectedIndex(intelementNum,Booleanselected)这里创建一个只有一个选项元素的多选框用于玩家设置是否计算机先行,在默认状况下为true,创建完成多选框后将其添加到主表单中,代码如下:ComputerFirst=true;//在默认状况下为计算机先行choiceFirst=newChoiceGroup(null,2);//创建复选框choiceFirst.append("电脑先手",null);//添加选项元素choiceFirst.setSelectedIndex(0,ComputerFirst);//设置多选框的默认状态form.append(choiceFirst);//将多选框添加到主表单中4.3.3棋子类的实现1、棋子的行列位置此五子棋嬉戏是一个二维棋类嬉戏,所以定了了一个Dot类来表示棋子。由于移动设备的局限性,所以程序不在下每一步棋时生成一个对象,而是在嬉戏进行时,玩家或者计算机没下一步棋,在数组相应位置生成该棋子的对象,而将已经下过的棋子保存到数组中随时检索,这样可以避开过多棋子对象占用系统内存。Dot类的UML图如图4-5所示:图4-5棋子行列设计Dot类主要有两个变量row和col,分别表示行和列:publicintrow;//行publicintcol;//列2、检查越位棋子的位置并非是随意的,玩家和计算机每走一步棋之前都要线检查该位置的合法性,即棋子是否在棋盘上,否则判为无效落子。检查是否越界的代码如下:publicbooleanisInBoard(intboardSize)//推断棋子是否越界(超出棋盘){returnrow>=0&&row<boardSize&&col>=0&&col<boardSize;}3、修改棋子位置在创建好Dot对象后,Dot类供应了两种方法更改棋子位置,包括设置行列位置和从已有棋子中复制参数。publicvoidsetRowCol(intr,intc)//设置棋子位置{row=r;col=c;}publicvoidcopyFrom(Dotd)//复制已有的棋子{row=d.row;col=d.col;}4.3.4对战逻辑类的实现1、建立数据结构本程序以数组保存当前盘面的状况,每个位置可能有三种状态:空、玩家的落子、计算机的落子,分别用0、1、2来表示。代码如下:publicstaticintPLAYER_NONE=0;//该位置为空publicstaticintPLAYER_COMPUTER=1;//该位置有电脑的落子publicstaticintPLAYER_HUMAN=2;//该位置有玩家的落子棋盘在初始状况下为空,即棋子上没有任何棋子,在GobangLogic类的构造函数中对棋盘进行初始化:table=newint[boardSize][boardSize];//创建棋盘数组for(intr=0;r<boardSize;r++){for(intc=0;c<boardSize;c++)table[r][c]=0;//初始化盘面为空}除了记录棋盘上每个位置的落子状态外,程序还将对每种状态的位置个数进行统计,以对算法进行简化。对三种状态的统计存储在整型数组中,该数组为全局变量。privateintplayerCounter[];在GobangLogic类的构造函数中对三种状态的计数进行初始化,即棋盘上都是空、计算机的落子或玩家的落子状态的个数为0,在数据结构上,把空也当做某一特别玩家。初始化代码如下:playerCounter=newint[3];//落子状态计数器playerCounter[0]=boardSize*boardSize;//整个棋盘都是空的状态playerCounter[1]=0;//电脑落子0playerCounter[2]=0;//玩家落子02、落子和悔棋这里运用了一个Dot类棋子对象来记录最终一步棋的位置,当玩家下了一步棋后须要将上一步重新绘制,以消退旗子上的引导框。另外,还是用了堆栈来存储最近的几步落子,以便玩家悔棋。privateDotlastDot;//棋子对象,存储最终一步落子privateStacksteps;//棋子对象的堆栈最终一步棋子和棋子堆栈在GobangLogic类的构造函数中进行初始化;lastDot=newDot(boardSize);//创建棋子对象用来存储最终一步棋,初始化位置为棋盘中心steps=newStack();//堆栈对象,用来存储最近的几部棋在棋盘上落子的代码如下:privatevoidgoAt(introw,intcol,intplayer)//电脑或人在row、col位置上走{intlastRow=lastDot.row;//记录上一步的行坐标intlastCol=lastDot.col;//记录上一步的列坐标table[row][col]=player;//当前位置填充玩家代码lastDot

温馨提示

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

评论

0/150

提交评论