五子棋源码
package org.nick;
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 javax.swing.JFrame;
import javax.swing.JOptionPane;
public class FiveChess extends JFrame implements MouseListener, Runnable {
/** * */
private static final long serialVersionUID = 1L;
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
int x, y;
int[][] allChess = new int[15][15];
boolean isBlack = true;
boolean canPlay = true;
String message = "黑方先行";
int[] chessX = new int[255];
int[] chessY = new int[255];
int countX, countY;
int maxTime = 0;
int inputTime = 0;
String blackMessage = "无限制";
String whiteMessage = "无限制";
int blackTime = 29;
int whiteTime = 0;
Thread timer = new Thread(this);
public FiveChess() {
this.setTitle("五子棋游戏");
this.setSize(500, 500);
this.setLocation((width - 500) / 2, (height - 500) / 2);
this.setResizable(false);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.repaint();
this.addMouseListener(this);
timer.start();
timer.suspend();
}
public void paint(Graphics g) {
BufferedImage bi = new BufferedImage(500, 500,
BufferedImage.TYPE_INT_RGB);
Graphics g2 = bi.createGraphics();
g2.setColor(new Color(0, 169, 158));
g2.fill3DRect(43, 60, 375, 375, true);
for (int i = 0; i <= 15; i++) {
g2.setColor(Color.WHITE);
g2.drawLine(43, i * 25 + 60, 375 + 43, 60 + i * 25);
g2.drawLine(i * 25 + 43, 60, 43 + i * 25, 375 + 60);
}
g2.setFont(new Font("黑体", Font.BOLD, 20));
g2.drawString("游戏信息:" + message, 50, 50);
g2.drawRect(30, 440, 180, 40);
g2.drawRect(250, 440, 180, 40);
g2.setFont(new Font("宋体", 0, 12));
g2.drawString("黑方时间:" + blackMessage, 40, 465);
g2.drawString("白方时间:" + whiteMessage, 260, 465);
g2.drawRect(428, 66, 54, 20);
g2.drawString("重新开始", 432, 80);
g2.drawRect(428, 106, 54, 20);
g2.drawString("游戏设置", 432, 120);
g2.drawRect(428, 146, 54, 20);
g2.drawString("游戏说明", 432, 160);
g2.drawRect(428, 186, 54, 20);
g2.drawString("退出游戏", 432, 200);
g2.drawRect(428, 246, 54, 20);
g2.drawString("悔棋", 442, 260);
g2.drawRect(428, 286, 54, 20);
g2.drawString("认输", 442, 300);
for (int i = 0; i < 15; i++) {
for (int j = 0; j < 15; j++) {
if (allChess[i][j] == 1) {
int tempX = i * 25 + 55;
int tempY = j * 25 + 72;
g2.setColor(Color.BLACK);
g2.fillOval(tempX - 8, tempY - 8, 16, 16);
}
if (allChess[i][j] == 2) {
int tempX = i * 25 + 55;
int tempY = j * 25 + 72;
g2.setColor(Color.WHITE);
g2.fillOval(tempX - 8, tempY - 8, 16, 16);
g2.setColor(Color.BLACK);
g2.drawOval(tempX - 8, tempY - 8, 16, 16);
}
}
}
g.drawImage(bi, 0, 0, this);
}
public void mouseClicked(MouseEvent arg0) {
}
public void mouseEntered(MouseEvent arg0) {
}
public void mouseExited(MouseEvent arg0) {
}
public void mousePressed(MouseEvent e) {
boolean checkWin = false;
if (canPlay) {
x = e.getX();
y = e.getY();
if (x >= 55 && x <= 405 && y >= 72 && y <= 420) {
if ((x - 55) % 25 > 12)
x = (x - 55) / 25 + 1;
else
x = (x - 55) / 25;
if ((y - 72) % 25 > 12)
y = (y - 72) / 25 + 1;
else
y = (y - 72) / 25;
if (allChess[x][y] == 0) {
chessX[countX++] = x;
chessY[countY++] = y;
if (isBlack) {
allChess[x][y] = 1;
isBlack = false;
message = "白方下子";
blackTime = inputTime;
} else {
allChess[x][y] = 2;
isBlack = true;
message = "黑方下子";
whiteTime = inputTime;
}
this.repaint();
checkWin = isWin();
if (checkWin) {
if (allChess[x][y] == 1) {
JOptionPane.showMessageDialog(this, "游戏结束,黑方胜利");
restart();
}
else {
JOptionPane.showMessageDialog(this, "游戏结束,白方胜利");
restart();
}
}
}
}
}
if (e.getX() >= 428 && e.getX() <= 482 && e.getY() >= 66
&& e.getY() <= 86) {
int result = JOptionPane.showConfirmDialog(this, "是否重新开始游戏?");
if (result == 0) {
restart();
}
}
if (e.getX() >= 428 && e.getX() <= 482 && e.getY() >= 106
&& e.getY() <= 126) {
String input = JOptionPane
.showInputDialog("请输入游戏的最大时间(单位:秒),如果输入0,表示没有时间限制:");
maxTime = Integer.parseInt(input);
inputTime = Integer.parseInt(input);
System.out.println(maxTime);
if (maxTime < 0) {
JOptionPane.showMessageDialog(this, "输入的游戏时间有误,请重新设置!");
} else if (maxTime == 0) {
int result = JOptionPane.showConfirmDialog(this,
"游戏时间设置成功,是否开始游戏?");
if (result == 0) {
restart();
}
} else if (maxTime > 0) {
int result = JOptionPane.showConfirmDialog(this,
"游戏时间设置成功,是否重新开始游戏?");
if (result == 0) {
for (int i = 0; i < 15; i++)
for (int j = 0; j < 15; j++)
allChess[i][j] = 0;
for (int i = 0; i < 15; i++) {
chessX[i] = -1;
chessY[i] = -1;
}
countX = 0;
countY = 0;
message = "黑方先行";
isBlack = true;
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
blackTime = maxTime;
whiteTime = maxTime;
System.out.println(blackMessage + " - -" + whiteMessage);
timer.resume();
this.canPlay = true;
this.repaint();
}
}
}
if (e.getX() >= 428 && e.getX() <= 482 && e.getY() >= 146
&& e.getY() <= 166) {
JOptionPane.showMessageDialog(this, "简单一句:横竖斜先连成五子者获胜!");
}
if (e.getX() >= 428 && e.getX() <= 482 && e.getY() >= 186
&& e.getY() <= 206) {
int result = JOptionPane.showConfirmDialog(this, "是否退出游戏?");
if (result == 0) {
System.exit(0);
}
}
if (e.getX() >= 428 && e.getX() <= 482 && e.getY() >= 246
&& e.getY() <= 266) {
int result = JOptionPane.showConfirmDialog(this,
(isBlack == true ? "白方悔棋,黑方是否同意?" : "黑方悔棋,白方是否同意?"));
if (result == 0) {
allChess[chessX[--countX]][chessY[--countY]] = 0;
isBlack = (isBlack == true) ? false : true;
this.repaint();
}
}
if (e.getX() >= 428 && e.getX() <= 482 && e.getY() >= 286
&& e.getY() <= 306) {
int result = JOptionPane.showConfirmDialog(this, "是否认输?");
if (result == 0) {
JOptionPane.showMessageDialog(this, "游戏结束,"
+ (isBlack == true ? "黑方认输,白方获胜!" : "白方认输,黑方获胜!"));
for (int i = 0; i < 15; i++)
for (int j = 0; j < 15; j++)
allChess[i][j] = 0;
for (int i = 0; i < 15; i++) {
chessX[i] = -1;
chessY[i] = -1;
}
countX = 0;
countY = 0;
message = "黑方先行";
isBlack = true;
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
blackTime = maxTime;
whiteTime = maxTime;
System.out.println(blackMessage + " - -" + whiteMessage);
timer.resume();
this.canPlay = true;
this.repaint();
}
}
}
public void mouseReleased(MouseEvent arg0) {
}
private boolean isWin() {
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;
}
private int checkCount(int xChange, int yChange, int color) {
int count = 1;
int tempX = xChange;
int tempY = yChange;
while (x + xChange >= 0 && x + xChange <= 14 && y + yChange >= 0
&& y + yChange <= 14
&& color == allChess[x + xChange][y + yChange]) {
count++;
if (xChange != 0)
xChange++;
if (yChange != 0) {
if (yChange > 0)
yChange++;
else {
yChange--;
}
}
}
xChange = tempX;
yChange = tempY;
while (x - xChange >= 0 && x - xChange <= 14 && y - yChange >= 0
&& y - yChange <= 14
&& color == allChess[x - xChange][y - yChange]) {
count++;
if (xChange != 0)
xChange++;
if (yChange != 0) {
if (yChange > 0)
yChange++;
else {
yChange--;
}
}
}
return count;
}
public void run() {
if (maxTime > 0) {
while (true) {
if (isBlack) {
blackTime--;
if (blackTime == 0) {
JOptionPane.showMessageDialog(this, "黑方超时,游戏结束!");
restart();
}
} else {
whiteTime--;
if (whiteTime == 0) {
JOptionPane.showMessageDialog(this, "白方超时,游戏结束!");
restart();
}
}
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();
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
}
}
public void restart() {
for (int i = 0; i < 15; i++)
for (int j = 0; j < 15; j++)
allChess[i][j] = 0;
for (int i = 0; i < 15; i++) {
chessX[i] = 0;
chessY[i] = 0;
}
countX = 0;
countY = 0;
message = "黑方先行";
blackMessage = "无限制";
whiteMessage = "无限制";
blackTime = maxTime;
whiteTime = maxTime;
isBlack = true;
canPlay = true;
this.repaint();
}
public static void main(String[] args) {
new FiveChess();
}
}