程序分析

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. 关于JNI调用从eclipse转到Android Studio遇到的问题(总结)

    将一个小应用从eclipse开发迁移到android studio,程序中有native代码实现,在eclipse是靠Android.mk这么个mk文件来组织编译的,但到android studio上 ...

  2. web开发之缓存

    以数据为驱动的web站点,当访问量增大后,由于频繁的从DB中读取数据,使得DB服务器的压力大增,从而影响系统的性能.为了缓解这种来自于大访问量的频繁读取DB的压力,我们可以把一些数据缓存起来,当请求过 ...

  3. TreeMap红黑树

    Java TreeMap实现了SortedMap接口,也就是说会按照key的大小顺序对Map中的元素进行排序,key大小的评判可以通过其本身的自然顺序(natural ordering),也可以通过构 ...

  4. sql中字符串连接

    有时候我们需要将由不同栏位获得的资料串连在一起,每一种数据库都提供一定的方法来达到这个目的,比如: MySQL: CONCAT() Oracle: CONCAT(), || SQL Server: + ...

  5. JDK1.7新特性(4):java语言动态性之反射API

    直接通过一个代码示例来熟悉java中通过反射来对构造函数/域以及方法处理的相关API: package com.rampage.jdk7.chapter2; import java.lang.refl ...

  6. Oracle执行计划的查看

    前言 一个系统在刚开始的时候,由于数据库中数据量不大,开发人员的主要精力都在业务与功能实现上.系统完成部署上线后随着时间的累积,每个表中的数据都在不断增长,我们往往会发现系统越来越慢,这可能是程序设计 ...

  7. C语言20150620

    1-->printf()输出的时候前面没有0 是十进制,前面带0是八进制,前面有0x是十六进制 printf("%d",100):十进制解析 printf("%d& ...

  8. 说一说HTTP

    什么是URI和URL URI用字符串标示某一互联网资源,而URL表示资源的地点.可见URL是URI的子集. URI要使用涵盖全部必要信息的URI.绝对URL以及相对URL.相对URL是指从浏览器中基本 ...

  9. JavaScript中自定义函数以及文本框、radio、下拉框的值的获取,结合淘宝竞拍案例来理解。。。

    淘宝竞拍案例: HTML部分代码: <form action="#" method="post"> <h2>欢迎进入淘宝竞拍</h ...

  10. UVA1583(最小生成元)

    对于这种需要一遍遍枚举求解的,打表可以提高很多效率 #include <iostream> #include <string> #include <cstring> ...