您好,欢迎访问三七文档
当前位置:首页 > 电子/通信 > 综合/其它 > 疯狂JAVA讲义课后习题解析
第1章控制台五子棋第1章控制台五子棋1.1引言控制台五子棋,顾名思义,就是在Java控制台运行的五子棋游戏,需要用户用键盘输入棋子的位置来进行游戏。由于是在控制台下面运行的程序,所以并没有漂亮的游戏界面,与及鼠标操作等东西,只是在一片黑色控制台环境下进行游戏,游戏的可玩性并不高,似乎这并不是一个完整的游戏。虽然如此,但事实上,一个程序昀重要的并不是界面,而是处理各种业务逻辑与数据的方法,只要掌握了核心的方法,掌握基础的知识,便更容易学习awt,swing等图形用户界面的编写,万变不离其宗,写起有操作界面的程序也会变得更加容易,更加随心应手。而本章的主要目的让读者掌握与理解Java编程的基础知识,因此,掌握本章五子棋的实现原理,对于学习以后的章节将会非常有帮助。作为本书的第一章内容,我们在本章中将使用昀简单的方式来实现一个控制台五子棋游戏。1.1.1五子棋介绍五子棋是起源于中国古代的传统黑白棋种之一。现代五子棋日文称之为“连珠”,英译为”Renju”,英文称之为”Gobang”或”FIR”(FiveinaRow的缩写),亦有“连五子”、“五子连”、“串珠”、“五目”、“五目碰”、“五格”等多种称谓。五子棋游戏是一个比较大众的棋类游戏,大多数人都会玩这个游戏,五子棋的玩法与规则如下:五子棋是两个人之间进行的竞技活动,由于对黑方白方规则不同,黑棋必须先行(本章节设计的游戏,黑棋与白棋的规则一样,但一样由黑棋先下)。五子棋专用盘为15×15,五连子的方向为横、竖、斜。在棋盘上以对局双方均不可能形成五连为和棋。首先形成五连子的一方为赢。五子棋必须由双方进行游戏,当某一方按照一定规则连成五个棋子的时候,该游戏方就胜利,在本章中,我们并不需要做到对战形式的,我们可以设计一个简单的“电脑”来做我们的对手,当我们下完棋后,这个简单的“电脑”就随便在棋盘中下一个棋,当然,如果想做更强大的“电脑”我们可以编写程序来实现,当我们下棋的时候,这个“电脑”就对我们所下的棋子进行检测,并将棋子下到昀恰当的位置。本章主要目的是展现五子棋的实现原理,如果读者有兴趣,可以自行开发强大的“人工智能电脑”来进行游戏。1.1.2输入输出约定玩家必须以(x,y)的方式输入棋盘的坐标,其中,x代表棋坐标,y代表竖坐标。x与y的值必须是1到N(棋盘的大小)的正数。系统询问玩家是否继续游戏时,玩家输入y是代表继续,输入其它则代表退出游戏。“●”代表黑子,“○”代表白子。当玩家以(x,y)的形式输入下棋的坐标后,游戏中就可以根据玩家所下的坐标,再去将棋子放置到棋盘中。我们可以将棋盘看作一个二维数组,填充着棋盘式的标志(“十”),玩家下棋后,将棋子替换原来的标志,昀后再执行输入。由于本章是在控制台中进行打印,因此只需要使用System.out.println来进行打印即可,如果需要实现有界面的五子棋游戏,例如使用第1章控制台五子棋·2·swing或者awt,可以使用相应的方法,将二维数组“画”到界面中。因此,不管是使用swing、awt或者其他界面技术,五子棋的实现原理几乎大同小异。1.2了解游戏流程描述在开发五子棋之前,我们先了解一下游戏的整个游戏流程,了解游戏的流程,有助于我们在开发的过程中可以清晰的掌握程序结构,对于实现功能有莫大的帮助,五子棋的具体流程如图1.1所示。图1.1五子棋游戏流程1.2.1玩家输入坐标游戏开始,系统在控制台中打印出棋盘,玩家根据这个棋盘,选定下棋的位置坐标后,在控制台中输入相应的坐标,系统读取玩家所输入的坐标并进行相应的分析,如果玩家所下的棋使得玩家游戏胜利,则系统询问是否继续游戏。系统读取了玩家输入的坐标后,除了判断游戏是否胜利外,还需要判断玩家输入的坐标中是否已经存在了相应的棋子,如果存在的话,需要再次提示玩家,重新输入。第1章控制台五子棋·3·1.2.2“电脑”下棋玩家输入了坐标,系统判断玩家没有游戏胜利后,就应该轮到“电脑”下棋,在本章的开头中我们已经讲到,本章可以实现一个简单的电脑来进行游戏,只需要随便的产生棋盘坐标,就可以让“电脑”在相应的坐标中下棋。如果电脑随机产生的坐标中已经存在棋子,那么我们可以重新随机产生坐标,直到产生的坐标上没有存在棋子为止。当“电脑”下完棋后,就可以使用同样的判断方式(判断是否五子相连)来判断“电脑”所下的棋子是否已经使得游戏胜利,如果游戏胜利,同样地去提示玩家,电脑已经胜利了。在本章我们并不需要实现强大的人工智能“电脑”,只需要简单的随机产生坐标即可。1.3创建游戏的各个对象这里设计三个类来完成游戏的功能,棋盘类(Chessboard),游戏类(GobangGame)与棋子类(Chessman)(枚举类),类的关系如图1.2所示,从图中可以看出,Chessboard依赖于GobangGame,gobangGame的改变,会影响到Chessboard状态的改变,而Chessman与GobangGame是一个聚合关系。下面一一介绍。图1.2五子棋类图第1章控制台五子棋·4·1.3.1Chessboard类要进行五子棋游戏,必须有有一个棋盘,而这个类主要控制棋盘的初始化,输出与及增加新的棋子。这个类包含以下方法:voidinitBoard(),这个方法用于初始化棋盘,开始新的游戏时,应该调用此方法,初始化出一个新的空棋盘。voidprintBoard(),此方法用于在控制台输出棋盘,各方每一完一颗棋子后,由于棋盘上棋子的状态有改变,所以必须调用此方法重新输入棋盘。voidsetBoard(intposX,intposY,Stringchessman),posX与posY是新下棋子的x与y坐标,,chessman是新下棋子的类型(黑子与白子),每下完一颗棋子后,通过调用此方法把棋子设置到棋盘上。String[][]getBoard(),返回棋盘,返回类型是保存棋盘的二维数组。当我们需要初始化棋盘的时候,可以直接调用Chessboard的initBoard方法,我们需要考虑该方法需要实现的功能:初始化棋盘。由于我们将棋盘看作是一个二维数组,因此initBoard就需要帮我们去创建一个二维数组,创建二维数组可以使用以下代码。代码清单:code\gobang\src\org\crazyit\gobang\Chessboard.javaObject[][]array=newObject[size][size];for(inti=0;iarray.length;i++){for(intj=0;jarray[i].length;j++){array[i][j]=newObject();}}以上代码创建一个固定大小(一维与二维大小)的二维数组,再通过嵌套循环为数组中的每一个元素进行赋值。在游戏中如果我们进行了下棋的操作,可以直接改变这个数组的某一个元素值。在创建Chessboard类时,我们就需要发挥面向对象的思维,在我们的程序中,所有看到的或者想的事物,我们都可以将其抽象成具体的某个对象,并赋予一定的属性与行为。在设计对象的过程中,如果有某些事物拿捏不准,不知如何设计属性或者行为,可以将其设计成接口或者抽象类。Chessboard中提供了一个printBoard的方法用于打印棋盘,在本章中,我们就需要将棋盘数组打印到控制台中,因此该方法可以简单的调用System.out.print去打印相关的字符串。需要注意的是,由于printBoard方法是没有参数的,因此我们需要为Chessboard提供一个二维数组变量,当调用printBoard方法的时候,将对象内的二维数组打印,我们可以将Chessboard看作一个有状态的Java对象,有状态的Java对象可以理解成一个Java对象保存一些与该对象相关的状态属性,如果该对象没有保存与该对象相关的状态属性,那么我们可以将这个对象看成一个无状态的Java对象。当外部调用Chessboard的setBoard方法时,就可以将某个值设置到Chessboard中的二维数组里,告诉Chessboard玩家或者“电脑”在某个位置下了怎样的棋子。1.3.2Chessman类Chessman类是一个枚举类,此类是构造器私有的,不能直接创建,里面有BLACK与WHITE两个静态属性,代表黑子与白子枚举类,两个表态属性都是Chessman类型的,要获取棋子,则通过这两个属性调用以下的方法获取棋子:StringgetChessman(),返回String类型的棋子实例,“●”或者“○”。如果我们需要得到棋子的字符串(“●”或者“○”),可以使用以下的代码。代码清单:code\gobang\src\org\crazyit\gobang\Chessman.javaChessman.BLACK.getChessman();第1章控制台五子棋·5·1.3.3GobangGame类GobangGame类是进行游戏的类,Chessboard依赖于此类,此类控制游戏的开始,重玩与结束,并影响Chessboard类。主要包含以下构造器与方法:GobangGame(),默认无参数构造器。GobangGame(Chessboardchessboard),有参数构造器,以一个Chessboard实例去初始化这个类。booleanisValid(StringinputStr),此方法验证控制台的输入字符串是否合法,如果合法,返回true,如果不合法,则返回false,此方法抛出Exception异常。voidstart(),开始游戏。此方法抛出Exception异常。booleanisReplay(Stringchessman),是否重新开始游戏,如果是,返回true,否则返回false,参数chessman代表黑子或白子。int[]computerDo(),计算机随机下棋,由计算机自动设置棋盘,并返回包含新下棋子位置x与y坐标的int[]数组类型。booleanisWon(intposX,intposY,Stringico),判断输赢,参数posX与posY代表新下棋子的x与y坐标,ico代表新下的棋子类型,如果赢了,返回true,否则返回false。GobangGame是我们五子棋游戏的主体类,游戏里面所有的处理都在该类中实现。GobangGame中的isValid方法用于验证控制台的输入,玩家主要在控制台输入下棋的坐标,下棋的坐标的字符串形式为:x,y,我们需要对字符串进行处理得到x和y的值,如果玩家输入的字符串不符合系统要求,则isValid方法返回false,只有当该方法返回true的时候,才会去修改Chessboard的二维数组。GobangGame中提供了一个start方法,用于游戏的开始,我们需要考虑游戏开始的行为,例如需要初始化棋盘(调用Chessboard的init方法),需要开始从控制台读取玩家的输入信息、打印棋盘,验证控制台输入的信息等,这些功能我们将在下面的章节中加以描述。当轮到“电脑”下棋的时候,我们需要随机生成电脑的下棋坐标,GobangGame中的computerDo方法用于随机产生坐标。判断一局游戏是否胜利,可以调用GobangGame的isWon方法,该方法判断游戏是否胜利,是五子棋中昀主要的方法,五子棋是否可以相连的所有逻辑,都会在该方法中实现。isWon方法会在每次下棋后(玩家下棋或者“电脑”下棋)调用。到此,游戏中的三个对象已经设计完成,这三个对象中已经定义好了各种方法,并在前面章节中详细描述了各个方法的作用,在下面章节中我们将开始对这三个对象所定义的方法进行实现。当然,如果需要做到更好的程序解耦,我们可以使用一些设计模式,例如将游戏规则写成一个具体的算法,可以使用策略模式,如果需要产生出不同的棋子(将控制台换成其他界面),可以编写棋子工厂等。但是本章主要目的是展现一个昀简单的五子棋,因此本章中并不涉及任何具体的设计模式。1.4棋盘类实现在此类中,主要是用一个String[][]类型的二维数组board去保存棋盘,board[i][j
本文标题:疯狂JAVA讲义课后习题解析
链接地址:https://www.777doc.com/doc-4310697 .html