?? 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 + -