📄 maincontrol.java~8~
字号:
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 + -