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} /* ...
随机推荐
- FDMEMTABLE将修改后的数据序列为JSON
FDMEMTABLE将修改后的数据序列为JSON procedure TForm1.Button3Click(Sender: TObject); var memtable: TFDMemTable; ...
- reveal 使用注意事项
**将libReveal.dylib 和 Reveal.framework 继承进项目后,一定要在 Build Phases->Link Binary With Libraries中将二者删除. ...
- mui 总结
出框框 js内容 mui(".mui-popover").popover('toggle'); 点击“弹出框框”就会弹出这个有class="mui-pop ...
- 普通用户使用docker命令免sudo权限的问题
方法很多,只写一种 操作步骤: 使用有sudo权限的帐号登录系统. 创建docker分组,并将相应的用户添加到这个分组里面. sudo usermod -aG docker your_username ...
- C# System.Collections.ArrayList
using System; using System.Collections; public class SamplesArrayList { public static void Main() { ...
- 基于CentOS 搭建 FTP 文件服务
系统要求: CentOS 7.2 64 位操作系统 一. 安装 VSFTPD (vsftpd 是在 Linux 上被广泛使用的 FTP 服务器,根据其[官网介绍][https://security.a ...
- apache的性能调配 MaxClients 与MaxRequestsPerChild
因近期服务不稳定,现象和这个比较类似http://hi.baidu.com/xinfeng999/blog/item/1aea470e214ab1cd7acbe1ed.html根据现象来对APACHE ...
- Nginx 访问日志配置
一.Nginx 访问日志介绍 Nginx 软件会把每个用户访问网站的日志信息记录到指定的日志文件里,供网站提供者分析用户的浏览行为等,此功能由 ngx_http_log_module 模块负责. 二. ...
- 实现div里的img图片水平垂直居中
body结构 <body> <div> <img src="1.jpg" alt="haha"> </div> ...
- 【转】JCR期刊分区及其检索方法
不少机构依据JCR期刊分区制定科研激励政策,相关科研工作者及科研管理机构密切关注JCR期刊分区及其检索方法.本文作一粗略介绍. 关于JCR(Journal Citation Reports,期刊 ...