⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 btfirlogic.java

📁 这是一个蓝牙五子棋的手机游戏,大家来看看呀
💻 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 + -