Java实例---黑白五子棋[单机版]
程序分析
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实例---黑白五子棋[单机版]的更多相关文章
- JAVA课设---五子棋
1.团队博客链接 JAVA课设-五子棋-团队博客 2.个人负责模块: ①对鼠标事件的处理 , 此模块需处理五子棋的放置问题.颜色转换问题.以及当五子连线时弹出窗口显示结果. ②对MainFrame中主 ...
- Thrift入门及Java实例演示<转载备用>
Thrift入门及Java实例演示 作者: Michael 日期: 年 月 日 •概述 •下载配置 •基本概念 .数据类型 .服务端编码基本步骤 .客户端编码基本步骤 .数据传输协议 •实例演示(ja ...
- Protocol Buffer技术详解(Java实例)
Protocol Buffer技术详解(Java实例) 该篇Blog和上一篇(C++实例)基本相同,只是面向于我们团队中的Java工程师,毕竟我们项目的前端部分是基于Android开发的,而且我们研发 ...
- Java课程设计 ————五子棋 (个人博客)
JAVA课程设计 五子棋(博客个人版) •团队课程设计博客链接 http://www.cnblogs.com/mz201521044152/p/7065575.html •个人负责模块或任务说明 1. ...
- JAVA实例
JAVA实例1 1 package Demo3; import java.io.File; import java.io.FileReader; import java.io.IOExceptio ...
- Java 实例 - 如何执行指定class文件目录(classpath) Java 实例 J
Java 实例 - 如何执行指定class文件目录(classpath) Java 实例 如果我们 Java 编译后的class文件不在当前目录,我们可以使用 -classpath 来指定class ...
- Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs
ylbtech-Java-Runoob-高级教程-实例-方法:15. Java 实例 – 重载(overloading)方法中使用 Varargs 1.返回顶部 1. Java 实例 - 重载(ove ...
- Java-Runoob-高级教程-实例-方法:14. Java 实例 – Varargs 可变参数使用
ylbtech-Java-Runoob-高级教程-实例-方法:14. Java 实例 – Varargs 可变参数使用 1.返回顶部 1. Java 实例 - Varargs 可变参数使用 Java ...
- Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用
ylbtech-Java-Runoob-高级教程-实例-方法:13. Java 实例 – for 和 foreach循环使用 1.返回顶部 1. Java 实例 - for 和 foreach循环使用 ...
随机推荐
- SPSS学习系列之SPSS Statistics(简称SPSS)是什么?
不多说,直接上干货! IBM SPSS Statistics 为业务经理和分析人员提供解决基本业务和研究问题所需的核心统计过程.该软件提供的工具使用户能够快速查看数据.为其他测试拟定假设情况.执行澄清 ...
- PTA (Advanced Level) 1015 Reversible Primes
Reversible Primes A reversible prime in any number system is a prime whose "reverse" in th ...
- Go RabbitMQ(三)发布订阅模式
RabbitMQ 在上一节中我们创建了工作队列,并且假设每一个任务都能够准确的到达对应的worker.在本节中我们将介绍如何将一个消息传递到多个消费者,这也就是所说的发布订阅模式 为了验证该模式我们使 ...
- 转自IBM:Apache HTTP Server 与 Tomcat 的三种连接方式介绍
http://www.ibm.com/developerworks/cn/opensource/os-lo-apache-tomcat/index.html 整合 Apache Http Server ...
- OpenStack概述
OpenStack OpenStack is a cloud operating system that controls large pools of compute, storage, and n ...
- 按照拼音排序的SQL语句条件
ORDER BY nlssort(NAME, 'NLS_SORT=SCHINESE_PINYIN_M')
- 讨论!MyBatis中利用package自动扫描包中的类,默认别名不只是首字母小写!
问题描述:这个问题我是在看书的时候碰到的.书上写着通过package标签扫描包中的类,将其第一个字母变为小写作为其别名.我在网上查了一些博主也是这么写的 但是!我发现,无论大小写,只要是类名就好,而且 ...
- 面试遇到的mysql面试题
1.MySQL数据库有哪些内置函数?1.数学函数 2.字符串函数 3.日期和时间函数 4.条件判断函数5.系统信息函数 6.加密和压缩函数 7.聚合函数8.格式或类型转化函数. 2.如何返回一张表的数 ...
- Lua脚本语言基础知识
注释 在Lua中,你可以使用单行注释和多行注释. 单行注释中,连续两个减号"--"表示注释的开始,一直延续到行末为止.相当于C++语言中的"//". 多行注 ...
- python学习之老男孩python全栈第九期_day019作业
# 计算时间差 import time start_time = time.mktime(time.strptime('2017-09-11 08:30:00','%Y-%m-%d %H:%M:%S' ...