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} /* ...
随机推荐
- android: 实现强制下线功能
强制下线功能应该算是比较常见的了,很多的应用程序都具备这个功能,比如你的 QQ 号在别处登录了,就会将你强制挤下线.其实实现强制下线功能的思路也比较简单,只需要 在界面上弹出一个对话框,让用户无法进行 ...
- RescuePro Deluxe恢复软件SanDisk
RescuePro Deluxe恢复软件 注册码:RPDLX-0600-67844-04261-27951 买硬盘送的,没有用. 文章来源:刘俊涛的博客 欢迎关注,有问题一起学习欢迎留言.评论
- 重写$.ajax方法
/*重写Jquery中的ajax 封装壳*/ $(function () { (function ($) { //首先备份下jquery的ajax方法 var _ajax = $.ajax; //重写 ...
- android中Textview 和图片同时显示时,文字省略号显示,图片自动靠到右边
很纠结的一个标题,实在是不知道怎么去描述这个现象. 上图片吧,先看看需求是什么样的. 1.需求: 视频与票的图标跟在标题后面显示,当标题过长时icon显示到省略号…后(textview省略号显示, ...
- 安装二维码、条形码识别工具zbar
参考:http://blog.csdn.net/gaofuqi/article/details/26698547 http://www.imagemagick.org/download/ImageMa ...
- windows下JDK环境配置
原文地址:http://blog.sina.com.cn/s/blog_618592ea0100oeif.html 一.JDK1.6下载 目前JDK最新版本是JDK1.6,到http://java.s ...
- [转]Greenplum 执行计划之广播与重分布
关联数据在不同节点上,对于普通关系型数据库来说,是无法进行连接的.关联的数据需要通过网络流入到一个节点中进行计算,这样就需要发生数据迁移.数据迁移有广播和重分布两种.在GP中,每一个广播或重分布会产生 ...
- N个降序数组,找到最大的K个数
问题定义 这个问题来自网上看到的百度算法题,感觉很不错,问题定义如下: 假定有20个有序数组,每个数组有500个数字,降序排列,数字类型32位uint数值,现在需要取出这10000个数字中最大的500 ...
- linux每日命令(20):find命令概览
Linux下find命令在目录结构中搜索文件,并执行指定的操作.Linux下find命令提供了相当多的查找条件,功能很强大.由于find具有强大的功能,所以它的选项也很多,其中大部分选项都值得我们花时 ...
- idea android 开发
plugins 勾上 插件即可