/*仅供个人学习交流使用
严禁任何商业用途,违者必究
*/
/** 五子棋程序
* @author ShuFeng An
* @author BeijingUiniversitiyOfChemicalTechnology
* @version 1.1
*/
严禁任何商业用途,违者必究
*/
/** 五子棋程序
* @author ShuFeng An
* @author BeijingUiniversitiyOfChemicalTechnology
* @version 1.1
*/
import java.awt.image.BufferedImage;
import javax.swing.JFrame;
import java.awt.Image;
import java.io.IOException;
import javax.swing.JPanel;
import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.Dimension;
import java.io.File ;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseAdapter;
import javax.swing.JOptionPane;
import java.awt.HeadlessException;
import javax.swing.JFrame;
import java.awt.Image;
import java.io.IOException;
import javax.swing.JPanel;
import javax.imageio.ImageIO;
import java.awt.Graphics;
import java.awt.Dimension;
import java.io.File ;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.event.MouseAdapter;
import javax.swing.JOptionPane;
import java.awt.HeadlessException;
public class WuZiQi
{
//棋盘位图
BufferedImage table;
//黑色棋子位图
BufferedImage black;
//白色棋子位图
BufferedImage white;
//鼠标移动时候的选择框
BufferedImage selected;
//棋子类型,是五子棋还是六字棋......
private final int TYPE = 5;
//标志符号,一个人不能连走
private static long n = -1;
//定义棋盘大小
private static int BOARD_SIZE = 15;
//定义棋盘宽高多少个像素
private final int TABLE_WIDTH = 535;
private final int TABLE_HETGHT = 536;
//定义棋盘坐标的像素值和棋盘数组之间的比率
private final int RATE = TABLE_WIDTH/BOARD_SIZE;
//定义棋盘坐标的像素值和棋盘数组之间的偏移距
private final int X_OFFSET = 5;
private final int Y_OFFSET = 6;
//结束标志d=TYPE结束
private int d = 0;
//定义一个二维数组来充当棋盘
private String[][] board = new String[BOARD_SIZE][BOARD_SIZE];
//五子棋的游戏窗口
JFrame f = new JFrame("树峰五子棋");
//五子棋游戏棋盘对应的Canvas组件
ChessBoard chessBoard = new ChessBoard();
//当前选中点的坐标
private int selectedX = -1;
private int selectedY = -1;
public void init() throws Exception
{
table = ImageIO.read(new File("image/board.jpg"));
black = ImageIO.read(new File("image/black.gif"));
white = ImageIO.read(new File("image/white.gif"));
selected = ImageIO.read(new File("image/selected.gif"));
//把每个元素赋为"╋",用于在控制台画出棋盘
for (int i = 0; i < BOARD_SIZE; i++)
{
for (int j = 0; j < BOARD_SIZE; j++)
{
board[i][j] = "╋";
}
}
chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,
TABLE_HETGHT));
chessBoard.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
//将用户鼠标事件的坐标转换成棋子数组的坐标
int xPox = (int) ((e.getX() - X_OFFSET) / RATE);
int yPos = (int) ((e.getY() - Y_OFFSET) / RATE);
//如果鼠标单击点儿无子绘一个子且轮流绘黑白子
if(n % 2 == 0 && board[xPox][yPos] == "╋")
{
board[xPox][yPos] = "●";
n++;
}
else if(board[xPox][yPos] == "╋")
{
board[xPox][yPos] = "○";
n++;
}
chessBoard.repaint();
//判断游戏是否结束
overOrNot(xPox, yPos);
}
//当鼠标退出棋盘区后复位选中点坐标
public void mouseExited(MouseEvent e)
{
selectedX =-1;
selectedY = -1;
chessBoard.repaint();
}
});
//当用户单击退出按钮时退出
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//当鼠标移动时改变选中点坐标
chessBoard.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent e)
{
selectedX = (int) ((e.getX() - X_OFFSET) / RATE);
selectedY = (int)(e.getY() - Y_OFFSET) / RATE;
chessBoard.repaint();
}
});
f.add(chessBoard);
//设置窗口图片为bfi
Image bfi = null;
try
{
bfi = ImageIO.read(new File("D://homework//image//myself.jpg"));
}
catch(IOException e)
{
e.printStackTrace();
}
f.setIconImage(bfi);
//设置窗口大小不可调
f.setResizable(false);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) throws Exception
{
System.out.println("欢迎使用树峰五子棋程序!");
WuZiQi wzq = new WuZiQi();
wzq.init();
}
public void overOrNot(int a, int b)
{
int i = 0;
//从左往右数有四个黑子
if(d <= TYPE)
{
for(i = a, d = 0;i <= a + 4; i++)
{
if(board[i][b] == "●" && i < BOARD_SIZE)
d++;
else
{
d=0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从右往左数有5个黑子
if(d <= TYPE)
{
for(i = a, d = 0;i >= a-4; i--)
{
if(board[i][b] == "●" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎您的下次光临!");
System.exit(0);
}
}
}
//从上往下数有5个黑子
if(d <= TYPE)
{
for(i = b, d = 0;i <= b + 4; i++)
{
if(board[a][i] == "●" && i < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从下往上数有5个黑子
if(d <= TYPE)
{
for(i = b, d = 0; i >= b-4; i--)
{
if(board[a][i] == "●" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着往左下方数5个
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b+i] == "●" && (a-i) >=0
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着右上方有五个黑子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a+i][b-i] == "●" && (a+i) < BOARD_SIZE
&& (b-i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着右下方有5个子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4;i++)
{
if(board[a+i][b+i] == "●" && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着左上方有5个子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b-i] == "●" && (a-i) >= 0 && (b-i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子正下方有一个正上方有三个一条纵线
if(d<=TYPE)
{
for(i = 0,d = 1;i <= 3;i++)
{
if(board[a][b-i] == "●" && board[a][b+1] == "●" && (b-i) >= 0 && (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子正上方有一个正下方有三个黑子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a][b+i] == "●" && board[a][b-1] == "●"
&& (b+i) < BOARD_SIZE && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子在正中间正上方有两个正下方有两个子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a][b-i] == "●" && board[a][b+i] == "●"
&&( b-i) >= 0 &&( b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向下有一个子斜左向上有三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b-i] == "●" && board[a+1][b+1] == "●"
&& (a-i) >= 0 && (b-i) >= 0 && (a+1) < BOARD_SIZE
&& (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子斜左向上有两个子右向下有两个子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b-i] == "●" && board[a+i][b+i] == "●"
&&(a-i) >= 0 && (b-i) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左斜向上有一子右向下有三个子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b+i] == "●" && board[a-1][b-1] == "●"
&& (a-1) >= 0 && (b-1) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d=0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向下有两个子右向上有两个子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b+i] == "●" && board[a+i][b-i] == "●"
&& (a-i) >= 0 && (b-i) >= 0 && ( b+i) < BOARD_SIZE
&& (a+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子右向上有一个子左向下有三个子
if(d <= TYPE)
{
for(i = 0,d = 1; i <= 3;i++)
{
if(board[a-i][b+i] == "●" && board[a+1][b-1] == "●"
&& (a-i) >= 0 && (b-1) >= 0 && (b+i) < BOARD_SIZE
&& (a+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向下一个子斜左向上三个子
if(d <= TYPE)
{
for(i = 0,d = 1; i <= 3; i++)
{
if(board[a+i][b-i] == "●" && board[a-1][b+1] == "●"
&& (a+i) < BOARD_SIZE && (b-i) >= 0 && (a-1)>=0
&& (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线右边一个左边三个子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b] == "●" && board[a+1][b] == "●"
&& (a-i) >= 0 && (a+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边两个右边两个
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b] == "●" && board[a+i][b] == "●"
&& (a-i) >= 0 && (a+i)<BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边一个右边三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b] == "●" && board[a-1][b] == "●"
&& (a+i) < BOARD_SIZE && (a-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边三个右边一个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b] == "○" && board[a+1][b] == "○"
&&(a-i) >= 0 &&(a+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条纵线下边一个上边三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a][b-i] == "○" && board[a][b+1 ] == "○"
&& (b-i) >= 0 && (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条纵线左边一个右边三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a][b+i] == "○" && board[a][b-1] == "○"
&& (b+i) < BOARD_SIZE && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条纵线左边两个右边两个白子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a][b-i] == "○" && board[a][b+i] == "○"
&& (b-i) >= 0 && (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子斜右向下一个左向上三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b-i] == "○" && board[a+1][b+1] == "○"
&& (a-i) >=0 && (b-i) >=0 && (a+1) < BOARD_SIZE
&& (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上两个右向下两个白子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b-i] == "○" && board[a+i][b+i] == "○"
&& (a-i) >= 0 &&(b-i) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上一个右向下三个白子
if(d<=TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b+i] == "○" && board[a-1][b-1] == "○"
&& (a+i) < BOARD_SIZE && (b+i) < BOARD_SIZE
&& (a-1) >= 0 && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上两个右向下两个
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b+i] == "○" && board[a+i][b-i] == "○"
&& (a-i) >= 0 && (b-i) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子右向上一个左向下三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b+i] == "○" && board[a+1][b-1] == "○"
&&(a-i) >= 0 && (b+i) < BOARD_SIZE && (a+1) < BOARD_SIZE
&&(b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上一个右向上三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b-i] == "○" && board[a-1][b-1] == "○"
&& (a+i) < BOARD_SIZE && (b-i) >= 0 && (a-1) >= 0 && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边两个右边两个
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b] == "○" && board[a+i][b] == "○"
&& (a-i) >= 0 && (a+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边一个右边三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3 ; i++)
{
if(board[a+i][b] == "○" && board[a-1][b] == "○"
&& (a + i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从左往右数有四个一条横线
if(d <= TYPE)
{
for(d = 0, i = a; i <= a + 4; i++)
{
if(board[i][b] == "○" && i < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从右往左数有四个白子一条横线
if(d <= TYPE)
{
for(i = a, d = 0; i >= a - 4; i--)
{
if(board[i][b] == "○" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从上往下数有四个一条纵线
if(d <= TYPE)
{
for(i = b, d = 0; i <= b + 4; i++)
{
if(board[a][i] == "○" && i < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从下往上数有四个
if(d <= TYPE)
{
for(i = b, d = 0; i >= b - 4; i--)
{
if(board[a][i] == "○" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜左向下有四个白子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b+i] == "○" && (a - i) >= 0
&& (b + i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向上有四个白子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4 ; i++)
{
if(board[a+i][b-i] == "○" && (a + i) < BOARD_SIZE
&& (b - i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向下四个白子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a+i][b+i] == "○" && (a + i) < BOARD_SIZE
&& (b + i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜左向上有四个子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b-i] == "○" && (a - i) >= 0 && (b - i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
}
public void happyEndBlack()
{
try
{
JOptionPane.showMessageDialog(f,"黑方:恭喜你!赢了,哈哈!");
}catch (HeadlessException e)
{
e.printStackTrace();
}
}
public void happyEndWhite()
{
try
{
JOptionPane.showMessageDialog(f,"白方:恭喜你!赢了,哈哈!");
}catch (HeadlessException e)
{
e.printStackTrace();
}
}
class ChessBoard extends JPanel
{
//重写JPanel的paint方法,实现画
public void paint(Graphics g)
{
//绘制五子棋棋盘
g.drawImage(table, 0, 0, null);
if(selectedX >= 0 && selectedY >= 0)
//绘制选中点的红框
g.drawImage(selected, selectedX * RATE + X_OFFSET,
selectedY * RATE + Y_OFFSET, null);
//遍历数组,绘制棋子
for (int i = 0; i < BOARD_SIZE; i++)
{
for (int j = 0; j < BOARD_SIZE; j++)
{
if (board[i][j].equals("●"))
{
g.drawImage(black, i * RATE + X_OFFSET,
j * RATE + Y_OFFSET, null);
}
if(board[i][j].equals("○"))
{
g.drawImage(white, i * RATE + X_OFFSET,
j * RATE + Y_OFFSET, null);
}
}
}
}
}
}
{
//棋盘位图
BufferedImage table;
//黑色棋子位图
BufferedImage black;
//白色棋子位图
BufferedImage white;
//鼠标移动时候的选择框
BufferedImage selected;
//棋子类型,是五子棋还是六字棋......
private final int TYPE = 5;
//标志符号,一个人不能连走
private static long n = -1;
//定义棋盘大小
private static int BOARD_SIZE = 15;
//定义棋盘宽高多少个像素
private final int TABLE_WIDTH = 535;
private final int TABLE_HETGHT = 536;
//定义棋盘坐标的像素值和棋盘数组之间的比率
private final int RATE = TABLE_WIDTH/BOARD_SIZE;
//定义棋盘坐标的像素值和棋盘数组之间的偏移距
private final int X_OFFSET = 5;
private final int Y_OFFSET = 6;
//结束标志d=TYPE结束
private int d = 0;
//定义一个二维数组来充当棋盘
private String[][] board = new String[BOARD_SIZE][BOARD_SIZE];
//五子棋的游戏窗口
JFrame f = new JFrame("树峰五子棋");
//五子棋游戏棋盘对应的Canvas组件
ChessBoard chessBoard = new ChessBoard();
//当前选中点的坐标
private int selectedX = -1;
private int selectedY = -1;
public void init() throws Exception
{
table = ImageIO.read(new File("image/board.jpg"));
black = ImageIO.read(new File("image/black.gif"));
white = ImageIO.read(new File("image/white.gif"));
selected = ImageIO.read(new File("image/selected.gif"));
//把每个元素赋为"╋",用于在控制台画出棋盘
for (int i = 0; i < BOARD_SIZE; i++)
{
for (int j = 0; j < BOARD_SIZE; j++)
{
board[i][j] = "╋";
}
}
chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,
TABLE_HETGHT));
chessBoard.addMouseListener(new MouseAdapter()
{
public void mouseClicked(MouseEvent e)
{
//将用户鼠标事件的坐标转换成棋子数组的坐标
int xPox = (int) ((e.getX() - X_OFFSET) / RATE);
int yPos = (int) ((e.getY() - Y_OFFSET) / RATE);
//如果鼠标单击点儿无子绘一个子且轮流绘黑白子
if(n % 2 == 0 && board[xPox][yPos] == "╋")
{
board[xPox][yPos] = "●";
n++;
}
else if(board[xPox][yPos] == "╋")
{
board[xPox][yPos] = "○";
n++;
}
chessBoard.repaint();
//判断游戏是否结束
overOrNot(xPox, yPos);
}
//当鼠标退出棋盘区后复位选中点坐标
public void mouseExited(MouseEvent e)
{
selectedX =-1;
selectedY = -1;
chessBoard.repaint();
}
});
//当用户单击退出按钮时退出
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
//当鼠标移动时改变选中点坐标
chessBoard.addMouseMotionListener(new MouseMotionAdapter()
{
public void mouseMoved(MouseEvent e)
{
selectedX = (int) ((e.getX() - X_OFFSET) / RATE);
selectedY = (int)(e.getY() - Y_OFFSET) / RATE;
chessBoard.repaint();
}
});
f.add(chessBoard);
//设置窗口图片为bfi
Image bfi = null;
try
{
bfi = ImageIO.read(new File("D://homework//image//myself.jpg"));
}
catch(IOException e)
{
e.printStackTrace();
}
f.setIconImage(bfi);
//设置窗口大小不可调
f.setResizable(false);
f.pack();
f.setVisible(true);
}
public static void main(String[] args) throws Exception
{
System.out.println("欢迎使用树峰五子棋程序!");
WuZiQi wzq = new WuZiQi();
wzq.init();
}
public void overOrNot(int a, int b)
{
int i = 0;
//从左往右数有四个黑子
if(d <= TYPE)
{
for(i = a, d = 0;i <= a + 4; i++)
{
if(board[i][b] == "●" && i < BOARD_SIZE)
d++;
else
{
d=0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从右往左数有5个黑子
if(d <= TYPE)
{
for(i = a, d = 0;i >= a-4; i--)
{
if(board[i][b] == "●" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎您的下次光临!");
System.exit(0);
}
}
}
//从上往下数有5个黑子
if(d <= TYPE)
{
for(i = b, d = 0;i <= b + 4; i++)
{
if(board[a][i] == "●" && i < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从下往上数有5个黑子
if(d <= TYPE)
{
for(i = b, d = 0; i >= b-4; i--)
{
if(board[a][i] == "●" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着往左下方数5个
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b+i] == "●" && (a-i) >=0
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着右上方有五个黑子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a+i][b-i] == "●" && (a+i) < BOARD_SIZE
&& (b-i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着右下方有5个子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4;i++)
{
if(board[a+i][b+i] == "●" && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜着左上方有5个子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b-i] == "●" && (a-i) >= 0 && (b-i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子正下方有一个正上方有三个一条纵线
if(d<=TYPE)
{
for(i = 0,d = 1;i <= 3;i++)
{
if(board[a][b-i] == "●" && board[a][b+1] == "●" && (b-i) >= 0 && (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子正上方有一个正下方有三个黑子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a][b+i] == "●" && board[a][b-1] == "●"
&& (b+i) < BOARD_SIZE && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子在正中间正上方有两个正下方有两个子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a][b-i] == "●" && board[a][b+i] == "●"
&&( b-i) >= 0 &&( b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向下有一个子斜左向上有三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b-i] == "●" && board[a+1][b+1] == "●"
&& (a-i) >= 0 && (b-i) >= 0 && (a+1) < BOARD_SIZE
&& (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子斜左向上有两个子右向下有两个子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b-i] == "●" && board[a+i][b+i] == "●"
&&(a-i) >= 0 && (b-i) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左斜向上有一子右向下有三个子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b+i] == "●" && board[a-1][b-1] == "●"
&& (a-1) >= 0 && (b-1) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d=0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向下有两个子右向上有两个子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b+i] == "●" && board[a+i][b-i] == "●"
&& (a-i) >= 0 && (b-i) >= 0 && ( b+i) < BOARD_SIZE
&& (a+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子右向上有一个子左向下有三个子
if(d <= TYPE)
{
for(i = 0,d = 1; i <= 3;i++)
{
if(board[a-i][b+i] == "●" && board[a+1][b-1] == "●"
&& (a-i) >= 0 && (b-1) >= 0 && (b+i) < BOARD_SIZE
&& (a+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向下一个子斜左向上三个子
if(d <= TYPE)
{
for(i = 0,d = 1; i <= 3; i++)
{
if(board[a+i][b-i] == "●" && board[a-1][b+1] == "●"
&& (a+i) < BOARD_SIZE && (b-i) >= 0 && (a-1)>=0
&& (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线右边一个左边三个子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b] == "●" && board[a+1][b] == "●"
&& (a-i) >= 0 && (a+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边两个右边两个
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b] == "●" && board[a+i][b] == "●"
&& (a-i) >= 0 && (a+i)<BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边一个右边三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b] == "●" && board[a-1][b] == "●"
&& (a+i) < BOARD_SIZE && (a-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndBlack();
System.out.println("黑方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边三个右边一个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b] == "○" && board[a+1][b] == "○"
&&(a-i) >= 0 &&(a+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条纵线下边一个上边三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a][b-i] == "○" && board[a][b+1 ] == "○"
&& (b-i) >= 0 && (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条纵线左边一个右边三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a][b+i] == "○" && board[a][b-1] == "○"
&& (b+i) < BOARD_SIZE && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条纵线左边两个右边两个白子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a][b-i] == "○" && board[a][b+i] == "○"
&& (b-i) >= 0 && (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子斜右向下一个左向上三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b-i] == "○" && board[a+1][b+1] == "○"
&& (a-i) >=0 && (b-i) >=0 && (a+1) < BOARD_SIZE
&& (b+1) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上两个右向下两个白子
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b-i] == "○" && board[a+i][b+i] == "○"
&& (a-i) >= 0 &&(b-i) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上一个右向下三个白子
if(d<=TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b+i] == "○" && board[a-1][b-1] == "○"
&& (a+i) < BOARD_SIZE && (b+i) < BOARD_SIZE
&& (a-1) >= 0 && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上两个右向下两个
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b+i] == "○" && board[a+i][b-i] == "○"
&& (a-i) >= 0 && (b-i) >= 0 && (a+i) < BOARD_SIZE
&& (b+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子右向上一个左向下三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a-i][b+i] == "○" && board[a+1][b-1] == "○"
&&(a-i) >= 0 && (b+i) < BOARD_SIZE && (a+1) < BOARD_SIZE
&&(b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//此子左向上一个右向上三个白子
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3; i++)
{
if(board[a+i][b-i] == "○" && board[a-1][b-1] == "○"
&& (a+i) < BOARD_SIZE && (b-i) >= 0 && (a-1) >= 0 && (b-1) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边两个右边两个
if(d <= TYPE)
{
for(i = 0, d = 2; i <= 2; i++)
{
if(board[a-i][b] == "○" && board[a+i][b] == "○"
&& (a-i) >= 0 && (a+i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//与此子一条横线左边一个右边三个
if(d <= TYPE)
{
for(i = 0, d = 1; i <= 3 ; i++)
{
if(board[a+i][b] == "○" && board[a-1][b] == "○"
&& (a + i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从左往右数有四个一条横线
if(d <= TYPE)
{
for(d = 0, i = a; i <= a + 4; i++)
{
if(board[i][b] == "○" && i < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从右往左数有四个白子一条横线
if(d <= TYPE)
{
for(i = a, d = 0; i >= a - 4; i--)
{
if(board[i][b] == "○" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从上往下数有四个一条纵线
if(d <= TYPE)
{
for(i = b, d = 0; i <= b + 4; i++)
{
if(board[a][i] == "○" && i < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//从下往上数有四个
if(d <= TYPE)
{
for(i = b, d = 0; i >= b - 4; i--)
{
if(board[a][i] == "○" && i >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜左向下有四个白子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b+i] == "○" && (a - i) >= 0
&& (b + i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向上有四个白子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4 ; i++)
{
if(board[a+i][b-i] == "○" && (a + i) < BOARD_SIZE
&& (b - i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜右向下四个白子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a+i][b+i] == "○" && (a + i) < BOARD_SIZE
&& (b + i) < BOARD_SIZE)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
//斜左向上有四个子
if(d <= TYPE)
{
for(i = 0, d = 0; i <= 4; i++)
{
if(board[a-i][b-i] == "○" && (a - i) >= 0 && (b - i) >= 0)
d++;
else
{
d = 0;
break;
}
if(d == TYPE)
{
happyEndWhite();
System.out.println("白方胜出!树峰欢迎你下次光临!");
System.exit(0);
}
}
}
}
public void happyEndBlack()
{
try
{
JOptionPane.showMessageDialog(f,"黑方:恭喜你!赢了,哈哈!");
}catch (HeadlessException e)
{
e.printStackTrace();
}
}
public void happyEndWhite()
{
try
{
JOptionPane.showMessageDialog(f,"白方:恭喜你!赢了,哈哈!");
}catch (HeadlessException e)
{
e.printStackTrace();
}
}
class ChessBoard extends JPanel
{
//重写JPanel的paint方法,实现画
public void paint(Graphics g)
{
//绘制五子棋棋盘
g.drawImage(table, 0, 0, null);
if(selectedX >= 0 && selectedY >= 0)
//绘制选中点的红框
g.drawImage(selected, selectedX * RATE + X_OFFSET,
selectedY * RATE + Y_OFFSET, null);
//遍历数组,绘制棋子
for (int i = 0; i < BOARD_SIZE; i++)
{
for (int j = 0; j < BOARD_SIZE; j++)
{
if (board[i][j].equals("●"))
{
g.drawImage(black, i * RATE + X_OFFSET,
j * RATE + Y_OFFSET, null);
}
if(board[i][j].equals("○"))
{
g.drawImage(white, i * RATE + X_OFFSET,
j * RATE + Y_OFFSET, null);
}
}
}
}
}
}
自己用JAVA写的五子棋,人人对弈算法,望大家赐教!