這是程序呈現(xiàn)的效果圖
利用AWT的位圖處理,其機制是單緩存,所以會造成程序閃爍
但可以利用Swing的雙緩存位圖處理,其機制是雙緩存,不會造成程序閃爍
下面是代碼塊
逐條進行了分析 和解釋
import javax.imageio.ImageIO;
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.event.MouseMotionAdapter;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
public class Gobang {//定義五子棋的棋盤
JFrame jf = new JFrame("五子棋游戲");
//聲明四個變量
BufferedImage table;
BufferedImage white;
BufferedImage black;
BufferedImage selected;
//聲明棋盤的高和寬
final int TABLE_WIDTH=535;
final int TABLE_HEIGHT=536;
//聲明棋盤橫向和縱向分別可以下多少子
final int BORD_SIZE = 15;
//聲明每顆棋子占用的比率
final int RATE = TABLE_WIDTH/BORD_SIZE;
//聲明偏移量
final int X_OFFSET = 5;
final int Y_OFFSET = 6;
//聲明一個二維數(shù)組,代表其下棋的坐標
//且如果為白棋則用1代表
//如果為黑棋則用2代表
//如果沒有落棋子則用0代表
int[][] board = new int[BORD_SIZE][BORD_SIZE];
//聲明紅色選擇框的坐標
private int selected_X = -1;
private int selected_Y = -1;
//自定義類,定義畫布
class ChessBoard extends JPanel{public void paint(Graphics g){//繪制棋盤
g.drawImage(table,0,0,null);
//繪制棋子
for (int i = 0; i< BORD_SIZE; i++) {for (int j = 0; j< BORD_SIZE; j++) {//繪制白旗
if (board[i][j] == 1){g.drawImage(white,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);
}
//繪制黑棋
if(board[i][j] ==2){g.drawImage(black,i*RATE+X_OFFSET,j*RATE+Y_OFFSET,null);
}
}
}
//繪制選擇框,并且添加偏移量,并且當坐標大于0的時候開始繪制
if (selected_X>0&&selected_Y>0){g.drawImage(selected,selected_X*RATE+X_OFFSET,selected_Y*RATE+Y_OFFSET,null);
}
}
}
//創(chuàng)建一個畫布對象
ChessBoard chessBoard = new ChessBoard();
//聲明一個變量,記錄當前下棋的顏色
int board_type = 1;
//聲明底部用到的按鈕
Panel p = new Panel();
Button whiteBn = new Button("白棋");
Button blackBn = new Button("黑棋");
Button deleteBn = new Button("刪除");
//封裝一個刷新按鈕的方法
public void refreshButtonColor(Color whiteBtn,Color blackBtn,Color deleteBtn){whiteBn.setBackground(whiteBtn);
blackBn.setBackground(blackBtn);
deleteBn.setBackground(deleteBtn);
}
public void init()throws Exception{//組裝試圖 編寫邏輯
whiteBn.addActionListener(e ->{//修改當前棋子的顏色
board_type = 1;
//修改被選中框的顏色
refreshButtonColor(Color.GREEN,Color.GRAY,Color.GRAY);
});
blackBn.addActionListener(e ->{//修改當前棋子的顏色
board_type = 2;
//修改被選中框的顏色
refreshButtonColor(Color.GRAY,Color.GREEN,Color.GRAY);
});
deleteBn.addActionListener(e ->{//修改當前棋子的顏色
board_type = 0;
//修改被選中框的顏色
refreshButtonColor(Color.GREEN,Color.GRAY,Color.GREEN);
});
p.add(whiteBn);
p.add(blackBn);
p.add(deleteBn);
jf.add(p,BorderLayout.SOUTH);
//初始化
table = ImageIO.read(new File("src/images/board.jpg"));
white = ImageIO.read(new File("src/images/white.gif"));
black = ImageIO.read(new File("src/images/black.gif"));
selected = ImageIO.read(new File("src/images/selected.gif"));
//處理鼠標移動
chessBoard.addMouseMotionListener(new MouseMotionAdapter() {@Override
public void mouseMoved(MouseEvent e) {//當鼠標移動時候被調(diào)用
selected_X=(e.getX()-X_OFFSET)/RATE;
selected_Y=(e.getY()-Y_OFFSET)/RATE;
chessBoard.repaint();
}
});
//處理鼠標點擊
chessBoard.addMouseListener(new MouseAdapter() {@Override
public void mouseClicked(MouseEvent e) {//當鼠標點擊時候會被調(diào)用
int xPos = (e.getX()-X_OFFSET)/RATE;
int yPos = (e.getY()-Y_OFFSET)/RATE;
board[xPos][yPos] = board_type;
chessBoard.repaint();
}
@Override
public void mouseExited(MouseEvent e) {selected_X = -1;
selected_Y = -1;
chessBoard.repaint();
}
});
//組裝棋盤
chessBoard.setPreferredSize(new Dimension(TABLE_WIDTH,TABLE_HEIGHT));
jf.add(chessBoard);
//設置大小最佳
jf.pack();
jf.setVisible(true);
}
public static void main(String[] args) throws Exception{new Gobang().init();
}
}
只是實現(xiàn)了GUI圖形化界面
還并未對游戲進行邏輯判斷
后續(xù)可用稀疏數(shù)組數(shù)據(jù)架構對游戲進行重構,優(yōu)化此游戲的判斷效率
如果自己想嘗試的話 需要項目圖片 可以私信我
后續(xù)會完善 異常拋出機制 勝利判斷邏輯 以及基于數(shù)據(jù)結構對游戲進行優(yōu)化
雖然程序不復雜,但是涉及的范圍很廣,還是很考驗對基礎知識的掌握
后續(xù)會更新,有興趣的可以自己試一下
你是否還在尋找穩(wěn)定的海外服務器提供商?創(chuàng)新互聯(lián)www.cdcxhl.cn海外機房具備T級流量清洗系統(tǒng)配攻擊溯源,準確流量調(diào)度確保服務器高可用性,企業(yè)級服務器適合批量采購,新人活動首月15元起,快前往官網(wǎng)查看詳情吧