?? game.java
字號(hào):
/*
* 創(chuàng)建日期 2005-6-28
*
* TODO 要更改此生成的文件的模板,請轉(zhuǎn)至
* 窗口 - 首選項(xiàng) - Java - 代碼樣式 - 代碼模板
*/
package game;
import java.util.Random;
/**
* @author Administrator
*
* TODO 要更改此生成的類型注釋的模板,請轉(zhuǎn)至
* 窗口 - 首選項(xiàng) - Java - 代碼樣式 - 代碼模板
*/
public class Game{
private static final int[] WINS = {
// 水平方向
bit(0) | bit(1) | bit(2), // 位置0,1,2時(shí)勝 |0|1|2| 9個(gè)位置(0,1,2,3,4,5,6,7,8)
bit(3) | bit(4) | bit(5), // 位置3,4,5時(shí)勝 |3|4|5|
bit(6) | bit(7) | bit(8), // 位置6,7,8時(shí)勝 |6|7|8|
// 垂直方向
bit(0) | bit(3) | bit(6), // 位置0,3,6時(shí)勝
bit(1) | bit(4) | bit(7), // 位置1,4,7時(shí)勝
bit(2) | bit(5) | bit(8), // 位置2,5,8時(shí)勝
// 對角線方向
bit(0) | bit(4) | bit(8), // 位置0,4,8時(shí)勝
bit(2) | bit(4) | bit(6) }; // 位置2,4,6時(shí)勝
private static final int DRAWN_GAME = bit(0) | bit(1) | bit(2) | bit(3) | bit(4) | bit(5) | bit(6) | bit(7) | bit(8);
private int playerState;
private int computerState;
private Random random;
Game(Random random) {
// 初始化行棋記錄
this.random = random;
initialize();
}
void initialize() {
// 選手行棋記錄復(fù)位
playerState = 0;
// 計(jì)算機(jī)行棋記錄復(fù)位
computerState = 0;
}
boolean isFree(int position) {
// 待檢測的位置
int bit = bit(position);
// 如該位置沒有出現(xiàn)在選手和計(jì)算機(jī)的行棋記錄中,則表示該位置空閑可用
return (((playerState & bit) == 0) && ((computerState & bit) == 0));
}
boolean isPlayer(int position){
// 當(dāng)前位置是否被選手占用
int bit = bit(position);
return (playerState & bit) == 1;
}
boolean isComputer(int position){
// 當(dāng)前位置是否被計(jì)算機(jī)占用
int bit = bit(position);
return (computerState & bit) == 1;
}
void makePlayerMove(int position) {
// 當(dāng)前選手占用的所有位置
playerState |= bit(position);
}
int makeComputerMove() {
// 如果下一步計(jì)算機(jī)能獲勝則在獲勝位置下子
int move = getWinningComputerMove();
if (move == -1) {
// 如果計(jì)算機(jī)下一步不能獲勝而選手下一步將要獲勝,則在選手將獲勝的位置下子
move = getRequiredBlockingComputerMove();
if (move == -1)
{
// 無關(guān)緊要時(shí)隨機(jī)下子
move = getRandomComputerMove();
}
}
// 當(dāng)前計(jì)算機(jī)占用的所有位置
computerState |= bit(move);
return move;
}
boolean isGameOver() {
// 判斷游戲是否結(jié)束
return isPlayerWinner() | isComputerWinner() | isGameDrawn();
}
boolean isPlayerWinner() {
// 選手是否獲勝
return isWin(playerState);
}
boolean isComputerWinner() {
// 計(jì)算機(jī)是否獲勝
return isWin(computerState);
}
boolean isGameDrawn() {
// 是否平局
return (playerState | computerState) == DRAWN_GAME;
}
private int getWinningComputerMove() {
// 通過對所有可能下子位置的枚舉,智能判斷計(jì)算機(jī)下一步走到哪里才能獲勝
int move = -1;
for (int i = 0; i < 9;++i) {
if (isFree(i) && isWin(computerState | bit(i))) {
// 找到獲勝位置時(shí)中斷
move = i;
break;
}
}
// 返回下一步獲勝的下子位置,如為-1則表示下一步無法獲勝
return move;
}
private int getRequiredBlockingComputerMove() {
// 通過對所有可能下子位置的枚舉,智能判斷選手下一步走到哪里才能獲勝
int move = -1;
for (int i = 0; i < 9;++i) {
if (isFree(i) && isWin(playerState | bit(i))) {
// 找到選手獲勝時(shí)的位置
move = i;
break;
}
}
// 返回選手獲勝時(shí)的位置,為-1時(shí)表示選手下一步不能獲勝
return move;
}
private int getRandomComputerMove() {
// 計(jì)算當(dāng)前空余位置
int move = -1;
int numFreeSquares = 0;
for (int i = 0; i < 9;++i) {
if (isFree(i))
numFreeSquares++;
}
// 判斷是否可以繼續(xù)行子
if (numFreeSquares > 0) {
// 檢取隨機(jī)行子位置
int pick = ((random.nextInt()<<1)>>>1) % numFreeSquares;
for (int i = 0; i < 9;++i) {
if (isFree(i)) {
if (pick == 0) {
move = i;
break;
}
pick--;
}
}
}
// 返回隨機(jī)下子的位置,如為-1表示當(dāng)前已無可行子的位置
return move;
}
private static boolean isWin(int state) {
// 獲勝標(biāo)志
boolean isWinner = false;
// 與獲勝模板進(jìn)行比對,檢查當(dāng)前是否已經(jīng)獲勝
for (int i = 0; i < WINS.length;++i) {
if ((state & WINS[i]) == WINS[i]) {
isWinner = true;
break;
}
}
return isWinner;
}
private static int bit(int i) {
// 移位,以區(qū)分位置記錄
return 1 << i;
}
}
?? 快捷鍵說明
復(fù)制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號(hào)
Ctrl + =
減小字號(hào)
Ctrl + -