package com.test;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import javax.swing.*;
/**
* 功能描述: 作者: mistaker 邮箱:
[email protected] 创建时间: 2017年12月25日
*************************************
*/
public class ChessFrame extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private String[] strsize = { "标准棋盘", "改进棋盘", "扩大棋盘" };
private String[] strmode = { "人机对战", "人人对战" };
public static boolean iscomputer = true, checkcomputer = true;
private int width, height;
private ChessModel cm;
private MainPanel mp;
public ChessFrame() {
this.setTitle("五子棋游戏");
cm = new ChessModel(1);
mp = new MainPanel(cm);
Container con = this.getContentPane();
con.add(mp, "Center");
this.setResizable(false);
this.addWindowListener(new ChessWindowEvent());
MapSize(14, 14);
JMenuBar mbar = new JMenuBar();
this.setJMenuBar(mbar);
JMenu gameMenu = new JMenu("游戏");
mbar.add(makeMenu(gameMenu, new Object[] { "开局", null, "棋盘", null, "模式", null, "退出" }, this));
JMenu lookMenu = new JMenu("外观");
mbar.add(makeMenu(lookMenu, new Object[] { "类型一", "类型二", "类型三" }, this));
JMenu helpMenu = new JMenu("版本");
mbar.add(makeMenu(helpMenu, new Object[] { "关于" }, this));
}
public JMenu makeMenu(Object parent, Object items[], Object target) {
JMenu m = null;
if (parent instanceof JMenu)
m = (JMenu) parent;
else if (parent instanceof String)
m = new JMenu((String) parent);
else
return null;
for (int i = 0; i < items.length; i++)
if (items[i] == null)
m.addSeparator();
else if (items[i] == "棋盘") {
JMenu jm = new JMenu("棋盘");
ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int j = 0; j < strsize.length; j++) {
rmenu = makeRadioButtonMenuItem(strsize[j], target);
if (j == 0)
rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
} else if (items[i] == "模式") {
JMenu jm = new JMenu("模式");
ButtonGroup group = new ButtonGroup();
JRadioButtonMenuItem rmenu;
for (int h = 0; h < strmode.length; h++) {
rmenu = makeRadioButtonMenuItem(strmode[h], target);
if (h == 0)
rmenu.setSelected(true);
jm.add(rmenu);
group.add(rmenu);
}
m.add(jm);
} else
m.add(makeMenuItem(items[i], target));
return m;
}
public JMenuItem makeMenuItem(Object item, Object target) {
JMenuItem r = null;
if (item instanceof String)
r = new JMenuItem((String) item);
else if (item instanceof JMenuItem)
r = (JMenuItem) item;
else
return null;
if (target instanceof ActionListener)
r.addActionListener((ActionListener) target);
return r;
}
// 构造五子棋游戏的单选按钮式菜单项
public JRadioButtonMenuItem makeRadioButtonMenuItem(Object item, Object target) {
JRadioButtonMenuItem r = null;
if (item instanceof String)
r = new JRadioButtonMenuItem((String) item);
else if (item instanceof JRadioButtonMenuItem)
r = (JRadioButtonMenuItem) item;
else
return null;
if (target instanceof ActionListener)
r.addActionListener((ActionListener) target);
return r;
}
public void MapSize(int w, int h) {
setSize(w * 24, h * 27);
if (ChessFrame.checkcomputer)
ChessFrame.iscomputer = true;
else
ChessFrame.iscomputer = false;
mp.setModel(cm);
mp.repaint();
}
public boolean getiscomputer() {
return ChessFrame.iscomputer;
}
public void restart() {
int modeChess = cm.getModeChess();
if (modeChess <= 3 && modeChess >= 0) {
cm = new ChessModel(modeChess);
MapSize(cm.getWidth(), cm.getHeight());
}
}
@Override
public void actionPerformed(ActionEvent e) {
String arg = e.getActionCommand();
try {
if (arg.equals("类型三"))
UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
else if (arg.equals("类型二"))
UIManager.setLookAndFeel("com.sun.java.swing.plaf.motif.MotifLookAndFeel");
else
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel");
SwingUtilities.updateComponentTreeUI(this);
} catch (Exception ee) {
}
if (arg.equals("标准棋盘")) {
this.width = 14;
this.height = 14;
cm = new ChessModel(1);
MapSize(this.width, this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if (arg.equals("改进棋盘")) {
this.width = 18;
this.height = 18;
cm = new ChessModel(2);
MapSize(this.width, this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if (arg.equals("扩大棋盘")) {
this.width = 22;
this.height = 22;
cm = new ChessModel(3);
MapSize(this.width, this.height);
SwingUtilities.updateComponentTreeUI(this);
}
if (arg.equals("人机对战")) {
ChessFrame.checkcomputer = true;
ChessFrame.iscomputer = true;
cm = new ChessModel(cm.getModeChess());
MapSize(cm.getWidth(), cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if (arg.equals("人人对战")) {
ChessFrame.checkcomputer = false;
ChessFrame.iscomputer = false;
cm = new ChessModel(cm.getModeChess());
MapSize(cm.getWidth(), cm.getHeight());
SwingUtilities.updateComponentTreeUI(this);
}
if (arg.equals("开局")) {
restart();
}
if (arg.equals("关于"))
JOptionPane.showMessageDialog(null, "第一版", "版本", JOptionPane.PLAIN_MESSAGE);
if (arg.equals("退出"))
System.exit(0);
}
}
class ChessModel{
private int width,height,modeChess;
private int x=0,y=0;
private int[][] arrMapShow;
private boolean isOdd,isExist;
public ChessModel() {}
public ChessModel(int modeChess){
this.isOdd=true;
if(modeChess == 1){
PanelInit(14, 14, modeChess);
}
if(modeChess == 2){
PanelInit(18, 18, modeChess);
}
if(modeChess == 3){
PanelInit(22, 22, modeChess);
}
}
// 按照棋盘模式构建棋盘大小
private void PanelInit(int width, int height, int modeChess){
this.width = width;
this.height = height;
this.modeChess = modeChess;
arrMapShow = new int[width+1][height+1];
for(int i = 0; i <= width; i++){
for(int j = 0; j <= height; j++){
arrMapShow[i][j] = -1;
}
}
}
// 获取是否交换棋手的标识符
public boolean getisOdd(){
return this.isOdd;
}
// 设置交换棋手的标识符
public void setisOdd(boolean isodd){
if(isodd)
this.isOdd=true;
else
this.isOdd=false;
}
// 获取某棋盘方格是否有棋子的标识值
public boolean getisExist(){
return this.isExist;
}
// 获取棋盘宽度
public int getWidth(){
return this.width;
}
// 获取棋盘高度
public int getHeight(){
return this.height;
}
// 获取棋盘模式
public int getModeChess(){
return this.modeChess;
}
// 获取棋盘方格上棋子的信息
public int[][] getarrMapShow(){
return arrMapShow;
}
// 判断下子的横向、纵向坐标是否越界
private boolean badxy(int x, int y){
if(x >= width+20 || x < 0)
return true;
return y >= height+20 || y < 0;
}
// 计算棋盘上某一方格上八个方向棋子的最大值,
// 这八个方向分别是:左、右、上、下、左上、左下、右上、右下
public boolean chessExist(int i,int j){
if(this.arrMapShow[i][j]==1 || this.arrMapShow[i][j]==2)
return true;
return false;
}
// 判断该坐标位置是否可下棋子
public void readyplay(int x,int y){
if(badxy(x,y))
return;
if (chessExist(x,y))
return;
this.arrMapShow[x][y]=3;
}
// 在该坐标位置下棋子
public void play(int x,int y){
if(badxy(x,y))
return;
if(chessExist(x,y)){