Java实现五子棋
代码:
package com.hotusm.datastructure.list; import com.hotusm.datastructure.Log; /**
* @author luqibao
* @date 2017/3/17
*/
public class Chess { public static final int WHITE = ; //白棋
public static final int BLACK = ; //黑棋 private int[][] chessboard;
private int xSize;
private int ySize; public Chess(int size) {
chessboard = new int[size][size];
xSize = size;
ySize = size;
} public Chess() {
chessboard = new int[][];
xSize = ;
ySize = ;
} public void play(int x, int y, int who) { if (x > xSize || y > ySize) {
Log.warn("超出范围!");
return;
}
if (chessboard[x][y] != ) {
Log.warn("该位置不能下");
return;
}
chessboard[x][y] = who;
if (isSuccess()) {
Log.info("who:" + who + "已经获胜");
}
} public boolean isSuccess() {
//x轴
for (int i = ; i < ySize; i++) {
for (int j = ; j < xSize; j++) {
if (xSize - j < ) {
break;
}
if (arriSSame(chessboard[i], j, j + )) {
return true;
}
}
}
//y轴
for (int i = ; i < xSize; i++) {
for (int j = ; j < ySize; j++) {
if (ySize - j < ) {
break;
}
if (arriSSame(copyY2X(chessboard, i), j, j + )) {
return true;
}
}
}
//交叉
if (isCrossSame()) {
return true;
}
return false;
} /**
* 将数组的Y列数据拷贝到一维数组中去
*
* @param arr
* @param y
* @return
*/
private int[] copyY2X(int[][] arr, int y) {
int[] nArr = new int[ySize];
for (int i = ; i < ySize; i++) {
nArr[i] = arr[i][y];
}
return nArr;
} /**
* 是否有5个相同
*
* @param arr
* @param x1
* @param x2
* @return
*/
private boolean arriSSame(int[] arr, int x1, int x2) {
int sameNum = ;
for (int i = x1; i < x2 - ; i++) {
if (arr[i] == arr[i + ] && arr[i] != ) {
sameNum++;
if (sameNum == ) {
return true;
}
} else {
sameNum = ;
}
}
return false;
} /**
* 交叉情况下是否有5个相同
*
* @return
*/
private boolean isCrossSame() {
if (cross(ySize, "Y")) {
return true;
}
if (cross(xSize, "X")) {
return true;
}
for (int x = ; x < xSize; x++) {
int sameNum = ;
for (int i = x - , j = ; i > ; i--, j++) {
if (chessboard[j][i] == chessboard[j + ][i - ] && chessboard[j][i] != ) {
sameNum++;
if (sameNum == ) {
return true;
}
} else {
sameNum = ;
}
}
}
for (int y = ySize - ; y > ; y++) {
int sameNum = ;
for (int i = y - , j = xSize - ; i < ySize - ; i++, j--) {
if (chessboard[i][j] == chessboard[i + ][j - ] && chessboard[i][j] != ) {
sameNum++;
if (sameNum == ) {
return true;
}
} else {
sameNum = ;
}
}
} return false;
} /**
* @param xSize
* @param flag X 或者Y 表示X轴或者是Y轴
* @return
*/
private boolean cross(int xSize, String flag) {
for (int y = xSize - ; y > ; y--) {
int sameNum = ;
//y-1 为坐标
for (int i = y - , j = ; i < xSize - ; i++, j++) {
if (flag.equals("X")) {
if (chessboard[j][i] == chessboard[j + ][i + ] && chessboard[j][i] != ) {
sameNum++;
if (sameNum == ) {
return true;
}
} else {
sameNum = ;
}
} else {
if (chessboard[i][j] == chessboard[i + ][j + ] && chessboard[i][j] != ) {
sameNum++;
if (sameNum == ) {
return true;
}
} else {
sameNum = ;
}
}
}
} return false;
}
}
Java实现五子棋的更多相关文章
- [Java]局域网五子棋
提示: 下面给的代码有问题哦,可以自己去调试 可用版下载 请点击这里 密码:x6ve(退出程序,端口并没有被关闭,可自行修改代码实现) img
- Java的五子棋实现
Java 五子棋 注:除机器人算法外其余借鉴于MLDN. package MyFiveChess; import robot.*; import java.awt.*; import javax.sw ...
- Java控制台五子棋(纯算法)
Java五子棋小游戏 本方案是基于控制台写的一个代码 没有花里胡哨的界面,只为研究算法 仅仅用了200行代码 下面是的是运行结果 游戏运行结果 这里我就很简单的复制了一个结果 第9回合,下子方:玩家2 ...
- Java 判断五子棋五子相连
#开始 最近在忙着做一个基于酷Q的QQ机器人,想到了做游戏,第一个想到的霸气点的游戏就是五子棋啊 ` _>` 因为没有图形界面的原因 所有核心就是判断是否在棋盘上出现了五个棋子连在一起的情况 ...
- JAVA上百实例源码以及开源项目
简介 笔者当初为了学习JAVA,收集了很多经典源码,源码难易程度分为初级.中级.高级等,详情看源码列表,需要的可以直接下载! 这些源码反映了那时那景笔者对未来的盲目,对代码的热情.执着,对IT的憧憬. ...
- 158个JAVA免豆精品资料汇总
附件完整版下载地址: http://down.51cto.com/data/431561 附件部分预览~ java中国移动收费系统[源代码] http://down.51cto.com/data/70 ...
- 【转】【JAVA资料免费下载】158个JAVA免豆精品资料汇总——下载目录
附件完整版下载地址: http://down.51cto.com/data/431561 附件部分预览~ java中国移动收费系统[源代码] http://down.51cto.com/data/70 ...
- JAVA上百实例源码网站
JAVA源码包1JAVA源码包2JAVA源码包3JAVA源码包4 JAVA开源包1 JAVA开源包2 JAVA开源包3 JAVA开源包4 JAVA开源包5 JAVA开源包6 JAVA开源包7 JAVA ...
- Spark案例分析
一.需求:计算网页访问量前三名 import org.apache.spark.rdd.RDD import org.apache.spark.{SparkConf, SparkContext} /* ...
随机推荐
- 写一个针对IQueryable<T>的扩展方法支持动态排序
所谓的动态排序是指支持任意字段.任意升序降序的排序.我们希望在客户端按如下格式写: localhost:8000/api/items?sort=titlelocalhost:8000/api/item ...
- java:@SuppressWarnings注解
简介:java.lang.SuppressWarnings是J2SE 5.0中标准的Annotation之一.可以标注在类.字段.方法.参数.构造方法,以及局部变量上.作用:告诉编译器忽略指定的警告, ...
- Date与Quartz的cron之间的相互转换
1.概述 最近在写一个Quartz相关的模块,需要实现Date与Quartz的cron之间的相互转换,在网上查了一下竟然没有找到,但是找到一份这样的博客:http://hw1287789687.ite ...
- Java HashSet工作原理及实现
1. 概述 This class implements the Set interface, backed by a hash table (actually a HashMap instance). ...
- postgre 导出单表和导入
pg除了可以通过dump的方式导入和导出.如果只是导出数据,可以直接使用copy 导出 COPY user TO '/tmp/data/test.csv' WITH csv; COPY user(na ...
- EditText控件设置只读
android的文本框输入控件(EditText),有时需要设置控件为只读,最简单的方法就是在layout xml文件中设置EditText的android:editable属性值为false即可,但 ...
- 启动exe
public void OpenTabTip(){ bool bt = true; Process[] processes = Process.GetProcesses(); for ...
- Dubbo的使用入门
一.包引入 1.父模块pom.xml中加入依赖: <!-- dubbo --> <dependency> <groupId>com.alibaba.boot< ...
- 【NLP】Python实例:基于文本相似度对申报项目进行查重设计
Python实例:申报项目查重系统设计与实现 作者:白宁超 2017年5月18日17:51:37 摘要:关于查重系统很多人并不陌生,无论本科还是硕博毕业都不可避免涉及论文查重问题,这也对学术不正之风起 ...
- SpringCloud服务如何在Eureka安全优雅的下线
如果直接KILL SpringCloud的服务,因为Eureka采用心跳的机制来上下线服务,会导致服务消费者调用此已经kill的服务提供者然后出错,处理这种情况有2中方案. 如需平滑的发布服务请参考: ...