程序分析

FiveChessFrame.java

 package com.ftl.frame;

 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane; public class FiveChessFrame extends JFrame implements MouseListener, Runnable { // 获取屏幕高
int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); // 获取屏幕宽
int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); // 获取图片
BufferedImage image = null; // 保存X坐标
int x = 0; // 保存Y坐标
int y = 0; // 标识黑白棋子
boolean isBlack = true; // 表示当前游戏是否可以就
boolean canPlay = true; // 保存显示的信息
String message = "黑方"; // 游戏设置(线程操作) 最大时间/秒
int maxTime = 0; // 倒计时的线程
Thread t = new Thread(this); // 保存黑白方的剩余时间
int blackTime = 0;
int whiteTime = 0; // 保存双方剩余时间的显示信息 String blackMessage = "无限制";
String whiteMessage = "无限制"; // 二维数组保存所有的图标
// 其中数据内容 0 :空 1: 黑 2: 白
int[][] allChess = new int[19][19]; public FiveChessFrame() { // 设置窗体大xiao
this.setSize(500, 500); // 设置标题
this.setTitle("五子棋"); // 设置关闭窗口即关闭程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置可以放大窗体
this.setResizable(false); // 设置位置
this.setLocation((width - 500) / 2, (height - 500) / 2); // 增加鼠标监听
this.addMouseListener(this); try {
image = ImageIO.read(new File("gcg.jpg"));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//现场开始
t.start();
t.suspend(); //防止黑屏幕
this.repaint(); // 设置是否可见
this.setVisible(true);
} // 画画窗口
public void paint(Graphics g) {
// 双缓冲技术
// BufferedImage bi = new BufferedImage(500, 500,
// BufferedImage.TYPE_INT_ARGB);
// Graphics g = bi.createGraphics();
//
Font fontOld = g.getFont();
g.drawImage(image, 1, 20, this);
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("游戏信息:" + message, 160, 60);
g.setFont(new Font("宋体", 10, 20));
g.drawString("黑方时间: " + blackMessage, 40, 470);
g.drawString("白方时间: " + whiteMessage, 260, 470); // 画出底线
for (int i = 0; i < 19; i++) {
g.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);
g.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);
} // 标注位
g.fillOval(68, 128, 4, 4);
g.fillOval(308, 128, 4, 4);
g.fillOval(68, 368, 4, 4);
g.fillOval(308, 368, 4, 4);
g.fillOval(308, 248, 4, 4);
g.fillOval(188, 128, 4, 4);
g.fillOval(68, 248, 4, 4);
g.fillOval(188, 368, 4, 4);
g.fillOval(188, 248, 4, 4); // 圆点 // 绘制棋子
// g.fillOval(x, y, 10, 10);
// x = (x-10)/20 * 20 + 10; y = (y-70)/20 * 20 + 70; for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
// 黑子
if (allChess[i][j] == 1) {
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g.fillOval(tempX - 7, tempY - 7, 14, 14);
}
// 白子
if (allChess[i][j] == 2) {
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g.setColor(Color.WHITE);
g.fillOval(tempX - 7, tempY - 7, 14, 14);
g.setColor(Color.BLACK);
g.drawOval(tempX - 7, tempY - 7, 14, 14);
}
}
}
// g2.drawImage(bi, 0, 0, this); } @Override
public void mouseClicked(MouseEvent e) {
// TODO 自动生成的方法存根 } @Override
public void mouseEntered(MouseEvent e) {
// TODO 自动生成的方法存根 } @Override
public void mouseExited(MouseEvent e) {
// TODO 自动生成的方法存根 } @Override
public void mousePressed(MouseEvent e) { if (canPlay == true) {
// 获取X坐标
x = e.getX();
// 获取Y坐标
y = e.getY();
// 棋盘范围
if (x >= 10 && x <= 370 && y >= 70 && y <= 430) {
// 重新绘制,重新执行paint方法
x = (x - 10) / 20;
y = (y - 70) / 20; if (allChess[x][y] == 0) { // 判读棋子颜色
if (isBlack == true) {
allChess[x][y] = 1;
isBlack = false;
message = "白方";
} else {
allChess[x][y] = 2;
isBlack = true;
message = "黑方";
} // 判断是否连线结束
boolean winFlag = this.checkWin();
if (winFlag == true) {
JOptionPane.showMessageDialog(this, "游戏结束!"
+ (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜");
canPlay = false;
}
} else {
JOptionPane.showMessageDialog(this, "当前位置已经有棋子,请重新 落子");
}
this.repaint();
}
}
// 开始游戏
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 70
&& e.getY() <= 100) {
int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");
if (result == 0) {
// 棋盘清空,allChess数组的数据归0 (双层循环也可以)
// 游戏信息的显示改回开始位置
// canplay = true, isBlack = true,黑方开始游戏 allChess = new int[19][19];
message = "黑方";
isBlack = true;
canPlay = true;
// 初始化白方和黑房时间
blackTime = maxTime;
whiteTime = maxTime;
if (maxTime > 0) {
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = blackMessage;
t.resume();
}
else {
blackMessage = "无限制";
whiteMessage = "无限制";
}
this.repaint();
} if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
}
// 游戏设置
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 120
&& e.getY() <= 150) {
String input = JOptionPane.showInputDialog(this,
"请输入游戏的最大时间?(分钟),) 0表示没有时间限制");
try {
maxTime = Integer.parseInt(input) * 60;
if (maxTime < 0) {
JOptionPane.showMessageDialog(this, "时间不能为负,请输入正确时间信息!!!");
} if (maxTime == 0) {
int result = JOptionPane.showConfirmDialog(this,
"设置完成,是否重新开始游戏?");
if (result == 0) {
// 棋盘清空,allChess数组的数据归0 (双层循环也可以)
// 游戏信息的显示改回开始位置
// canplay = true, isBlack = true,黑方开始游戏 allChess = new int[19][19];
message = "黑方";
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = "无限制";
whiteMessage = "无限制";
this.repaint();
} if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
} if (maxTime > 0) {
int result = JOptionPane.showConfirmDialog(this,
"设置完成,是否重新开始游戏?");
if (result == 0) {
// 棋盘清空,allChess数组的数据归0 (双层循环也可以)
// 游戏信息的显示改回开始位置
// canplay = true, isBlack = true,黑方开始游戏 allChess = new int[19][19];
message = "黑方";
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = blackMessage;
t.resume();
this.repaint();
} if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
} } catch (Exception e2) {
JOptionPane.showMessageDialog(this, "请输入正确时间信息!!!");
} canPlay = true;
}
// 游戏说明
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 170
&& e.getY() <= 200) {
JOptionPane.showMessageDialog(this, "游戏说明");
}
// 认输
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 270
&& e.getY() <= 300) {
int result = JOptionPane.showConfirmDialog(this, "是否认输?");
if (result == 0) {
if (isBlack) {
JOptionPane.showMessageDialog(this, "黑方,已经认输,游戏结束!");
} else {
JOptionPane.showMessageDialog(this, "白方,已经认输,游戏结束!");
}
canPlay = false;
}
if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
}
// 关于
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 320
&& e.getY() <= 350) {
JOptionPane.showMessageDialog(this, "关于");
}
// 退出
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 370
&& e.getY() <= 400) {
JOptionPane.showMessageDialog(this, "退出");
System.exit(0);
}
} @Override
public void mouseReleased(MouseEvent e) {
// TODO 自动生成的方法存根 } public boolean checkWin() { // boolean flag = false;
// int i = 1;
// int count = 1;
// int color = allChess[x][y]; // 判断黑白
// // 判断横向 是否有5个棋子相连,即 allChess[x][y]的y 是相同的
// while (color == allChess[x + i][y]) {
// count++;
// i++;
// }
// i = 1;
// while (color == allChess[x - i][y]) {
// count++;
// i++;
// }
// if (count >= 5) {
// flag = true;
// }
//
//
// //纵向
// int i2 = 1;
// int count2 = 1;
// while (color == allChess[x][y + i2]) {
// count2++;
// i2++;
// }
// i2 = 1;
// while (color == allChess[x][y - i2]) {
// count2++;
// i2++;
// }
// if (count2 >= 5) {
// flag = true;
// }
//
// //斜方向(右上 + 坐下)
// int i3 = 1;
// int count3= 1;
// while (color == allChess[x + i3][y - i3]) {
// count3++;
// i3++;
// }
// i3 = 1;
// while (color == allChess[x - i3][y + i3]) {
// count3++;
// i3++;
// }
// if (count3 >= 5) {
// flag = true;
// }
//
// //左上 + 右下
// int i4 = 1;
// int count4= 1;
// while (color == allChess[x - i4][y - i4]) {
// count4++;
// i4++;
// }
// i4 = 1;
// while (color == allChess[x + i4][y + i4]) {
// count4++;
// i4++;
// }
// if (count4 >= 5) {
// flag = true;
// }
//
// boolean flag = false;
int count = 1;
int color = allChess[x][y]; // 判断黑白
count = this.checkCount(1, 0, color);
if (count >= 5) {
flag = true;
} else { // 纵向
count = this.checkCount(0, 1, color);
if (count >= 5) {
flag = true;
}else{//左下右上
count = this.checkCount(1, -1, color);
if (count >= 5) {
flag = true;
}else{
count = this.checkCount(1, 1, color); //右下左上
if (count >= 5) {
flag = true;
}
}
}
} return flag;
} public int checkCount( int xChange, int yChange, int color)
{
int count = 1;
int tempX = xChange;
int tempY = yChange; while ( x + xChange >= 0 && x + xChange <=18 &&
y + yChange >= 0 && y + yChange <= 18
&& color == allChess[x + xChange][y + yChange]) {
count++;
if(xChange!= 0 )
{
xChange++; //需要变化的
}
if(yChange!= 0 )
{
if(yChange > 0)
yChange++; //需要变化的
else{
yChange--;
}
}
}
// i4 = 1
xChange = tempX;
yChange = tempY;
while ( x + xChange >= 0 && x + xChange <=18 &&
y + yChange >= 0 && y + yChange <= 18
&&color == allChess[x - xChange][y - yChange])
{
count++;
if(xChange != 0 )
{
xChange++;
}
if(yChange != 0 )
{
if(yChange > 0)
yChange++; //需要变化的
else{
yChange--;
}
}
}
return count;
} @Override
public void run() {
// TODO 自动生成的方法存根
// 判断是否有时间限制
if (maxTime > 0) {
while (true) {
if (isBlack) {
blackTime--;
if(blackTime == 0 )
{
JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!!!");
}
} else {
whiteTime--;
if(whiteTime == 0 )
{
JOptionPane.showMessageDialog(this, "白方超时,游戏结束!!!");
}
}
// 时间倒计时
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
blackMessage = blackTime / 3600 + ":"
+ (blackTime / 60 - blackTime / 3600 * 60) + ":"
+ (blackTime - blackTime / 60 * 60);
whiteMessage = whiteTime / 3600 + ":"
+ (whiteTime / 60 - whiteTime / 3600 * 60) + ":"
+ (whiteTime - whiteTime / 60 * 60);
this.repaint();
System.out.println(blackTime + "------" + whiteTime);
}
}
}
}

MyFrame.java

 package com.ftl.frame;

 import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException; import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JOptionPane; public class FiveChessFrame extends JFrame implements MouseListener, Runnable { // 获取屏幕高
int height = (int) Toolkit.getDefaultToolkit().getScreenSize().getHeight(); // 获取屏幕宽
int width = (int) Toolkit.getDefaultToolkit().getScreenSize().getWidth(); // 获取图片
BufferedImage image = null; // 保存X坐标
int x = 0; // 保存Y坐标
int y = 0; // 标识黑白棋子
boolean isBlack = true; // 表示当前游戏是否可以就
boolean canPlay = true; // 保存显示的信息
String message = "黑方"; // 游戏设置(线程操作) 最大时间/秒
int maxTime = 0; // 倒计时的线程
Thread t = new Thread(this); // 保存黑白方的剩余时间
int blackTime = 0;
int whiteTime = 0; // 保存双方剩余时间的显示信息 String blackMessage = "无限制";
String whiteMessage = "无限制"; // 二维数组保存所有的图标
// 其中数据内容 0 :空 1: 黑 2: 白
int[][] allChess = new int[19][19]; public FiveChessFrame() { // 设置窗体大xiao
this.setSize(500, 500); // 设置标题
this.setTitle("Go Fighting FTL"); // 设置关闭窗口即关闭程序
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); // 设置可以放大窗体
this.setResizable(false); // 设置位置
this.setLocation((width - 500) / 2, (height - 500) / 2); // 增加鼠标监听
this.addMouseListener(this); try {
image = ImageIO.read(new File("F:" + File.separator + "gcg.jpg"));
} catch (IOException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
//现场开始
t.start();
t.suspend(); //防止黑屏幕
this.repaint(); // 设置是否可见
this.setVisible(true);
} // 画画窗口
public void paint(Graphics g) {
// 双缓冲技术
// BufferedImage bi = new BufferedImage(500, 500,
// BufferedImage.TYPE_INT_ARGB);
// Graphics g = bi.createGraphics();
//
Font fontOld = g.getFont();
g.drawImage(image, 1, 20, this);
g.setFont(new Font("黑体", Font.BOLD, 20));
g.drawString("游戏信息:" + message, 160, 60);
g.setFont(new Font("宋体", 10, 20));
g.drawString("黑方时间: " + blackMessage, 40, 470);
g.drawString("白方时间: " + whiteMessage, 260, 470); // 画出底线
for (int i = 0; i < 19; i++) {
g.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);
g.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);
} // 标注位
g.fillOval(68, 128, 4, 4);
g.fillOval(308, 128, 4, 4);
g.fillOval(68, 368, 4, 4);
g.fillOval(308, 368, 4, 4);
g.fillOval(308, 248, 4, 4);
g.fillOval(188, 128, 4, 4);
g.fillOval(68, 248, 4, 4);
g.fillOval(188, 368, 4, 4);
g.fillOval(188, 248, 4, 4); // 圆点 // 绘制棋子
// g.fillOval(x, y, 10, 10);
// x = (x-10)/20 * 20 + 10; y = (y-70)/20 * 20 + 70; for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
// 黑子
if (allChess[i][j] == 1) {
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g.fillOval(tempX - 7, tempY - 7, 14, 14);
}
// 白子
if (allChess[i][j] == 2) {
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g.setColor(Color.WHITE);
g.fillOval(tempX - 7, tempY - 7, 14, 14);
g.setColor(Color.BLACK);
g.drawOval(tempX - 7, tempY - 7, 14, 14);
}
}
}
// g2.drawImage(bi, 0, 0, this); } @Override
public void mouseClicked(MouseEvent e) {
// TODO 自动生成的方法存根 } @Override
public void mouseEntered(MouseEvent e) {
// TODO 自动生成的方法存根 } @Override
public void mouseExited(MouseEvent e) {
// TODO 自动生成的方法存根 } @Override
public void mousePressed(MouseEvent e) { if (canPlay == true) {
// 获取X坐标
x = e.getX();
// 获取Y坐标
y = e.getY();
// 棋盘范围
if (x >= 10 && x <= 370 && y >= 70 && y <= 430) {
// 重新绘制,重新执行paint方法
x = (x - 10) / 20;
y = (y - 70) / 20; if (allChess[x][y] == 0) { // 判读棋子颜色
if (isBlack == true) {
allChess[x][y] = 1;
isBlack = false;
message = "白方";
} else {
allChess[x][y] = 2;
isBlack = true;
message = "黑方";
} // 判断是否连线结束
boolean winFlag = this.checkWin();
if (winFlag == true) {
JOptionPane.showMessageDialog(this, "游戏结束!"
+ (allChess[x][y] == 1 ? "黑方" : "白方") + "获胜");
canPlay = false;
}
} else {
JOptionPane.showMessageDialog(this, "当前位置已经有棋子,请重新 落子");
}
this.repaint();
}
}
// 开始游戏
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 70
&& e.getY() <= 100) {
int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");
if (result == 0) {
// 棋盘清空,allChess数组的数据归0 (双层循环也可以)
// 游戏信息的显示改回开始位置
// canplay = true, isBlack = true,黑方开始游戏 allChess = new int[19][19];
message = "黑方";
isBlack = true;
canPlay = true;
// 初始化白方和黑房时间
blackTime = maxTime;
whiteTime = maxTime;
if (maxTime > 0) {
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = blackMessage;
t.resume();
}
else {
blackMessage = "无限制";
whiteMessage = "无限制";
}
this.repaint();
} if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
}
// 游戏设置
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 120
&& e.getY() <= 150) {
String input = JOptionPane.showInputDialog(this,
"请输入游戏的最大时间?(分钟),) 0表示没有时间限制");
try {
maxTime = Integer.parseInt(input) * 60;
if (maxTime < 0) {
JOptionPane.showMessageDialog(this, "时间不能为负,请输入正确时间信息!!!");
} if (maxTime == 0) {
int result = JOptionPane.showConfirmDialog(this,
"设置完成,是否重新开始游戏?");
if (result == 0) {
// 棋盘清空,allChess数组的数据归0 (双层循环也可以)
// 游戏信息的显示改回开始位置
// canplay = true, isBlack = true,黑方开始游戏 allChess = new int[19][19];
message = "黑方";
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = "无限制";
whiteMessage = "无限制";
this.repaint();
} if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
} if (maxTime > 0) {
int result = JOptionPane.showConfirmDialog(this,
"设置完成,是否重新开始游戏?");
if (result == 0) {
// 棋盘清空,allChess数组的数据归0 (双层循环也可以)
// 游戏信息的显示改回开始位置
// canplay = true, isBlack = true,黑方开始游戏 allChess = new int[19][19];
message = "黑方";
isBlack = true;
canPlay = true;
blackTime = maxTime;
whiteTime = maxTime;
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = blackMessage;
t.resume();
this.repaint();
} if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
} } catch (Exception e2) {
JOptionPane.showMessageDialog(this, "请输入正确时间信息!!!");
} canPlay = true;
}
// 游戏说明
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 170
&& e.getY() <= 200) {
JOptionPane.showMessageDialog(this, "游戏说明");
}
// 认输
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 270
&& e.getY() <= 300) {
int result = JOptionPane.showConfirmDialog(this, "是否认输?");
if (result == 0) {
if (isBlack) {
JOptionPane.showMessageDialog(this, "黑方,已经认输,游戏结束!");
} else {
JOptionPane.showMessageDialog(this, "白方,已经认输,游戏结束!");
}
canPlay = false;
}
if (result == 1) {
JOptionPane.showMessageDialog(this, "游戏继续");
}
if (result == 2) {
JOptionPane.showMessageDialog(this, "请继续游戏!!!");
}
}
// 关于
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 320
&& e.getY() <= 350) {
JOptionPane.showMessageDialog(this, "关于");
}
// 退出
if (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 370
&& e.getY() <= 400) {
JOptionPane.showMessageDialog(this, "退出");
System.exit(0);
}
} @Override
public void mouseReleased(MouseEvent e) {
// TODO 自动生成的方法存根 } public boolean checkWin() { // boolean flag = false;
// int i = 1;
// int count = 1;
// int color = allChess[x][y]; // 判断黑白
// // 判断横向 是否有5个棋子相连,即 allChess[x][y]的y 是相同的
// while (color == allChess[x + i][y]) {
// count++;
// i++;
// }
// i = 1;
// while (color == allChess[x - i][y]) {
// count++;
// i++;
// }
// if (count >= 5) {
// flag = true;
// }
//
//
// //纵向
// int i2 = 1;
// int count2 = 1;
// while (color == allChess[x][y + i2]) {
// count2++;
// i2++;
// }
// i2 = 1;
// while (color == allChess[x][y - i2]) {
// count2++;
// i2++;
// }
// if (count2 >= 5) {
// flag = true;
// }
//
// //斜方向(右上 + 坐下)
// int i3 = 1;
// int count3= 1;
// while (color == allChess[x + i3][y - i3]) {
// count3++;
// i3++;
// }
// i3 = 1;
// while (color == allChess[x - i3][y + i3]) {
// count3++;
// i3++;
// }
// if (count3 >= 5) {
// flag = true;
// }
//
// //左上 + 右下
// int i4 = 1;
// int count4= 1;
// while (color == allChess[x - i4][y - i4]) {
// count4++;
// i4++;
// }
// i4 = 1;
// while (color == allChess[x + i4][y + i4]) {
// count4++;
// i4++;
// }
// if (count4 >= 5) {
// flag = true;
// }
//
// boolean flag = false;
int count = 1;
int color = allChess[x][y]; // 判断黑白
count = this.checkCount(1, 0, color);
if (count >= 5) {
flag = true;
} else { // 纵向
count = this.checkCount(0, 1, color);
if (count >= 5) {
flag = true;
}else{//左下右上
count = this.checkCount(1, -1, color);
if (count >= 5) {
flag = true;
}else{
count = this.checkCount(1, 1, color); //右下左上
if (count >= 5) {
flag = true;
}
}
}
} return flag;
} public int checkCount( int xChange, int yChange, int color)
{
int count = 1;
int tempX = xChange;
int tempY = yChange; while ( x + xChange >= 0 && x + xChange <=18 &&
y + yChange >= 0 && y + yChange <= 18
&& color == allChess[x + xChange][y + yChange]) {
count++;
if(xChange!= 0 )
{
xChange++; //需要变化的
}
if(yChange!= 0 )
{
if(yChange > 0)
yChange++; //需要变化的
else{
yChange--;
}
}
}
// i4 = 1
xChange = tempX;
yChange = tempY;
while ( x + xChange >= 0 && x + xChange <=18 &&
y + yChange >= 0 && y + yChange <= 18
&&color == allChess[x - xChange][y - yChange])
{
count++;
if(xChange != 0 )
{
xChange++;
}
if(yChange != 0 )
{
if(yChange > 0)
yChange++; //需要变化的
else{
yChange--;
}
}
}
return count;
} @Override
public void run() {
// TODO 自动生成的方法存根
// 判断是否有时间限制
if (maxTime > 0) {
while (true) {
if (isBlack) {
blackTime--;
if(blackTime == 0 )
{
JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!!!");
}
} else {
whiteTime--;
if(whiteTime == 0 )
{
JOptionPane.showMessageDialog(this, "白方超时,游戏结束!!!");
}
}
// 时间倒计时
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO 自动生成的 catch 块
e.printStackTrace();
}
blackMessage = blackTime / 3600 + ":"
+ (blackTime / 60 - blackTime / 3600 * 60) + ":"
+ (blackTime - blackTime / 60 * 60);
whiteMessage = whiteTime / 3600 + ":"
+ (whiteTime / 60 - whiteTime / 3600 * 60) + ":"
+ (whiteTime - whiteTime / 60 * 60);
this.repaint();
System.out.println(blackTime + "------" + whiteTime);
}
}
}
}

Test.java

 package com.ftl.test;

 import javax.swing.JOptionPane;

 import com.ftl.frame.FiveChessFrame;
import com.ftl.frame.MyFrame; public class Test { public static void main(String[] args) {
MyFrame mf = new MyFrame(); int result = JOptionPane.showConfirmDialog(mf, "确认开始游戏?");
// if ( result == 0 )
// {
// String username = JOptionPane.showInputDialog(mf, "请输入您姓名:");
// if ( username != null )
// {
// JOptionPane.showMessageDialog(mf, "欢迎" + username + ",游戏即将开始! ");
// } else
// {
// JOptionPane.showMessageDialog(mf, "请输您的姓名:");
// }
// }
// if ( result == 1 )
// {
// JOptionPane.showMessageDialog(mf, " 游戏结束! ");
// }
// if ( result == 2 )
// {
// String username = JOptionPane.showInputDialog(mf, "请输入您姓名:");
// if ( username != null )
// {
// JOptionPane.showMessageDialog(mf, "欢迎" + username + ",游戏即将开始! ");
// } else
// {
// JOptionPane.showMessageDialog(mf, "请输您的姓名:");
// }
// }
// FiveChessFrame ff = new FiveChessFrame(); } }

游戏截图

源码下载

点击下载

Java实例---黑白五子棋[单机版]的更多相关文章

  1. JAVA课设---五子棋

    1.团队博客链接 JAVA课设-五子棋-团队博客 2.个人负责模块: ①对鼠标事件的处理 , 此模块需处理五子棋的放置问题.颜色转换问题.以及当五子连线时弹出窗口显示结果. ②对MainFrame中主 ...

  2. Thrift入门及Java实例演示<转载备用>

    Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...

  3. Protocol Buffer技术详解(Java实例)

    Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...

  4. Java课程设计 ————五子棋 (个人博客)

    JAVA课程设计 五子棋(博客个人版) •团队课程设计博客链接 http://www.cnblogs.com/mz201521044152/p/7065575.html •个人负责模块或任务说明 1. ...

  5. JAVA实例

     JAVA实例1  1 package Demo3; import java.io.File; import java.io.FileReader; import java.io.IOExceptio ...

  6. Java 实例 - 如何执行指定class文件目录(classpath) Java 实例 J

    Java 实例 - 如何执行指定class文件目录(classpath)  Java 实例 如果我们 Java 编译后的class文件不在当前目录,我们可以使用 -classpath 来指定class ...

  7. Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs

    ylbtech-Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs 1.返回顶部 1. Java 实例 - 重载(ove ...

  8. Java-Runoob-高级教程-实例-方法:14. Java 实例 – Varargs 可变参数使用

    ylbtech-Java-Runoob-高级教程-实例-方法:14. Java 实例 – Varargs 可变参数使用 1.返回顶部 1. Java 实例 - Varargs 可变参数使用  Java ...

  9. Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用

    ylbtech-Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用 1.返回顶部 1. Java 实例 - for 和 foreach循环使用 ...

随机推荐

  1. SPSS学习系列之SPSS Statistics导入读取数据(多种格式)(图文详解)

    不多说,直接上干货! SPSS Statistics导入读取数据的步骤: 文件  ->  导入数据 成功! 欢迎大家,加入我的微信公众号:大数据躺过的坑     免费给分享       同时,大 ...

  2. JavaScript数据结构-18.图结构广度优先和最短路径

    <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title> ...

  3. 如何阅读复杂的C类型声明

    阅读复杂的C类型声明,通常采用右左法则,也就是Clockwise/Spiral Rule (顺时针/螺旋法则). 本文将首先介绍工具(cdecl)(个人比较偏好使用工具提高学习和工作效率),然后中英文 ...

  4. HighCharts理解与总结

    摘自:http://www.highcharts.com/docs/getting-started/installation Installation Highcharts requires two ...

  5. CSS3多列Multi-column布局

    Properties 属性 CSS Version 版本 Inherit From Parent 继承性 Description 简介 columns css3 无 设置或检索对象的列数和每列的宽度. ...

  6. 20个专业H5(HTML5)动画工具推荐

    AnimateMate 可能是最好的 Sketch 动画插件.Sketch 目前被广泛应用于 HTML5 的原型界面设计,或者被应用于数据可视化的,动画部分则一般经由软件 Principle 等实现. ...

  7. 微信小程序 c#后台支付结果回调

    又为大家带来简单的c#后台支付结果回调方法,首先还是要去微信官网下载模板(WxPayAPI),将模板(WxPayAPI)添加到服务器上,然后在打开WxPayAPI项目中的example文件下的 Nat ...

  8. Java - 将可变性最小化

    不可变类,即实例不能被修改的类,实例中包含的所有信息在对象的生命周期内固定不变. 常见的比如String.基本类型的封装类.BigDecimal.BigInteger. 相对与可变类,不可变更易于设计 ...

  9. C# 之StringBulider简单用法

    StringBuild的是个动态对象,可直接拼加上字符串:而string对象的步骤:先初始化对象并赋值了,而后在拼加字符串时,先要创建需要拼加的字符串,然后再拼加,所以这就是StirngBuild远比 ...

  10. Git建立独立分支

    前言 在码云建立git项目后默认分支是master, 这里如果直接在码云新建分支, 会指定默认分支; 所以通过git 命令git checkout --orphan 新分支名 创建独立分支 创建 创建 ...