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