嚴禁任何商業用途,違者必究
*/
/** 五子棋程序
* @author ShuFeng An
* @author BeijingUiniversitiyOfChemicalTechnology
* @version 1.1
*/
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;
{
//棋盤位圖
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);
}
}
}
}
}
}