import javax.swing.*;
import javax.swing.event.MouseInputAdapter;
import sun.java2d.pipe.DrawImage;
import java.applet.Applet;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.geom.Ellipse2D;
import java.awt.image.BufferedImage;
import java.net.*;
public class PlayChess extends JFrame{//继承JFrame之后playChess就是一个窗体
private Image imageBG;//背景图片对象
private Image imageBlack;//黑色棋子图片对象
private Image imageWhite;//白色棋子图片对象
private Image imageMenu;//菜单图片对象
private Image imageW;//没有笑的绿豆蛙图片对象
private Image imageX;//在笑的绿豆蛙图片对象
private Image imageRim;//红色框图片对象
private Color[][] allChesses=new Color[14][14];//所有的棋格
private MyCanvas canvas;//自定义的MyCanvas类并继承了JPanel
private boolean isGameBegin=false;//游戏是否开始
private boolean isGameOver=true;//游戏是否结束
private Stack stack;//链栈对象
private Robot robot;//机器人对象
private Thread PlayerThread;//玩家时间所对应的线程
private Thread robotThread;//机器人时间所对应的线程
private Thread unDoThread;//悔棋时间所对应的线程
private int unDoTime=5;//悔棋的时间间隔
private int playerTime=1800;//玩家的总时间
private int robotTime=1800;//机器人的总时间
private Graphics2D graphics2d;//画图对象
private Color whoSmile=null;//谁赢了谁显示在笑的绿豆蛙图片对象
private boolean isUndo=false;
public PlayChess(){//构造函数
this.setCursor(Toolkit.getDefaultToolkit().createCustomCursor(Toolkit.getDefaultToolkit().createImage(PlayChess.class.getResource("pointer.png")),new Point(0,0), ""));
Applet.newAudioClip(PlayChess.class.getResource("bg.mid")).loop();
stack=new Stack();
robot=new Robot();
URL imgUrl1 = PlayChess.class.getResource("bg_game.JPG");// 获取图片资源的路径
imageBG = Toolkit.getDefaultToolkit().getImage(imgUrl1);// 获取图片资源
URL imgUrl2 = PlayChess.class.getResource("black.png");// 获取图片资源的路径
imageBlack= Toolkit.getDefaultToolkit().getImage(imgUrl2);// 获取图片资源
URL imgUrl3 = PlayChess.class.getResource("white.png");// 获取图片资源的路径
imageWhite = Toolkit.getDefaultToolkit().getImage(imgUrl3);// 获取图片资源
URL imgUrl4 = PlayChess.class.getResource("menu.png");// 获取图片资源的路径
imageMenu = Toolkit.getDefaultToolkit().getImage(imgUrl4);// 获取图片资源
URL imgUrl5 = PlayChess.class.getResource("W.png");// 获取图片资源的路径
imageW = Toolkit.getDefaultToolkit().getImage(imgUrl5);// 获取图片资源
URL imgUrl6 = PlayChess.class.getResource("X.gif");// 获取图片资源的路径
imageX = Toolkit.getDefaultToolkit().getImage(imgUrl6);// 获取图片资源
URL imgUrl8 = PlayChess.class.getResource("rim.png");// 获取图片资源的路径
imageRim = Toolkit.getDefaultToolkit().getImage(imgUrl8);// 获取图片资源
this.setSize(700,550);//设置窗囗大小
setWindowCenter();//将窗囗居中
canvas=new MyCanvas();//创建一个MyCanvas对象
this.getContentPane().add(canvas);//将canvas对象添加到面板中
robotThread=new Thread(new Runnable(){
public void run(){
while(true){
if(robot.getMyIsPlayingChess()==true&&isGameBegin==true&&isUndo==false){
try{
robotThread.sleep(1000);
}
catch(Exception e){
e.printStackTrace();
}
robotTime--;
canvas.repaint();
if(robotTime==0){
isGameBegin=false;
isGameOver=true;
whoSmile=Color.white;
canvas.repaint();
JOptionPane.showMessageDialog(null,"你赢了!");
}
}
}
}
});
PlayerThread=new Thread(new Runnable(){
public void run(){//相执行start方法时该线程启动
while(true){//在循环中呢要控制时间走或停止,如果是玩家走棋时间就走否则就不走
if(robot.getMyIsPlayingChess()==false&&isGameBegin==true&&isUndo==false){
try{//如果机器人没有走棋而且游戏已经开始那么就表示玩家走棋
PlayerThread.sleep(1000);//线程睡一秒钟
}
catch(Exception e){
e.printStackTrace();
}
playerTime--;//玩家时间减一秒钟
canvas.repaint();//绘制窗囗
if(playerTime==0){//如果玩家的时间用完了,表示玩家输
isGameBegin=false;//游戏没有开始
isGameOver=true;//游戏结束
whoSmile=Color.black;//黑色笑
canvas.repaint();//绘制窗囗
JOptionPane.showMessageDialog(null,"机器人赢了!");
}
}
}
}
});
unDoThread=new Thread(new Runnable(){
public void run(){//到执行start方法时线程启动
while(true){
if(unDoTime==0){//悔棋时间到,开始走棋
unDoTime--;//设置悔棋时间为-1
if(stack.getStackTop()!=null){//如果栈顶不为空表示有记录
if(stack.getStackTop().getChessColor()==Color.white){{//如果为白色表示该机器人走棋
robot.cerebra(allChesses, canvas, Color.black,stack);//机器人走棋
if(checkRowIsFive(robot.getRow(), robot.getCol())||checkColIsFive(robot.getRow(), robot.getCol())||checkRightBias(robot.getRow(), robot.getCol())||checkLeftBias(robot.getRow(), robot.getCol())){//机器人是否赢
isGameBegin=false;
isGameOver=true;
whoSmile=Color.black;
canvas.repaint();
JOptionPane.showMessageDialog(null,"机器人赢了!");
return;
}
if(isDogfall()==true){//是否平局
isGameBegin=false;
isGameOver=true;
canvas.repaint();
JOptionPane.showMessageDialog(null,"平局了!");
return;
}
}
}
}
else{//表示棋盘上没有棋子了,也该机器人走棋
robot.cerebra(allChesses, canvas, Color.black,stack);
if(checkRowIsFive(robot.getRow(), robot.getCol())||checkColIsFive(robot.getRow(), robot.getCol())||checkRightBias(robot.getRow(), robot.getCol())||checkLeftBias(robot.getRow(), robot.getCol())){
isGameBegin=false;
isGameOver=true;
whoSmile=Color.black;
canvas.repaint();
whoSmile=Color.black;
canvas.repaint();
JOptionPane.showMessageDialog(null,"机器人赢了!");
return;
}
}
isUndo=false;//继续走棋
}
else{
try{
PlayerThread.sleep(1000);//线程睡一秒钟
unDoTime--;//悔棋时间减一
if(unDoTime==-10){
unDoTime=-1;
}
}
catch(Exception e){
e.printStackTrace();
}
}
}
}
});
canvas.addMouseListener(new MouseInputAdapter(){
public void mousePressed(MouseEvent e){
if((e.getX()>=179&&e.getX()<=652)&&(e.getY()>=30&&e.getY()<=497)&&isGameBegin==true&&robot.getMyIsPlayingChess()==false&&isUndo==false){ //如果鼠标在棋盘区域单击而且游戏开始而且机器人没有走棋那么就执行if块代码
int row=(int)((e.getY()-30)/33.4);//将坐标转换成下标行
int col=(int)((e.getX()-179)/33.8);//将坐标转换成下标列
if(allChesses[row][col]==null){//如果在该棋盘位置等于空就表示该位置没有下棋可以走棋
allChesses[row][col]=Color.white;//将白色赋值给该位置的二维数组
stack.Push(row, col, Color.white);//将该信息压入栈
canvas.repaint();//重新绘制,玩家走棋完毕
if(checkRowIsFive(row, col)||checkColIsFive(row, col)||checkRightBias(row, col)||checkLeftBias(row, col)){ //调用自定义函数判断四个方向是否有五子连珠,是否羸
isGameBegin=false;//游戏没有开始
isGameOver=true;//游戏结束
whoSmile=Color.white;//玩家羸,玩家笑
canvas.repaint();//重新绘制
JOptionPane.showMessageDialog(null,"你赢了!");
return;
}
if(isDogfall()==true){//如果玩家没有羸判断是否是平局
isGameBegin=false;//游戏没有开始
isGameOver=true;//游戏结束
canvas.repaint();//重新绘制
JOptionPane.showMessageDialog(null,"平局了!");
return;
}
robot.cerebra(allChesses, canvas, Color.black,stack);//玩家没有蠃,机器人走棋
if(checkRowIsFive(robot.getRow(), robot.getCol())||checkColIsFive(robot.getRow(), robot.getCol())||checkRightBias(robot.g