📄 btfirlogic.java
字号:
import java.io.PrintStream;
import java.util.*;
import javax.microedition.lcdui.Canvas;
public class BTFIRLogic
{
private BTFIRCanvas myCanvas;
private int boardSize;
private boolean isBlack = true;
public static int PLAYER_NONE = 0;
public static int PLAYER_BLACK = 1;
public static int PLAYER_WHITE = 2;
private int table[][];
private Dot lastDot;
private int playerCounter[];
private Stack steps;
private Dot triedDot;
private boolean isGameOver;
private boolean isBlackWon;
public BTFIRLogic(BTFIRCanvas canvas, boolean isBlack)
{
this.isBlack = isBlack;
boardSize = 15;
// isBlackFirst = true;
myCanvas = canvas;
table = new int[boardSize][boardSize];
for (int r = 0; r < boardSize; r++)
{
for (int c = 0; c < boardSize; c++)
table[r][c] = 0;
}
playerCounter = new int[3];
playerCounter[0] = boardSize * boardSize;
playerCounter[1] = 0;
playerCounter[2] = 0;
lastDot = new Dot(boardSize);
triedDot = new Dot( - 1, - 1);
isGameOver = false;
}
public int[][]getTable()
{
return table;
}
public Dot lastDot()
{
return lastDot;
}
public Dot triedDot()
{
return triedDot;
}
public boolean checkGameOver()
{
return isGameOver;
}
public boolean isBlackWon()
{
return isBlackWon;
}
private boolean isGameOver()
{
isGameOver = false;
for (int r = 0; r < boardSize; r++)
{
for (int c = 0; c < boardSize; c++)
{
if (table[r][c] == 0 || checkFiveInRow(r, c, 5, - 1) == - 1)
continue;
//如果检测的位置位空,或者不存在五子连珠情况则进行下一轮循环
isGameOver = true; //如果
isBlackWon = table[r][c] == 1; //判断是否计算机赢
break;
}
if (isGameOver)
//如果游戏结束,则结束循环
break;
}
if (isGameOver)
myCanvas.notifyGameEnd(isBlackWon);
//如果游戏结束则在画布上相应处理
return isGameOver;
}
public boolean playerBlackGo(int row, int col)
{
if (row >= 0 && row < boardSize && col >= 0 && col < boardSize &&
table[row][col] == 0)
//该位置在棋盘上,并且还没有被占用
{
goAt(row, col, 1); //黑方的代码是1
if (isGameOver())
//判断游戏是否结束
{
if (isBlackWon)
{
if (isBlack)
myCanvas.setStatus("你赢了!", 0xff0000, 2);
else
myCanvas.setStatus("你输了!", 65280, 1);
}
}
return true;
}
return false;
}
public boolean playerWhiteGo(int row, int col)
{
if (row >= 0 && row < boardSize && col >= 0 && col < boardSize &&
table[row][col] == 0)
//该位置在棋盘上,并且还没有被占用
{
goAt(row, col, 2); //白方的代码是2
if (isGameOver())
//判断游戏是否结束
{
if (isBlackWon)
{
if (isBlack)
myCanvas.setStatus("你赢了!", 0xff0000, 2);
else
myCanvas.setStatus("你输了!", 65280, 1);
}
}
return true;
}
return false;
}
private void goAt(int row, int col, int player)
//计算机或者人在row,col位置上走
{
int lastRow = lastDot.row; //记录上一部的位置
int lastCol = lastDot.col;
table[row][col] = player; //当前位置填充玩家代码
lastDot.setRowCol(row, col); //将这一步设置为“最后一步”
myCanvas.repaintAt(lastRow, lastCol); //绘制最后一步
myCanvas.repaintAt(row, col); //绘制当前这步
switch (player)
{
case 1:
// '\001'
playerCounter[1]++; //计算机的步数
break;
case 2:
// '\002'
playerCounter[2]++; //人的步数
break;
}
playerCounter[0]--; //空白的个数
}
private int[]expandedIn8D(int player, int row, int col)
{
int ed[] = new int[8];
for (int d = 0; d < 8; d++)
ed[d] = expandedIn1D(player, row, col, d);
return ed;
}
private int expandedIn1D(int player, int row, int col, int direction)
{
int n = 0;
int cn = 0;
Dot d = new Dot(row, col);
while (cn < 4)
{
d.copyFrom(moveOneStep(d, direction));
if (!d.isInBoard(boardSize))
break;
int p = table[d.row][d.col];
if (p == 0)
cn++;
if (p != player && p != 0)
break;
n++;
}
return n;
}
private int checkFiveInRow(int row, int col, int n, int exceptDirection)
{
int player = table[row][col];
int cd[] = connectedIn8D(player, row, col);
int ed[] = expandedIn8D(player, row, col);
int existDirection = - 1;
for (int i = 0; i < 4; i++)
{
if (i == exceptDirection || cd[i] + cd[i + 4] + 1 < n || (ed[i] -
cd[i]) + (ed[i + 4] - cd[i + 4]) < 0)
continue;
existDirection = i;
break;
}
return existDirection;
}
private int[]connectedIn8D(int player, int row, int col)
{
int cd[] = new int[8];
for (int d = 0; d < 8; d++)
cd[d] = connectedIn1D(player, row, col, d);
return cd;
}
private int connectedIn1D(int player, int row, int col, int direction)
{
int n = 0;
Dot d = new Dot(row, col);
do
{
d.copyFrom(moveOneStep(d, direction));
if (d.isInBoard(boardSize) && table[d.row][d.col] == player)
n++;
else
return n;
}
while (true);
}
private Dot moveOneStep(Dot d, int direction)
{
int r = d.row;
int c = d.col;
switch (direction)
{
case 0:
// '\0'
c++;
break;
case 1:
// '\001'
r--;
c++;
break;
case 2:
// '\002'
r--;
break;
case 3:
// '\003'
r--;
c--;
break;
case 4:
// '\004'
c--;
break;
case 5:
// '\005'
r++;
c--;
break;
case 6:
// '\006'
r++;
break;
case 7:
// '\007'
r++;
c++;
break;
}
return new Dot(r, c);
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -