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;
}
}
五子棋java编程
最新推荐文章于 2023-06-13 15:27:16 发布