package com.lei3;
import javax.swing.*;
import javax.swing.plaf.FontUIResource;
import java.awt.event.*;//ActionListener方法需要导入此包
import java.util.ArrayList;
import java.util.List;
import java.awt.*;//Graphics绘画方法需要导入此包
public class GamePanel extends JPanel implements ActionListener{//用到继承类JPanel需要导入包javax.swing.*
private JMenuBar jmb = null;
private GameFrame mainFrame = null;
private GamePanel panel = null;
private int[][] board = new int [16][16];//注意数组初始化
public final int ROWS = 15;//行
public final int COLS = 15;//列
private String gameFlag = "start";//游戏状态
//创建指示器二维数组
public Pointer[][] pointers = new Pointer[ROWS][COLS];
// private List qizis = new ArrayList();
// 存棋子的集合
public List<Qizi> qizis = new ArrayList<Qizi>();public GamePanel() {
// TODO Auto-generated constructor stub
}
//构造方法
public GamePanel(GameFrame mainFrame) {
this.setLayout(null);
this.setOpaque(false);
this.mainFrame = mainFrame;
this.panel = this;
// 图片的加载
ImageValue.init();
//创建菜单
createMenu();
//创建鼠标监听
createMouseListener();
//数组内容
createPointers();
}
private void createPointers() {
int x = 0;
int y = 0;
int start = 26;
Pointer pointer;
for(int i=0;i<ROWS;i++) {
for(int j=0;j<COLS;j++) {
x=j*40+start;
y=i*40+start;
pointer = new Pointer(i,j,x,y);
pointers[i][j] = pointer;
}
}
// TODO Auto-generated method stub
}
int t1=1,k,t2=2;//作为模式选择的判断
// 方法实现清理前一步AI落子的标记
private void clearAIList() {
Qizi qizi;
for(int i=0;i<qizis.size();i++) {
qizi = qizis.get(i);
if(qizi!=null&&qizi.getType()==1) {
qizi.setLast(false);
}
}
// TODO Auto-generated method stub
}
private void createMouseListener() {
MouseAdapter mouseAdapter = new MouseAdapter() {
@Override
public void mouseClicked(MouseEvent e) {
if(!"start".equals(gameFlag)) return ;
//获取鼠标坐标
int x = e.getX();
int y = e.getY();
//循环指示器二维数组
Pointer pointer;
for(int i=0;i<ROWS;i++) {
for(int j=0;j<COLS;j++) {
pointer = pointers[i][j];
}
}
for(int i=0;i<ROWS;i++) {
for(int j=0;j<COLS;j++) {
board[i][j] = 0;
//得到每一个指示器对象
pointer = pointers[i][j];
if(pointer.isPoint(x, y)&&pointer.getType()==0) {
// System.out.println("落子");
if(mode!=0)
{
Qizi qizi = new Qizi(pointer.getX(),pointer.getY(),t2);
// 添加棋子
qizis.add(qizi);
pointer.setType(2);
board[j][i] = t2;//没下一个棋子 就标注出对应位置的颜色 0表示没棋子 1表示白棋 2 表示黑棋
}
if(mode==1) {
k = t1;
t1 = t2;
t2 = k;
}
clearAIList();
//重绘画布
repaint();
// 电脑下下一步
if(mode==2)
{
AI.next(panel);
board[j][i] = 1;//电脑下白棋 用1表示
if(AI.has5(pointer, panel)) {//你已经成功了
}
}
// System.out.println(j+" "+i+" "+board[j][i]);
return ;
}
}
}
//重绘画布
repaint();
// System.out.println("鼠标移动");
}
};
//添加鼠标监听
addMouseMotionListener(mouseAdapter);
addMouseListener(mouseAdapter);
// TODO Auto-generated method stub
}
@Override
public void paint(Graphics g) {
super.paint(g);
//绘制棋盘格子
drawGrid(g);
//绘制五个小黑点
deaw5Point(g);
//绘制指示器
drawPointer(g);
// 绘制棋子
drawQizi(g);
}
// 绘制棋子
private void drawQizi(Graphics g) {
Qizi qizi;
for(int i=0;i<qizis.size();i++) {
qizi = (Qizi) qizis.get(i);
qizi.draw(g);
}
// TODO Auto-generated method stub
}
//绘制指示器
private void drawPointer(Graphics g) {
Pointer pointer;
for(int i=0;i<ROWS;i++) {
for(int j=0;j<COLS;j++) {
pointer = pointers[i][j];
if(pointer!=null) {
pointer.draw(g);
}
}
}
// TODO Auto-generated method stub
}
//绘制五个小黑点
private void deaw5Point(Graphics g) {
//绘制第一个点(左上)
int x = 142;
int y = 142;
g.fillArc(x,y,8,8,0,360);
//绘制第二个点(右上)
x=462;
g.fillArc(x,y,8,8,0,360);
//绘制第三个点(左下)
x = 142;
y = 462;
g.fillArc(x,y,8,8,0,360);
//绘制第四个点(右下)
x = 462;
g.fillArc(x,y,8,8,0,360);
//绘制第五个点(居中)
x = 302;
y = 302;
g.fillArc(x,y,8,8,0,360);
// TODO Auto-generated method stub
}
//绘制棋盘格子
private void drawGrid(Graphics g) {
int start = 26;
int x1 = 26;
int y1 = 26;
int x2 = 586;
int y2 = 26;
int dis = 40;
for(int i=0;i<ROWS;i++)
{
y1 = i*dis+start;
y2 = y1;
g.drawLine(x1,y1,x2,y2);
}
y1 = 26;
x2 = 586;
for(int i=0;i<COLS;i++) {
x1 = i*dis+start;
x2 = x1;
g.drawLine(x1,y1,x2,y2);
}
// TODO Auto-generated method stub
}
//创建菜单
public void createMenu() {
jmb = new JMenuBar();
JMenu jMenu1 = new JMenu("菜单");
//创建菜单选项
JMenu jMenu2 = new JMenu("帮助");
//创建帮助
JMenuItem jmi1 = new JMenuItem("单机模式");
JMenuItem jmi2 = new JMenuItem("人机模式");
JMenuItem jmi3 = new JMenuItem("重新开始");
JMenuItem jmi4 = new JMenuItem("退出");
JMenuItem jmi5 = new JMenuItem("操作帮助");
JMenuItem jmi6 = new JMenuItem("获胜条件");
//在菜单项中添加选项
jMenu1.add(jmi1);
jMenu1.add(jmi2);
jMenu1.add(jmi3);
jMenu1.add(jmi4);
//在帮助中添加选项
jMenu2.add(jmi5);
jMenu2.add(jmi6);
jmb.add(jMenu1);
jmb.add(jMenu2);
mainFrame.setJMenuBar(jmb);
//添加监听
jmi1.addActionListener(this);
jmi2.addActionListener(this);
jmi3.addActionListener(this);
jmi4.addActionListener(this);
jmi5.addActionListener(this);
jmi6.addActionListener(this);
//设置指令
jmi1.setActionCommand("danji");
jmi2.setActionCommand("renji");
jmi3.setActionCommand("restart");
jmi4.setActionCommand("exit");
jmi5.setActionCommand("help");
jmi6.setActionCommand("win");
}
int mode=0;
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("菜单子项被点击了");
String command = e.getActionCommand();
System.out.println(command);
String s1 = "exit";
String s2 = "danji";
String s3 = "renji";
if(s1==command) {
System.out.println("退出游戏");
}
if(s2 == command) {
mode=1;
}
if(s3==command) {
mode=2;
}
// TODO Auto-generated method stub
}
//黑棋获胜
public void blackWin() {
gameFlag = "end";
//弹出游戏提示
UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
JOptionPane.showMessageDialog(mainFrame, "恭喜 黑棋获胜");
}
//白棋获胜
public void whiteWin() {
gameFlag = "end";
//弹出游戏提示
UIManager.put("OptionPane.buttonFont", new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
UIManager.put("OptionPane.messageFont", new FontUIResource(new Font("思源宋体",Font.ITALIC,18)));
JOptionPane.showMessageDialog(mainFrame, "恭喜 白棋获胜");
}
}