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

📄 maincontrol.java~8~

📁 Java做的黑白棋
💻 JAVA~8~
📖 第 1 页 / 共 5 页
字号:
package javacontest;


/*人机对战策略:先设定一个权重,然后考虑最后得分时综合这个权重和下一步对手可以选择的余地,尽量使对手的选择余地小一点,留给他的地方坏一点*/

import javax.swing.*;
import java.awt.event.*;
import java.util.*;
import java.awt.*;
import java.awt.font.*;

/*悔棋思路:设置一个存放矩阵的向量,然后每走一步棋前先把当前的矩阵matrix压入向量,当选择悔棋时,取出先前矩阵并根据矩阵重新绘制图
 *改进:直接声明一个长度为64的(矩阵的数组)即可,因为最多有64个状态!*/
public class MainControl extends JFrame implements MouseListener,
        ActionListener /*, Runnable*/
        {
    public static final int WIDTH = 368;
    public static final int HEIGHT = 434;

    public static int COMPUTER = -2;
    public static int PEOPLE = -2;

    private boolean isServer = false;
    //标志本机是否是服务器

    //Network_Control con = new Network_Control();
    //生成一个用于网络连接的对象

    //private  static Node matrix[][];
    //用于存储棋盘上节点的节点矩阵(二维数组)

    static int mode = -1;
    //用于区分当前处于何种模式下,0表示两人对弈,3表示网络对战,1表示计算机执黑子,2表示计算机执白子

    private
    /*static*/ int matrix[][];
    //与前台的每一个格子一一对应,-1表示黑棋子,0表示无棋子,1表示白棋子
    private final int WEIGHT[][] = { {5, 0, 4, 3, 3, 4, 0, 5}, {0, 0, 1, 1, 1,
                                   1, 0, 0}, {4, 1, 2, 2, 2, 2, 1, 4}, {3, 1, 2,
                                   2, 2, 2, 1, 3}, {3, 1, 2, 2, 2, 2, 1, 3}, {4,
                                   1, 2, 2, 2, 2, 1, 4}, {0, 0, 1, 1, 1, 1, 0,
                                   0}, {5, 0, 4, 3, 3, 4, 0, 5}
    };
    //后台矩阵的权重矩阵
    //int a[3][3]={1,2,3,4,5,6,7,8,9};

    private static final int LINE_NUM = 8;
    private static final int COLUMN_NUM = 8;
    //二维矩阵上的行数和列数

    private static final int R = 16;
    private static final int D = 2 * R;
    //棋子圆形的半径和直径

    private static final int INTERVAL = 40;
    //棋盘上的行间距

    private static final int DX = (WIDTH - COLUMN_NUM * INTERVAL) / 2;
    private static final int DY = (HEIGHT - (LINE_NUM + 1) * INTERVAL);
    //棋盘原点相对于窗口原点的偏移量

    boolean needSpecialPaint = false;
    //标志是否需要特殊处理

    boolean hasPlacesToPut = true;
    //标志是否有地方放棋子
    static int objectPlaces = 0;
    //当前目标地址个数

    int nextToGo = -1;
    //标志下一步该谁走棋了,-1为黑方,1为白方,初始黑方先走

    static int blackNum = 2;
    static int whiteNum = 2;
    //双方现有棋子数,初始各为2
    static int sumChess = 4;
    //当前棋盘上的所有棋子数,初始为4,用于标志下棋的结束(其实是区分棋局结束和棋子没填满但两方均已无棋可走这两种情况)

    static int[] chessNum = new int[3];
    //用于存储各方棋子的个数,chessNum[0]为黑方数量,chessNum[1]为棋子总数量,chessNum[2]为白方棋子数量
    //之所以这么别扭的设计存取方法,是为了编写程序的方便

    Vector process = new Vector();
    //用于存储棋谱的向量,存储每一个状态下的矩阵


    CheckboxMenuItem hasSound = null;
    CheckboxMenuItem direct = null;
    //用于是否使用声音及显示行棋点

    public MainControl() {
        this.matrix = new int[LINE_NUM][COLUMN_NUM];
        //为二维数组分配空间
        //this.weight = new int[LINE_NUM][COLUMN_NUM];
        //为权重数组分配空间
//        weight[LINE_NUM][COLUMN_NUM] = { 5 , 0 , 4 , 3 , 3 , 4 , 0 , 5 , 0,0, 1,1,1,1,0,0,4,1,2,2,2,2,1,4;3,1,2,2,2,2,1,3,3,1,2,2,2,2,1,3,4,1,2,2,2,2,1,4,0,0, 1,1,1,1,0,0,5 , 0 , 4 , 3 , 3 , 4 , 0 , 5 };

        ini();
        //初始化matrix
        //iniWeight();
        //初始化棋盘上各个位置的权重

        chessNum[0] = 2;
        chessNum[2] = 2;
        chessNum[1] = 4;
        //修改棋子数目

        checkObjects(nextToGo);
        //初始查找黑棋所能到达的地方

        this.setSize(WIDTH, HEIGHT);
        this.setTitle("简易黑白棋1.0版!");
        //this.setAlwaysOnTop( true );
        //this.setIgnoreRepaint( true );
        this.setResizable(false);
        //设置使其不能重新更变大小
        //this.setBackground( Color.BLUE );
        //this.setLayout( new BorderLayout() );
        this.setLocation(150, 180);
        this.addMouseListener(this);
        //不要忘记添加鼠标监听
        Menu m1 = new Menu("游戏");
        Menu m2 = new Menu("设置");
        Menu m3 = new Menu("帮助");
        Menu m4 = new Menu("重新开局");
        Menu m5 = new Menu("网络对战");
        //JMenuItem m11 = new JMenuItem("重新开局");
        //JMenuItem m11 = new JMenuItem("计算机执黑");
        MenuItem m12 = new MenuItem("悔棋");
        MenuItem m13 = new MenuItem("保存游戏进度");
        MenuItem m14 = new MenuItem("读取游戏进度");
        MenuItem m15 = new MenuItem("放弃该局");
        MenuItem m16 = new MenuItem("退出");

        hasSound = new CheckboxMenuItem("声音提示");
        direct = new CheckboxMenuItem("显示行棋点");

        MenuItem m31 = new MenuItem("帮助");
        MenuItem m32 = new MenuItem("关于");

        MenuItem m111 = new MenuItem("计算机执黑");
        MenuItem m112 = new MenuItem("计算机执白");
        MenuItem m113 = new MenuItem("两人对弈");
        //MenuItem m114 = new MenuItem("网络对战");

        MenuItem m51 = new MenuItem("新建游戏");
        MenuItem m52 = new MenuItem("加入游戏");

        m12.addActionListener(this);
        m13.addActionListener(this);
        m14.addActionListener(this);
        m15.addActionListener(this);
        m16.addActionListener(this);
        //m13.addActionListener(this);
        m31.addActionListener(this);
        m32.addActionListener(this);
        m111.addActionListener(this);
        m112.addActionListener(this);
        m113.addActionListener(this);
        m51.addActionListener(this);
        m52.addActionListener(this);
        hasSound.addActionListener(this);
        direct.addActionListener(this);
        //hasSound.getState();
        hasSound.setState(true);
        direct.setState(true);
        //默认选中声音,显示行棋点

        m1.add(m4);
        m1.add(m12);
        m1.add(m13);
        m1.add(m14);
        m1.add(m15);
        m1.add(m16);
        //m1.add(m14);

        m2.add(hasSound);
        m2.add(direct);

        m3.add(m31);
        m3.add(m32);

        m4.add(m111);
        m4.add(m112);
        m4.add(m113);
        m4.add(m5);
        //完成第一个菜单的定义
        m5.add(m51);
        m5.add(m52);

        MenuBar mBar = new MenuBar();
        mBar.add(m1);
        mBar.add(m2);
        mBar.add(m3);

        setMenuBar(mBar);
        //完成菜单的绘制
    }

    public boolean getIsServer() {
        return isServer;
        //返回变量
    }

    public void setIsServer(boolean flag) {
        this.isServer = flag;
    }

    public void actionPerformed(ActionEvent e)
    {
        String cmd = e.getActionCommand();
        if (cmd.equals("计算机执黑"))
        {
            ini();
            checkObjects( -1);
            repaint();
            mode = 1;
            //计算机执黑,则计算机先走
            COMPUTER = -1;
            PEOPLE = 1;
            computerMove(COMPUTER);
            //让计算机先走,其中包括处理异常情况,即电脑走后人无棋可走的情况,即从computerMove()方法中出来后必须确保人有棋可走
            //第一次电脑走棋由actionPerformed来触发,以后的走棋都有mouseClicked()来触发,
            //即每当人点击鼠标想走棋时,先让人走棋,并进行适当的判断,在轮到电脑走起时调用computerMove()方法,然后等待下一次鼠标点击事件的发生
            //nextToGo *= (-1);
            //repaint();
        }
        else if (cmd.equals("计算机执白"))
        {
            ini();
            checkObjects( -1);
            repaint();
            mode = 2;
            COMPUTER = 1;
            PEOPLE = -1;
            //repaint();
        }
        else if (cmd.equals("两人对弈"))
        {
            ini();
            checkObjects( -1);
            repaint();
            mode = 0;
            //repaint();
        }
        else if (cmd.equals("网络对战"))
        {
            ini();
            checkObjects( -1);
            repaint();
            mode = 3;
            //repaint();
        }
        else if (cmd.equals("悔棋"))
        {
            //如果是网络对战,则需要向对方发送申请,只有当对方同意后才能进行悔棋
            //如果是人机对战或人人对战,则需要弹出对话框要求进一步确认
//              chessNum[0] = 0;
//              chessNum[2] = 0;
//              for (int ii = 0; ii < LINE_NUM; ii++) {
//                    for (int jj = 0; jj < COLUMN_NUM; jj++) {
//                        if (matrix[ii][jj] == -1) {
//                            //黑子
//                            chessNum[0]++;
//                        } else if (matrix[ii][jj] == 1) {
//                            //白子
//                            chessNum[2]++;
//                        }
//                    }
//                }
//               this.setMatrix((int [][])(process.elementAt(chessNum[0]+chessNum[2]-4)));
//               //取出对应的矩阵,然后根据矩阵内容重绘
//               repaint();

        }
        else if (cmd.equals("保存游戏进度"))
        {

⌨️ 快捷键说明

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