五子棋java编程

来源:互联网 发布:bc优化 编辑:程序博客网 时间:2024/05/19 12:13

package biz;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import javax.imageio.*;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.io.File;
import java.io.IOException;
public class GobangFrame extends JFrame implements MouseListener {
// 得到屏幕长和宽
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 内存中new一个图片
BufferedImage bgimage = null;
// 记录鼠标点击位置
int x = 0;
int y = 0;
// 顶部临时值
boolean top = true;
// 显示时间临时值
boolean time = false;
// 开始
boolean begin = false;
// 游戏设置
boolean setup = false;
// 游戏说明
boolean explain = false;
// 认输
boolean surrender = false;
// 关于
boolean about = false;
// 退出
boolean out = false;
// 把棋盘下棋点定义为一个二维数组
int[][] allchessman = new int[19][19];
// 判断黑白下棋棋子的轮换
boolean turns = true;
// 判断游戏是否结束
boolean play = true;
/*
  * 窗体设置
  */
public GobangFrame() {
  // 设置窗体标题
  this.setTitle("五子棋");
  // 设置窗体大小
  this.setSize(500, 520);
  // 设置窗体初始化位置
  this.setLocation((width - 500) / 2, (height - 500) / 2);
  // 设置窗体不可改变大小
  this.setResizable(false);
  // 窗体关闭方式——关闭程序
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  // 窗体可见
  this.setVisible(true);
  // 加入鼠标监听器
  this.addMouseListener(this);
  // 导入背景图片
  try {
   bgimage = ImageIO.read(new File("./src/image/background.jpg"));
  } catch (IOException e) {
   e.printStackTrace();
  }
}
/*
  * 窗体绘制
  */
public void paint(Graphics g) {
  // 显示背景图片
  g.drawImage(bgimage, 0, 20, this);
  // 设置文字信息(字体,文字样式,大小)
  g.setFont(new Font("黑体", Font.BOLD, 30));
  // 写标题信息
  g.drawString("轮到你了", 120, 60);
  g.setFont(new Font("宋体", Font.BOLD, 15));
  // 时间信息
  g.drawString("黑方剩余时间", 26, 490);
  g.drawString("白方剩余时间", 248, 490);
  if (time == false) {
   g.setFont(new Font("宋体", Font.BOLD, 15));
   g.setColor(Color.green);
   g.drawRect(125, 470, 90, 28);
   g.drawRect(347, 470, 90, 28);
   g.setColor(Color.red);
   g.drawString("不 限 时", 138, 490);
   g.drawString("不 限 时", 360, 490);
  }
  // 画棋盘( 20 * 20 )
  for (int i = 0; i < 19; i++) {
   g.setColor(Color.RED);
   g.drawLine(20, 82 + 20 * i, 380, 82 + 20 * i);
   g.drawLine(20 + 20 * i, 82, 20 + 20 * i, 442);
   // 画中心9点位
   if (i < 3) {
    g.fillOval(77 + 120 * i, 139, 6, 6);
    g.fillOval(77 + 120 * i, 259, 6, 6);
    g.fillOval(77 + 120 * i, 379, 6, 6);
   }
  }
  /* 绘制全部棋子 */
  for (int m = 0; m < 19; m++) {
   for (int n = 0; n < 19; n++) {
    // 1为黑棋
    if (allchessman[m][n] == 1) {
     // 黑子
     g.setColor(Color.black);
     int temx = 20 * m + 20;
     int temy = 20 * n + 82;
     g.fillOval(temx - 7, temy - 7, 14, 14);
    }
    // 2为白棋
    if (allchessman[m][n] == 2) {
     // 白子
     int temx = 20 * m + 20;
     int temy = 20 * n + 82;
     g.setColor(Color.white);
     g.fillOval(temx - 7, temy - 7, 14, 14);
    }
   }
  }
  // top提示该谁下棋了
  // 默认为黑方先
  if (top == true) {
   g.setFont(new Font("黑体", Font.BOLD, 30));
   g.setColor(Color.red);
   g.drawString("黑棋", 250, 60);
   top = false;
  }
  if (allchessman[x][y] == 2) {
   g.setFont(new Font("黑体", Font.BOLD, 30));
   g.setColor(Color.RED);
   g.drawString("黑棋", 250, 60);
  } else if (allchessman[x][y] == 1) {
   g.setFont(new Font("黑体", Font.BOLD, 30));
   g.setColor(Color.RED);
   g.drawString("白棋", 250, 60);
  }
}
public void mouseClicked(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent arg0) {
  System.out.print(arg0.getX() + " ");
  System.out.println(arg0.getY());
  if (play == true) {
   // 得到鼠标点击的点的坐标
   x = arg0.getX();
   y = arg0.getY();
   // 游戏规则
   if (x >= 13 && x <= 387 && y >= 75 & y <= 449) {
    if (x <= 403 && x >= 473 && y <= 284 && y >= 315) {
     surrender = true;
     if (surrender == true) {
      JOptionPane.showMessageDialog(this, "游戏结束!/n黑方认输");
      play = false;
     } else {
      JOptionPane.showMessageDialog(this, "游戏结束!/n白方认输");
      play = false;
     }
    }
    x = (x - 20) / 20;
    y = (y - 77) / 20;
    /* 黑白棋子轮番换着下 */
    // 该点无棋子
    if (allchessman[x][y] == 0) {
     if (turns == true) {
      allchessman[x][y] = 1;
      turns = false;
     } else {
      allchessman[x][y] = 2;
      turns = true;
     }
     // 执行判断胜负的方法
     boolean win = this.checkwin();
     // 结束游戏
     if (win == true) {
      JOptionPane.showMessageDialog(this,
        allchessman[x][y] == 1 ? "黑方获胜" : "白方获胜"
          + "/n游戏结束");
      play = false;
      return;
     }
    } else {
     JOptionPane.showMessageDialog(this, "当前位置已有棋子/n请重新下!");
    }
    // 重复执行paint方法
    top = false;
    this.repaint();
   }
   // 4.判断是否有人认输
   if (x <= 403 && x >= 473 && y <= 284 && y >= 315) {
    surrender = true;
    if (surrender == true) {
     JOptionPane.showMessageDialog(this, "游戏结束!/n黑方认输");
     play = false;
    } else {
     JOptionPane.showMessageDialog(this, "游戏结束!/n白方认输");
     play = false;
    }
   }
  } else {
   // 1.开始
   if (x <= 403 && x >= 473 && y <= 73 && y >= 104) {
    begin = true;
    if (begin == true) {
     JOptionPane.showMessageDialog(this, "游戏开始/n祝你好运!");
     play = true;
    }
   }
   // 2.游戏设置
   if (x <= 403 && x >= 473 && y <= 125 && y >= 126) {
    setup = true;
    if (setup == true) {
     JOptionPane.showMessageDialog(this, "设置游戏限制时间");
    }
   }
   // 3.游戏说明
   if (x <= 403 && x >= 473 && y <= 178 && y >= 209) {
    explain = true;
    if (explain == true) {
     JOptionPane.showMessageDialog(this, "和五子棋玩法一样");
    }
   }
   // 5.关于
   if (x <= 403 && x >= 473 && y <= 337 && y >= 368) {
    about = true;
    if (about == true) {
     JOptionPane.showMessageDialog(this, "Adam制作完善");
    }
   }
   // 6.判断退出
   if (x <= 403 && x >= 473 && y <= 390 && y >= 421) {
    out = true;
    if (out == true) {
     int canout = JOptionPane.showConfirmDialog(this, "要退出吗?");
     if (canout == 0) {
      this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     }
    }
   }
  }
}
public void mouseReleased(MouseEvent arg0) {
}
private boolean checkwin() {
  // 返回值
  boolean flag = false;
  // 横向
  int countheng = 1;
  // 纵向
  int countshu = 1;
  // 左上右下
  int countzuoxie = 1;
  // 右上左下
  int countyouxie = 1;
  // 棋子颜色
  int color = allchessman[x][y];
  // 从1个棋子推算起
  int i = 1;
  /* 判断横向的连珠数 */
  // 向右检测
  while (color == allchessman[x + i][y]) {
   countheng++;
   i++;
  }
  i = 1;
  // 向左检测
  while (color == allchessman[x - i][y]) {
   countheng++;
   i++;
  }
  // 达到要求
  if (countheng >= 5) {
   flag = true;
   return flag;
  }
  i = 1;
  /* 判断纵向的连珠数 */
  // 向上检测
  while (color == allchessman[x][y + i]) {
   countshu++;
   i++;
  }
  i = 1;
  // //向下检测
  while (color == allchessman[x][y - i]) {
   countshu++;
   i++;
  }
  // 达到要求
  if (countshu >= 5) {
   flag = true;
   return flag;
  }
  i = 1;
  /* 判断左上右下向的连珠数 */
  // 向左上检测
  while (color == allchessman[x - i][y - i]) {
   countzuoxie++;
   i++;
  }
  i = 1;
  // 向右下检测
  while (color == allchessman[x + i][y + i]) {
   countzuoxie++;
   i++;
  }
  // 达到要求
  if (countzuoxie >= 5) {
   flag = true;
   return flag;
  }
  i = 1;
  /* 判断右上左下向的连珠数 */
  // 向右上检测
  while (color == allchessman[x + i][y - i]) {
   countyouxie++;
   i++;
  }
  i = 1;
  // 向左下检测
  while (color == allchessman[x - i][y + i]) {
   countyouxie++;
   i++;
  }
  // 达到要求
  if (countyouxie >= 5) {
   flag = true;
   return flag;
  }
  // 达不到5子连珠要求回滚
  return false;
}
}

原创粉丝点击