控制台五子棋游戏类记录

来源:互联网 发布:linux 用户安全设置 编辑:程序博客网 时间:2024/05/29 08:02

这个文档上面的教程和我所理解的有所不同呢,果然还是需要自己来写,文档只是提供了一个大致方向

public class ChessGame {int posX,posY;int WIN_COUNT=5;ChessMap map=new ChessMap();public void newQi(int posx,int posy){//玩家新坐标后更新棋盘map.setMap(posx, posy, ChessQizi.BLACK.getChessqizi());}public void newCom(){//玩家下一步之后,此功能电脑随机走一步int posx=(int)(Math.random()*(map.MAP_SIZE-1));int posy=(int)(Math.random()*(map.MAP_SIZE-1));String[][] board=map.getMap();while (board[posx][posy]!="+"){posX=(int)(Math.random()*(map.MAP_SIZE-1));posY=(int)(Math.random()*(map.MAP_SIZE-1));}map.setMap(posX, posY, ChessQizi.WHITE.getChessqizi());}public boolean inputIegal(int posx,int posy){//判断玩家输入的坐标是否合法boolean t=true;if (posx<0 || posx>=WIN_COUNT || posy<0 || posy>=WIN_COUNT)t=false;return t;}public boolean isWin(int posx,int posy){//判断是否有胜利int startX=0;int startY=0;int endX=map.MAP_SIZE-1;int endY=endX;int sameCount=0;int temp=0;boolean t=false;temp=posx-WIN_COUNT+1;//计算起点的最小X左边与Y坐标startX=temp<0?0:temp;temp=posy-WIN_COUNT+1;startY=temp<0?0:temp;temp=posx+WIN_COUNT-1;//计算终点的最大X坐标与Y坐标endX=temp>map.MAP_SIZE-1?map.MAP_SIZE-1:temp;temp=posy+WIN_COUNT-1;endY=temp>map.MAP_SIZE-1?map.MAP_SIZE-1:temp;String[][] board=map.getMap();for (int i=startY;i<endY;i++)if (board[posx][i]==board[posx][i+1])//这里只是横向判断有无五子,竖向和斜向只需更改board里的坐标即可sameCount++;else if(sameCount!=WIN_COUNT-1)sameCount=0;if (sameCount==5)t=true;return t;}}
每个函数的功能都有注释,今天主要把时间用在了这个判断输赢,也就是五棋相连上。

1.每次下完一颗棋子,就通过程序从横、竖、斜各个方向扫描棋盘,如果在某个方向中,有同种颜色的棋子达到五连子,则此颜色的玩家为赢。如果没有相同颜色的棋子达到五连子,则继续游戏。该判断方法需要遍历整个棋盘,也就是意味着每次下棋后(玩家或者“电脑”)都需要对棋盘进行遍历,这样对程序的性能会造成一定的影响。

2.每次下完一颗棋子,以该棋子为中心,扫描在此棋子所在范围内的横、竖、斜方向,验证加上此棋子有没有形成五连子,如果形成五连子,则下棋子的玩家为赢。此方法与前面的方法比较,因为不需要扫描整个棋盘,所以更加快速,本章程序使用的是此方法。

可以看出,(00),(03),(06),(30),(60),(37),(73),(77)这些坐标都是此黑棋能形成五连子的最小或者最大位置的棋子,如果各个方向有足够的空间,就延伸到第五颗棋子,如果没有,就只延伸到边界。所以,只要能计算出任意一颗棋子的这些位置,我们就可以判断游戏的输赢,并且是以该棋子为中心向周围进行遍历。

首先是计算出在这颗棋子的直线上(横、竖、斜方向)能达到五连子的最小xy坐标与最大xy坐标,然后从最小xy坐标访问到最大xy坐标,如果此颜色棋子的相连累积数目达到五连子,则为赢。以上代码只是实现横向遍历判断,竖向遍历与斜向遍历的判断方法与横向遍历的实现基本类似。这里需要注意的是,当遇到一个可以相边的棋子,就需要为sameCount值加1

以上为文档里面的教程,移过来供大家学习参考。

然后今天还有一个问题就是,现在写的是类,这个类里面的属性posX,posY应该如何使用,差点搞不明白,都是在按自己的逻辑思维在写。现在我可以很清晰的讲出我写的意思,就等最后再看吧,有问题了再解决。



0 0
原创粉丝点击