更新時間:2022-08-12 10:52:23 來源:動力節點 瀏覽1319次
本程序主要采用以下三種技術:(1)Swing編程;(2) ImageIO類的使用;(3) Graphics 圖片的繪制
對于這樣一個五子棋游戲程序。
1. 首先我們需要使用java.Swing和java.awt工具包來設計游戲的用戶界面,繪制圖像圖形,比如制作棋盤。
2. 另外ImageIO類還用于導入和顯示圖片作為游戲界面的背景。背景圖片可以自己設計。
3. 主界面制作完成后,我們可以添加事件監聽,使用鼠標監聽相關的類MouseListener在指定區域和位置點擊生成棋子進行下棋。
4. 接下來,我們可以設計算法來確定獲勝者。
5. 然后實現按鍵功能。
6. 最后調試測試看看程序有沒有bug。
導入 java.awt 、 java.io 和 javax.swing 工具包,其中包含用于創建用戶界面、繪制圖形圖像、導入圖像和監控鼠標的所有類.
導入 java.awt.Color;//顏色類用于為游戲界面著色
導入java.awt.Font;//字體類提供字體相關的類和接口。
導入 java.awt.Graphics;//Graphics類提供了執行繪圖、著色、文本輸出等實際操作功能的基類
導入 java.awt.Toolkit;
導入 java.awt.event.MouseEvent;
導入 java.awt.event.MouseListener;//監聽鼠標相關的類
導入 java.awt.image.BufferedImage;//導入圖片的處理類
導入java.io.File;// 文件和目錄路徑名的抽象表示。
導入 java.io.IOException;//異常類
導入 javax.imageio.ImageIO;//顯示圖片的類
導入 javax.swing.JFrame;//創建一個表單并設置它的大小、位置等屬性
導入 javax.swing.JOptionPane;//對話框相關類
設計游戲主窗口
公共類 FiveChessFrame 擴展 JFrame 實現 MouseListener,Runnable {
// 獲取屏幕的寬高,計算合適的位置使游戲界面居中
int width = Toolkit.getDefaultToolkit().getScreenSize().width;
int height = Toolkit.getDefaultToolkit().getScreenSize().height;
// 首先定義背景圖片為空
緩沖圖像 bgImage = null;
//這里定義的X和Y用于保存棋子的坐標
詮釋 x = 0;
整數 y = 0;
/** 定義一個19*19的二維數組來表示棋盤,其中數據內容0:表示該點沒有棋盤,1:表示該點為黑色,2:表示該點是白色的*/
int[][] allChess = new int[19][19];
// 判斷下一步是黑棋還是白棋
布爾 isBlack = true;
// 判斷當前游戲是否可以繼續
boolean canPlay = true;
// 保存顯示的提示信息,用于顯示在界面棋盤上方
String message = "黑色優先";
//設置五子棋游戲界面的主窗口(位置、大小、中心顯示等屬性)
公共 FiveChessFrame() {
this.setTitle("五子棋--曾雷");
this.setSize(500, 500);
this.setLocation((寬度 - 500) / 2, (高度 - 500) / 2);
this.setResizable(false);
// 設置窗體的關閉方式為默認,程序將結束
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
// 向窗體添加鼠標偵聽器
this.addMouseListener(this);
// 顯示表格
this.setVisible(true);
/**下面是導入預先設計好的圖片作為游戲界面的背景,應用于io流操作。背景圖片通過ImageIo類從磁盤導入到程序中,使用try IOException捕捉異常*/
嘗試 {
bgImage = ImageIO.read(new File("E:\\image\\128.jpg"));
} 捕捉(IOException e){
e.printStackTrace();
}
// 刷新屏幕防止游戲無顯示啟動
this.repaint();
}
畫棋盤
公共無效油漆(圖形g){
// 繪制背景
g.drawImage(bgImage, 1, 20, 這個);
// 輸出標題信息
g.setFont(new Font("Blackbody", Font.BOLD, 20));
g.drawString(" : " + 消息, 130, 60);
/**畫棋盤,在流出背景圖片的棋盤區域畫出棋盤的線,用for循環畫棋盤的線,掃所有18個相等的點,很容易計算*/
for (int i = 0; i < 19; i++) {
g2.drawLine(10, 70 + 20 * i, 370, 70 + 20 * i);
g2.drawLine(10 + 20 * i, 70, 10 + 20 * i, 430);
}
/** 使用Graphics類的fillOver方法標記棋盤上的九個點(只顯示一個,其余類似),可以先用鼠標監聽得到點的坐標,然后繪制*/
g2.fillOval(68, 128, 4, 4);
/**下面提供了繪制棋子的程序代碼,即通過鼠標監聽器判斷出在什么位置的棋子的顏色。參數傳遞 1 為黑色,2 為白色。*/
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;
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
}
if (allChess[i][j] == 2) {
int tempX = i * 20 + 10;
int tempY = j * 20 + 70;
g2.setColor(Color.WHITE);
g2.fillOval(tempX - 7, tempY - 7, 14, 14);
g2.setColor(Color.BLACK);
g2.drawOval(tempX - 7, tempY - 7, 14, 14);
}
}
}
g.drawImage(bi, 0, 0, 這個);
}
添加鼠標監視器
公共無效鼠標按下(鼠標事件e){
如果(可以播放 == 真){
x = e.getX();
y = e.getY();
如果 (x >= 10 && x <= 370 && y >= 70 && y <= 430) {
x = (x - 10) / 20;
y = (y - 70) / 20;
if (allChess[x][y] == 0) {
if (isBlack == true) {
所有國際象棋[x][y] = 1;
isBlack = 假;
message = "輪到白芳了";
} 別的 {
所有國際象棋[x][y] = 2;
isBlack =真;
message = "黑色方塊";
}
// 判斷該棋子是否與其他棋子連接5,即判斷游戲是否結束
boolean winFlag = this.checkWin();
如果(winFlag == true){
JOptionPane.showMessageDialog(this, "game over,"
+ (allChess[x][y] == 1 ? "Black Square" : "Baifang") + "勝利!");
可以播放=假;
}
} 別的 {
JOptionPane.showMessageDialog(this, "當前位置有棋子,請再放下!");
}
this.repaint();
}
}
給每個按鈕對應的功能
賦予開始游戲按鈕相應的功能。點擊“開始游戲”。如果要重新開始游戲,清除棋盤,將allchess中的數據清零,將“游戲信息”顯示改回初始狀態,將下一局游戲改為黑色方塊
如果 (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 70
&& e.getY() <= 100) {
int result = JOptionPane.showConfirmDialog(this, "你想重啟游戲嗎?");
如果(結果 == 0)
allChess = new int[19][19];
message = "黑色優先";
isBlack =真;
this.repaint();
}
}
賦予“退出游戲”按鈕對應功能
如果 (e.getX() >= 400 && e.getX() <= 470 && e.getY() >= 370
&& e.getY() <= 400) {
JOptionPane.showMessageDialog(this, "game over");
System.exit(0);
}
}
賦予“游戲設置”按鈕功能
如果 (e.getX() >= 387 && e.getX() <= 496 && e.getY() >= 228
&& e.getY() <= 261) {
字符串輸入 = JOptionPane
.showInputDialog("請輸入游戲的最大時間(公司:分鐘),如果輸入0,則無時間限制:");
嘗試 {
maxTime = Integer.parseInt(輸入) * 60;
如果(最大時間 < 0){
JOptionPane.showMessageDialog(this, "請輸入正確信息,不允許輸入負數!");
}
如果(最大時間 == 0){
int 結果 = JOptionPane.showConfirmDialog(this,
"設置完成,要重新開始游戲嗎?");
如果(結果 == 0){
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
所有國際象棋[i][j] = 0;
}
}
// 另一種方式是 allChess = new int[19][19];
message = "黑色優先";
isBlack =真;
黑色時間 = 最大時間;
白色時間 = 最大時間;
blackMessage = "無限";
whiteMessage = "無限";
this.canPlay = true;
this.repaint();
}
}
如果(最大時間> 0){
int 結果 = JOptionPane.showConfirmDialog(this,
"設置完成,要重新開始游戲嗎?");
如果(結果 == 0){
for (int i = 0; i < 19; i++) {
for (int j = 0; j < 19; j++) {
所有國際象棋[i][j] = 0;
}
}
// 另一種方式是 allChess = new int[19][19];
message = "黑色優先";
isBlack =真;
黑色時間 = 最大時間;
白色時間 = 最大時間;
blackMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
whiteMessage = maxTime / 3600 + ":"
+ (maxTime / 60 - maxTime / 3600 * 60) + ":"
+ (maxTime - maxTime / 60 * 60);
t.resume();
this.canPlay = true;
this.repaint();
}
}
} 捕捉(NumberFormatException e1){
// TODO 自動生成的 catch 塊
JOptionPane.showMessageDialog(this, "請正確輸入信息!");
}
}
放棄“放棄”按鈕功能
如果 (e.getX() >= 386 && e.getX() <= 496 && e.getY() >= 284
&& e.getY() <= 316) {
int result = JOptionPane.showConfirmDialog(this, "確認放棄?");
如果(結果 == 0){
如果(黑色){
JOptionPane.showMessageDialog(this, "黑方認輸,游戲結束!");
可以播放=假;
} 別的 {
JOptionPane.showMessageDialog(this, "白方認輸,游戲結束!");
可以播放=假;
}
可以播放=假;
}
}
賦予“游戲說明”按鈕功能
如果 (e.getX() >= 392 && e.getX() <= 493 && e.getY() >= 388
&& e.getY() <= 427) {
JOptionPane.showMessageDialog(這個,
“這是一個五子棋游戲程序,黑白雙方輪流下棋,一方接五,游戲結束。作者曾磊”);
}
判斷輸贏
私人布爾 checkWin() {
布爾標志 = 假;
// 保存連接了多少相同顏色的塊
整數計數 = 1;
//判斷水平方向是否有5個連接。特征縱坐標相同,即allChess[x][y]中的y值相同
int color = allChess[x][y];
//判斷水平
count = this.checkCount(1, 0, color);
如果(計數> = 5){
標志=真;
} 別的 {
//判斷垂直
count = this.checkCount(0, 1, color);
如果(計數> = 5){
標志=真;
} 別的 {
//判斷右上和左下
count = this.checkCount(1, -1, color);
如果(計數> = 5){
標志=真;
} 別的 {
//判斷右下角和左上角
count = this.checkCount(1, 1, color);
如果(計數> = 5){
標志=真;
}
}
}
}
返回標志;
}
//判斷連接的片數
私人 int checkCount(int xChange, int yChange, int color) {
整數計數 = 1;
int tempX = xChange;
int tempY = yChange;
而 (x + xChange >= 0 && x + xChange <= 18 && y + yChange >= 0
&& y + yChange <= 18
&& 顏色 == allChess[x + xChange][y + yChange]) {
計數++;
如果 (xChange != 0)
x改變++;
如果(yChange!= 0){
如果 (yChange > 0)
y改變++;
別的 {
y改變--;
}
}
}
xChange = tempX;
yChange = tempY;
而 (x - xChange >= 0 && x - xChange <= 18 && y - yChange >= 0
&& y - yChange <= 18
&& 顏色 == allChess[x - xChange][y - yChange]) {
計數++;
如果 (xChange != 0)
x改變++;
如果(yChange!= 0){
如果 (yChange > 0)
y改變++;
別的 {
y改變--;
}
}
}
返回計數;
}
檢測時限
公共無效運行(){
// TODO 自動生成的方法存根
//判斷是否有時間限制
如果(最大時間> 0){
而(真){
if (isBlack&&canPlay) {
黑色時間——;
如果(黑色時間 == 0){
JOptionPane.showMessageDialog(this, "黑方超時,游戲結束!");
}
} 否則 if(!isBlack&&canPlay) {
白色時間——;
如果(whiteTime == 0){
JOptionPane.showMessageDialog(this, "白方超時,游戲結束!");
}
}
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();
嘗試 {
線程.sleep(1000);
} 捕捉(InterruptedException e){
// TODO 自動生成的 catch 塊
e.printStackTrace();
}
System.out.println(blackTime + " -- " + whiteTime);
}
}
}
0基礎 0學費 15天面授
有基礎 直達就業
業余時間 高薪轉行
工作1~3年,加薪神器
工作3~5年,晉升架構
提交申請后,顧問老師會電話與您溝通安排學習