控制台五子棋游戏类记录
来源:互联网 发布: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.每次下完一颗棋子,以该棋子为中心,扫描在此棋子所在范围内的横、竖、斜方向,验证加上此棋子有没有形成五连子,如果形成五连子,则下棋子的玩家为赢。此方法与前面的方法比较,因为不需要扫描整个棋盘,所以更加快速,本章程序使用的是此方法。
可以看出,(0,0),(0,3),(0,6),(3,0),(6,0),(3,7),(7,3),(7,7)这些坐标都是此黑棋能形成五连子的最小或者最大位置的棋子,如果各个方向有足够的空间,就延伸到第五颗棋子,如果没有,就只延伸到边界。所以,只要能计算出任意一颗棋子的这些位置,我们就可以判断游戏的输赢,并且是以该棋子为中心向周围进行遍历。
首先是计算出在这颗棋子的直线上(横、竖、斜方向)能达到五连子的最小x、y坐标与最大x、y坐标,然后从最小x、y坐标访问到最大x、y坐标,如果此颜色棋子的相连累积数目达到五连子,则为赢。以上代码只是实现横向遍历判断,竖向遍历与斜向遍历的判断方法与横向遍历的实现基本类似。这里需要注意的是,当遇到一个可以相边的棋子,就需要为sameCount值加1。
以上为文档里面的教程,移过来供大家学习参考。
然后今天还有一个问题就是,现在写的是类,这个类里面的属性posX,posY应该如何使用,差点搞不明白,都是在按自己的逻辑思维在写。现在我可以很清晰的讲出我写的意思,就等最后再看吧,有问题了再解决。
- 控制台五子棋游戏类记录
- 控制台游戏 五子棋
- 简单的控制台五子棋游戏
- 简单的控制台五子棋游戏
- 控制台游戏——五子棋
- C# 控制台实现的五子棋游戏
- JAVA实现简单控制台五子棋游戏
- 控制台五子棋
- 简单的控制台五子棋游戏(人VS人)
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- 五子棋游戏
- java程序--控制台五子棋
- 五子棋控制台显示
- 控制台小游戏之五子棋
- Android进阶之线程池
- 实现自己的EventBus
- 如何求二进制表示中“1”的个数
- Android使用xml旋转图片,个人记录
- Apache commons (Java常用工具包)简介
- 控制台五子棋游戏类记录
- 导入v4库源码
- leetcode012 Integer to Roman
- 自定义view之一:自定义验证码控件
- QQ也可以和微信一样只能共同好友见评论
- matlab图像数据转换函数
- 问题 A: 输入字符串以及输出
- 123
- lintcode: Balanced Binary Tree