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

📄 wzq.java

📁 一个人与机器对战的五子其程序. 开始时随机选择先下的一方,以网页中的Applet实现.
💻 JAVA
字号:
import java.applet.Applet;
import java.awt.*;
import java.util.Random;

public class wzq extends Applet implements Runnable
{

    public void stop()
    {
        LoopThread = null;
    }
	
    private int CalcZi(int i, int j, byte byte0)
    {
        CXY cxy = new CXY();
        int k = 0;
        int l = 0;
        do
        {
            int i1 = 0;
            int j1 = 0;
            do
            {
                cxy.x = i;
                cxy.y = j;
                if(MoveAGrid(cxy, l + 4 * j1) && QiPan[cxy.x][cxy.y] == byte0)
                    do
                    {
                        if(QiPan[cxy.x][cxy.y] == 0 || QiPan[cxy.x][cxy.y] != byte0)
                            break;
                        i1++;
                    }
                    while(MoveAGrid(cxy, l + 4 * j1));
            }
            while(++j1 < 2);
            if(i1 > k)
                k = i1;
        }
        while(++l < 4);
        return ++k;
    }

    private boolean CanDo()
    {
        return steps < ((GRIDSUM * GRIDSUM) / 100) * 80;
    }
	//电脑下棋
    private int CPUDo(CXY cxy, byte byte0)
    {
        int ai[] = new int[2];
        int ai1[] = new int[2];
        int ai2[] = new int[2];
        boolean flag = false;
        EnterTimes++;
        ai2[0] = 0;
        for(int i = recLU.x; i <= recRD.x; i++)
        {
            for(int k = recLU.y; k <= recRD.y; k++)
            {
                int l = 0;
                if(QiPan[i][k] == 0)
                {
                    DoAStep(i, k, byte0);
                    l = CalcCPU(i, k, byte0);
                }
                if(l > 0)
                {
                    int i1 = 0;
                    byte byte1;
                    if(byte0 == 1)
                        byte1 = 2;
                    else
                        byte1 = 1;
                    if(EnterTimes <= level && steps < ((GRIDSUM * GRIDSUM) / 100) * 80)
                        i1 = CPUDo(cxy, byte1);
                    l += i1;
                    if(l + Math.abs(rd.nextInt()) % 5 > ai2[0] || !flag)
                    {
                        ai[0] = i;
                        ai1[0] = k;
                        ai2[0] = l;
                        flag = true;
                    }
                    QiPan[i][k] = 0;
                }
            }

        }

        if(EnterTimes <= 1)
        {
            cxy.x = ai[0];
            cxy.y = ai1[0];
            int j = 0;
            do
            {
                try
                {
                    Thread.sleep(300L);
                }
                catch(InterruptedException _ex) { }
                QiPan[cxy.x][cxy.y] = byte0;
                repaint();
                try
                {
                    Thread.sleep(300L);
                }
                catch(InterruptedException _ex) { }
                QiPan[cxy.x][cxy.y] = 0;
                repaint();
            }
            while(++j < 2);
        }
        EnterTimes--;
        return ai2[0];
    }

    public void ClearPan()
    {
        for(int i = 0; i < GRIDSUM; i++)
        {
            for(int j = 0; j < GRIDSUM; j++)
                QiPan[i][j] = 0;

        }

        scHong = 0;
        scHei = 0;
        steps = 0;
        recLU.x = 8;
        recRD.x = 9;
        recLU.y = 8;
        recRD.y = 9;
    }

    private boolean MoveAGrid(CXY cxy, int i)
    {
        boolean flag = false;
        i %= 8;
        int j = cxy.x + oAdd[i][0];
        int k = cxy.y + oAdd[i][1];
        if(j >= 0 && j < GRIDSUM && k >= 0 && k < GRIDSUM)
        {
            cxy.x = j;
            cxy.y = k;
            flag = true;
        }
        return flag;
    }

    public void paint(Graphics g)
    {
        super.paint(g);
        for(int i = 0; i < GRIDSUM + 1; i++)
        {
            g.drawLine(0, i * GRIDWIDTH, GRIDSUM * GRIDWIDTH, i * GRIDWIDTH);
            g.drawLine(i * GRIDWIDTH, 0, i * GRIDWIDTH, GRIDSUM * GRIDWIDTH);
        }

        for(int j = 0; j < GRIDSUM; j++)
        {
            for(int k = 0; k < GRIDSUM; k++)
                drawQi(g, j, k, QiPan[j][k]);

        }

    }

    private void CPUInit()
    {
        PosAdd[0][0] = 8;
        PosAdd[0][1] = -2;
        PosAdd[1][0] = -2;
        PosAdd[0][2] = 3;
        PosAdd[2][0] = 3;
        PosAdd[0][3] = 2;
        PosAdd[3][0] = 2;
        PosAdd[1][1] = -7;
        PosAdd[1][2] = -1;
        PosAdd[2][1] = -1;
        PosAdd[1][3] = -1;
        PosAdd[3][1] = -1;
        PosAdd[2][2] = 4;
        PosAdd[3][3] = 4;
        PosAdd[2][3] = 4;
        PosAdd[3][2] = 4;
    }

    public void mouseDOWNThis(Event event)
    {
        if(playerdo)
            xiazi.put(event.x, event.y);
    }

    private int DoAStep(int i, int j, byte byte0)
    {
        if(QiPan[i][j] != 0 || byte0 == 0 || byte0 > 2)
        {
            return 0;
        }
        else
        {
            QiPan[i][j] = byte0;
            return 1;
        }
    }

    private void FreshRec(int i, int j)
    {
        if(i - recLU.x < 2)
        {
            recLU.x = i - 2;
            if(recLU.x < 0)
                recLU.x = 0;
        }
        if(recRD.x - i < 2)
        {
            recRD.x = i + 2;
            if(recRD.x >= GRIDSUM)
                recRD.x = GRIDSUM - 1;
        }
        if(j - recLU.y < 2)
        {
            recLU.y = j - 2;
            if(recLU.y < 0)
                recLU.y = 0;
        }
        if(recRD.y - j < 2)
        {
            recRD.y = j + 2;
            if(recRD.y >= GRIDSUM)
                recRD.y = GRIDSUM - 1;
        }
    }

    public wzq()
    {
        GRIDWIDTH = 18;
        GRIDSUM = 18;
        QiPan = new byte[GRIDSUM][GRIDSUM];
        oAdd = new int[8][2];
        playing = false;
        playerdo = true;
        xy = new CXY();
        xiazi = new CXiaZi();
        rd = new Random();
        recLU = new CXY();
        recRD = new CXY();
        PosAdd = new int[4][4];
    }

    public void update(Graphics g)
    {
        paint(g);
    }
	//画棋
    public void drawQi(Graphics g, int i, int j, int k)
    {
        switch(k)
        {
        case 0: // '\0'
            g.clearRect(i * GRIDWIDTH + 1, j * GRIDWIDTH + 1, GRIDWIDTH - 2,GRIDWIDTH - 2);
            return;

        case 1: // '\001'
            g.setColor(Color.red);
            g.fillArc(i * GRIDWIDTH + 2, j * GRIDWIDTH + 2, GRIDWIDTH - 4,GRIDWIDTH - 4, 0, 360);
            return;

        case 2: // '\002'
            g.setColor(Color.black);
            break;
        }
        g.fillArc(i * GRIDWIDTH + 2, j * GRIDWIDTH + 2, GRIDWIDTH - 4,GRIDWIDTH - 4, 0, 360);
    }

    public void start()
    {
        if(LoopThread == null)
            LoopThread = new Thread(this, "wbqloop");
        LoopThread.setPriority(1);
        LoopThread.start();
    }

    public void run()
    {
        for(; Thread.currentThread() == LoopThread; xiazi.get(xy))
        {
            ClearPan();
            repaint();
            playing = true;
            //谁先下随机
            who = (byte)(Math.abs(rd.nextInt()) % 2 + 1);
            for(passes = 0; playing && passes < 2;)
            {
                if(who == 1)
                {
                    lblStatus.setText("\u7EA2\u65B9\u4E0B");
                    lblStatus.setForeground(Color.red);
                }
                else
                {
                    lblStatus.setText("\u9ED1\u65B9\u4E0B");
                    lblStatus.setForeground(Color.black);
                }
                if(steps < ((GRIDSUM * GRIDSUM) / 100) * 80)
                {
                    passes = 0;
                    if(who == 1)  //人下棋
                    {
                        xiazi.get(xy);
                        for(; DoAStep(xy.x, xy.y, who) == 0; xiazi.get(xy));
                        scHong = CalcZi(xy.x, xy.y, who);
                        FreshRec(xy.x, xy.y);
                        steps++;
                    }
                    else    //机器下棋
                    {
                        if(scHong == 0 && scHei == 0)
                        {
                            xy.x = 9;
                            xy.y = 9;
                        }
                        else
                        {
                            CPUDo(xy, who);
                        }
                        for(; DoAStep(xy.x, xy.y, who) == 0; CPUDo(xy, who));
                        scHei = CalcZi(xy.x, xy.y, who);
                        FreshRec(xy.x, xy.y);
                        steps++;
                    }
                }
                else
                {
                    passes = 2;
                }
                if(scHong >= 5 || scHei >= 5)
                    playing = false;
                repaint();
                //交换下棋方
                who = (byte)((1 - (who - 1)) + 1);
                Thread.yield();
            }

            if(scHong >= 5)  //红方胜
            {
                Status = "\u7EA2\u65B9\u80DC!";
                lblStatus.setForeground(Color.red);
                LoseTimes++;
            }
            else if(scHei >= 5)//黑方胜
            {
                Status = "\u9ED1\u65B9\u80DC!";
                lblStatus.setForeground(Color.black);
                if(LoseTimes > 0)
                    LoseTimes--;
            }
            else  //平局
            {
                Status = "\u4E0D\u5206\u80DC\u8D1F!";
            }
            lblStatus.setText(Status);
            repaint();
        }

    }
    //入口,开始下棋,初始化
    public void init()
    {
        super.init();
        LoopThread = null;
        oAdd[0][0] = 0;
        oAdd[0][1] = -1;
        oAdd[1][0] = 1;
        oAdd[1][1] = -1;
        oAdd[2][0] = 1;
        oAdd[2][1] = 0;
        oAdd[3][0] = 1;
        oAdd[3][1] = 1;
        oAdd[4][0] = 0;
        oAdd[4][1] = 1;
        oAdd[5][0] = -1;
        oAdd[5][1] = 1;
        oAdd[6][0] = -1;
        oAdd[6][1] = 0;
        oAdd[7][0] = -1;
        oAdd[7][1] = -1;
        CPUInit();
        setLayout(null);
        resize(325, 352);
        lblStatus = new Label("Welcome");
        lblStatus.setFont(new Font("Dialog", 1, 14));
        add(lblStatus);
        lblStatus.reshape(14, 332, 175, 15);
        lblLevel = new Label("JAVA\u4E94\u5B50\u68CB");
        lblLevel.setFont(new Font("Dialog", 1, 14));
        add(lblLevel);
        lblLevel.reshape(196, 332, 119, 15);
    }

    public boolean handleEvent(Event event)
    {
        if(event.id != 501 || event.target != this)
        {
            return super.handleEvent(event);
        }
        else
        {
            mouseDOWNThis(event);
            return true;
        }
    }

    private int CalcCPU(int i, int j, byte byte0)
    {
        CXY cxy = new CXY();
        String s = "";
        String s2 = "";
        String s4 = "";
        byte byte1 = 0;
        CalcTimes++;
        if(byte0 == 1)
            byte1 = 2;
        else
        if(byte0 == 2)
            byte1 = 1;
        int k = 0;
        int l = 0;
        do
        {
            int i1 = 0;
            String s1 = "";
            String s3 = "";
            String s5 = "";
            int j1 = 0;
            do
            {
                int k1 = 0;
                cxy.x = i;
                for(cxy.y = j; MoveAGrid(cxy, l + 4 * j1) && k1 < 6 && 
QiPan[cxy.x][cxy.y] != byte1; k1++)
                    if(QiPan[cxy.x][cxy.y] == byte0)
                    {
                        if(j1 == 0)
                            s3 += "1";
                        else
                            s5 = "1" + s5;
                        i1++;
                    }
                    else
                    if(j1 == 0)
                        s3 += "0";
                    else
                        s5 = "0" + s5;

                if(j1 == 0)
                    s3 += "2";
                else
                    s5 = "2" + s5;
            }
            while(++j1 < 2);
            i1++;
            s1 = s5 + "1" + s3;
            if(s1.indexOf("11111") != -1)
                i1 += 1000;
            else
            if(s1.indexOf("011110") != -1)
                i1 += 500;
            else
            if(s1.indexOf("211110") != -1 || s1.indexOf("011112") != -1 || 
s1.indexOf("01110") != -1 || s1.indexOf("01110") != -1 || s1.indexOf("011010")
 != -1 || s1.indexOf("010110") != -1 || s1.indexOf("11101") != -1 || 
s1.indexOf("10111") != -1 || 
s1.indexOf("11011") != -1)
                i1 += 100;
            else
            if(s1.indexOf("21110") != -1 || s1.indexOf("01112") != -1 || 
s1.indexOf("0110") != -1 || s1.indexOf("211010") != -1 || s1.indexOf("210110")
 != -1)
                i1 += 20;
            if(l == 1 || l == 3)
                i1 += (i1 * 20) / 100;
            k += i1;
        }
        while(++l < 4);
        if(CalcTimes <= 1)
            k += CalcCPU(i, j, byte1);
        else
        if(k > 10)
            k -= 10;
        CalcTimes--;
        return k;
    }

    int GRIDWIDTH;   //网格宽度
    int GRIDSUM;     //网格总数
    byte QiPan[][];  //棋盘
    int oAdd[][];
    Thread LoopThread;
    int scHong;    //红方
    int scHei;     //黑方
    byte who;      //
    byte winner;   //赢方
    boolean playing;
    boolean playerdo;
    CXY xy;
    CXiaZi xiazi;   //下子
    String Status;  //状态
    Random rd;      //随机数
    int passes;
    int steps;
    int LoseTimes;
    CXY recLU;
    CXY recRD;
    int PosAdd[][];
    int level;
    int EnterTimes;
    int CalcTimes;
    Label lblStatus;
    Label lblLevel;
}


class CXiaZi
{

    public synchronized void get(CXY cxy)
    {
        ready = false;
        notify();
        while(!ready)
            try
            {
                wait();
            }
            catch(InterruptedException _ex) { }

        ready = false;
        notify();
        cxy.x = xy.x;
        cxy.y = xy.y;
    }

    public synchronized void put(int i, int j)
    {
        if(i < GRIDWIDTH * GRIDSUM && j < GRIDWIDTH * GRIDSUM)
        {
            xy.x = i / GRIDWIDTH;
            xy.y = j / GRIDWIDTH;
            ready = true;
            notify();
        }
    }

    public CXiaZi()
    {
        GRIDWIDTH = 18;
        GRIDSUM = 18;
        xy = new CXY();
        ready = false;
    }

    private CXY xy;
    private boolean ready;
    private int GRIDWIDTH;
    private int GRIDSUM;
}


class CXY
{

    public CXY()
    {
        x = 0;
        y = 0;
    }

    public int x;
    public int y;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -