废话不多说,直接上代码:
package com.dawson.kstudy
/**
* 五子棋
*/
class FiveInARow {
/**
* 棋盘大小
*/
private val mRows = 15
/**
* 存放黑棋
*/
private val black = Array(mRows) { ByteArray(mRows) }
/**
* 存放白棋
*/
private val white = Array(mRows) { ByteArray(mRows) }
/**
* 存放所有棋子
*/
private val chess = Array(mRows) { ByteArray(mRows) }
/**
* 落子
*@param type 棋子类型 1黑棋 2白棋
* @param x 待落子位置 x
* @param y 待落子位置 y
* @return 落子结果 true:落子成功 false:不能落子
*/
public fun moveInChess(type: Int, x: Int, y: Int): Boolean {
if (chess[x][y] > 0) {
return false
}
chess[x][y] = type.toByte()
return when (type) {
1 -> {
black[x][y] = 1
true
}
else -> {
white[x][y] = 1
true
}
}
}
/**
* 判断胜负
* @param type 棋子类型 1黑棋 2白棋
* @param x 棋子位置 x
* @param y 棋子位置 y
* @return 结果 true:胜 false:未胜利,需继续
*/
public fun checkWin(type: Int, x: Int, y: Int): Boolean {
//x遍历起点
val sx = if (x > 4) x - 4 else 0
//y遍历起点
val sy = if (y > 4) y - 4 else 0
//x遍历止点
val ex = if (x < mRows - 4) x + 4 else mRows - 1
//y遍历止点
val ey = if (y < mRows - 4) y + 4 else mRows - 1
//遍历白棋还是黑棋
val c = if (type == 1) black else white
//连续棋子计数
var count = 0
val cl = mutableListOf<Byte>()
//遍历水平方向是否有连续五子
for (i in sx..ex) {
cl.add(c[i][y])
}
cl.add(0)
//遍历垂直方向是否有连续五子
for (i in sy..ey) {
cl.add(c[x][i])
}
cl.add(0)
//遍历斜方向
for (i in 0..(ex - sx)) {
cl.add(c[sx + i][sy + i])
}
cl.add(0)
//遍历反斜方向
for (i in 0..(ex - sx)) {
cl.add(c[sx + i][ey - i])
}
cl.forEach {
count = (count + it) * it
if (count >= 5) {
return true
}
}
return false
}
}
PS:除去注释不到一百行。核心逻辑都在注释里面...
|