java課程設計五子棋小遊戲(1)
該專案為經典版本的五子棋遊戲和自創的毀滅玩法所結合,總體而言是一個休閒的小遊戲。其中的規則不難,主要是為了豐富大家的文娛生活,讓大家在忙碌的學習課後可以輕鬆一小下。這就是本程式的編寫初衷。眾所周知,經典版本的五子棋不過就是判斷5連和5連以上的勝負,而這裡的毀滅版,可以“毀滅”對方的4連狀態,從而達到己方的攻擊 ,而使己方達到勝利。而對方亦可以運用這種方法獲得勝利。
首先,我們需要了解該程式是怎麼編寫的,需要用到哪些工具,用到哪些知識和方法。以及是如何運用該方法。
1:瞭解五子棋的執行機制。
2:瞭解博弈的對戰機制,如:怎麼獲得勝利,判斷勝利的條件。
3:遊戲主介面的構造,以及模型的建立。
4:各種功能如何實現,各個部分怎麼構成一個整體。
5:事件的處理。
6:如何生成棋盤,以及如何生成棋子。
7:對計時工具的設計,如何運用到多執行緒來解決。
對我要實現的相應功能,用一個框架圖可以來概述該程式各個部分的相依關係,以及各個功能是如何實現。如何將這些功能整合成為一個遊戲
通過該流程圖,我們可以看出,要完成一個五子棋遊戲。必須有兩大類,主介面類和相關的事件處理類,而主介面類包括選單介面的佈局、五子棋盤的生成、棋子的生成、和各種訊息框的提示。對於事件處理類,我們要監聽各種按鈕,分別實現他們相應的功能。例如開始按鈕,當點選開始按鈕後應該進入執棋的階段,在執棋的過程中又要在棋盤中生成新棋子,與主介面的棋盤相聯絡。還有點選遊戲設定按鈕,應該給於相應的使用者提示,需要輸入什麼資訊來設定遊戲。在這裡,遊戲設定按鈕主要是為了設定遊戲的限行時間,由此增加遊戲的難度。悔棋按鈕不用多說,毀滅按鈕是基於悔棋按鈕的設計之上的一個按鈕。可以毀掉對方的棋子。‘
然而我認為在編寫程式碼中最關鍵的部分有三點,一是如何生成棋盤,二是如何生成棋子,三是如何對勝負進行判斷。只要抓住這三個大點,這個遊戲就算是成功了一大半,下面對該遊戲的框架進行詳細設計。
需要用到的重要知識:
1:mouselistener()
功能:監聽滑鼠相關狀態.
mouseClicked(MouseEvente) 滑鼠按鍵在元件上單擊(按下並釋放)時呼叫。
mouseEntered(MouseEvente) 滑鼠進入到元件上時呼叫
mousePressed(MouseEvente) 滑鼠按下時呼叫
e.getX();獲取滑鼠當前按下的位置的X座標;
e.getY();獲取滑鼠當前按下的位置的Y座標;
在設定佈局時通常要用到這兩個函式輔助找到相應的座標。
這些是對滑鼠的監控實現的功能,需要在視窗中新增addMouseListener()方法;
2:Graphics 類
是所有圖形的抽象基類,允許程式在元件上影象上進行繪製
功能:覆寫JFrame 的paint()方法來使用,通過repaint()來呼叫
主要方法:drawstring();使用此圖形上下文的當前字型和顏色繪製由指定 string 給定的文字。
setFont();設定字型的屬性。
setColor();設定顏色。
drawOval();畫圓,用於畫棋盤的棋子,drawoval是空心的圓形邊框
fillOval();畫圖,用於畫棋盤的棋子,fillOvail是實心的圓
drawRect();繪製指定矩形的邊框。
fillRect();繪製指定實心矩形
drawImage();繪製指定影象中當前可用的影象。
3:frame類()
功能:實現主介面的佈局
主要方法:主類繼承自Jframe,在主類的建構函式中實現佈局的設定。
setIconImage(Imageimage);設定窗體的圖示,從檔案filename中獲得圖示。
setTitle(Stringsting);設定標題為字串string;
setDefaultCloseOperation();設定關閉窗體的操作
setResizable(Booleann);設定窗體是否為大小可以改變。
setLayout();設定窗體的佈局
setBounds(intx,int y,int width,int height)設定控制元件的邊界以及座標
setEditable()設定文字框是否可輸入。
4: JOptionPane
類
;
方法名 |
描述 |
showConfirmDialog |
詢問確認問題,回答 是/否/取消 |
sowInputDialog |
要求使用者輸入資料 |
showMessageDialog |
告知使用者發生的訊息 |
showOptionDiaog |
綜合以上三個方法 |
5:Thread類;
功能:實現多執行緒,計時器的主要實現方法。
主要方法:主類實現Runnable介面,重寫Thread類的run方法。
Threadt1 = new Thread(this);
實現主類執行緒的建立
t1.start();啟動執行緒,執行run方法;
t1.sleep(time);使執行緒休眠time 毫秒。
t1.stop();使執行緒停止執行.
需要實現的功能:
1:點選開始遊戲時在介面上有黑子或白子先行的提示,然後玩家開始行棋。
2:點選遊戲設定時提示相應輸入限制時間的資訊,讓玩家設定限定時間。
3:點選悔棋時給玩家一次悔棋機會。
4:點選毀滅時對方玩家棋子變成己方顏色,並且變成方形。
5:幫助,給出相關資訊提示幫助。
就三大關鍵給出解決—》
1:如何生成棋盤
首先在主類中定義一個二維陣列,int cb[][] = new int[15][15];
我將它命名為cb,英文名全寫是chessboard.它的長度為15行15列,在這裡可以對棋盤進行相關的數值儲存。然後,在paint()繪圖方法中,定義一個圖片檔案,BufferedImage image =null並且初始化,然後運用IO呼叫本地的圖片。在這裡我是自制了一張圖片用來作為該遊戲的背景,直接在paint()中讀取背景檔案,g.drawImage(0,0,this)直接繪畫在視窗上。
2:如何生成棋子。
在1中我們已經定義好了一個二維陣列,往二維陣列中儲存資料就是生成棋子的步驟。用1表示黑子,2表示白子,3表示白色方子,4表示黑色方子。當我需要在棋盤的某一點上落子時,獲取該點的座標,轉化成相應的二維陣列,cb[x][y]=1;
就是在該落點上下黑子,同理cb[x][y]=2就是白子。此時棋子以及生成完成。作為資料的狀態儲存在二維陣列中,方便於勝負的判斷。
3:如何判斷輸贏。
在2中我們已經生成好了棋子,並且將棋子的位置存貯在棋盤當中,只需要對二維陣列進行判斷就能得出勝負。此時打印出的二維陣列應該是這樣
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 2 0 0 0 0 0 0 0 0 0
0 0 0 0 2 0 0 0 1 0 0 0 0 0 0
0 2 0 0 0 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 2 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 1 1 0 0 0 0 0 0
0 0 0 0 2 0 0 0 1 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
判斷輸贏就變得容易,只需要判斷二維陣列中相關資料相鄰5次的情況。運用isWin()函式判斷橫向縱向左上左下右上右下的資料情況,下面有相關方法的具體程式碼展示。.
4:如何給遊戲設計計時
首先,我們需要給設定時間的按鈕繫結監控。在按下按鈕後要求使用者輸入限制的時間,進行相應的操作。當用戶輸入時間大於0時,啟動啟動執行緒,執行時間的遞減。
簡而言之,就是當黑方行棋時,計時器開始執行逐步遞減,當白方行棋時,黑方的時間停止遞減,輪到白方的時間遞減。當時間用盡時,遊戲就結束了。