版權(quán)說(shuō)明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡(jiǎn)介
1、<p><b> 課程設(shè)計(jì)說(shuō)明書(shū)</b></p><p> 設(shè)計(jì)題目: 單機(jī)版五子棋 </p><p> 設(shè)計(jì)時(shí)間: 2011.12.15 至2012.1.5 </p><p> 指導(dǎo)教師: </p
2、><p> 評(píng) 語(yǔ):_________________________________</p><p> _________________________________________</p><p> _________________________________________</p><p> ____________
3、_____________________________</p><p> _________________________________________</p><p> 評(píng)閱成績(jī):__ __評(píng)閱教師:__ ___</p><p><b> 目 錄</b></p><p><b> 1
4、 引 言1</b></p><p> 1.1課程設(shè)計(jì)選題1</p><p> 1.2課程設(shè)計(jì)的目的1</p><p> 1.3本選題的設(shè)計(jì)背景1</p><p><b> 2 需求分析1</b></p><p> 2.1 功能需求1</p><
5、;p> 2.2 系統(tǒng)的開(kāi)發(fā)運(yùn)行環(huán)境1</p><p><b> 3 總體設(shè)計(jì)2</b></p><p> 3.1 系統(tǒng)體系結(jié)構(gòu)設(shè)計(jì)2</p><p> 3.2系統(tǒng)功能模塊及主要類設(shè)計(jì)2</p><p> 4 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)3</p><p> 4.1 主窗體模塊3&l
6、t;/p><p> 4.2 棋子索引模塊9</p><p> 4.3 棋盤(pán)構(gòu)造模塊10</p><p> 4.4 畫(huà)棋盤(pán)模塊12</p><p> 4.5 鼠標(biāo)按下模塊14</p><p> 4.6 判斷勝利算法模塊15</p><p> 4.7 重新開(kāi)始和悔棋算法模塊16&
7、lt;/p><p> 5 小結(jié)和展望18</p><p> 參 考 文 獻(xiàn)19</p><p><b> 附 錄19</b></p><p><b> 使用說(shuō)明書(shū)19</b></p><p><b> 源程序清單19</b></p&
8、gt;<p><b> 引 言</b></p><p><b> 1.1課程設(shè)計(jì)選題</b></p><p><b> 《單機(jī)版五子棋》</b></p><p> 1.2課程設(shè)計(jì)的目的</p><p> 使學(xué)生鞏固和加深以Java 語(yǔ)言為基礎(chǔ)的面向?qū)ο?/p>
9、編程技術(shù)理論知識(shí)的理解,提高實(shí)際動(dòng)手編程能力的培養(yǎng),掌握以Java為核心的應(yīng)用軟件開(kāi)發(fā)方案,達(dá)到能獨(dú)立閱讀、編制和調(diào)試一定規(guī)模的Java程序的水平。</p><p> 1.3本選題的設(shè)計(jì)背景</p><p> 描述為什么選擇本題目?</p><p> 五子棋是大家喜聞樂(lè)見(jiàn)的小游戲,規(guī)則簡(jiǎn)單,變化多端,非常有趣味性,</p><p>&l
10、t;b> 本選題的設(shè)計(jì)意義?</b></p><p> 通過(guò)編寫(xiě)五子棋小游戲的程序,進(jìn)一步鍛煉java圖形編程技巧和編寫(xiě)程序的能力。</p><p><b> 需求分析</b></p><p><b> 2.1 功能需求</b></p><p> 用戶角度考察系統(tǒng)應(yīng)具有哪
11、些功能及非功能性需求。</p><p> 這里實(shí)現(xiàn)了雙人對(duì)下的五子程序,程序提供重新開(kāi)局、悔棋功能,附加播放棋子落下的聲音和勝利聲音。</p><p> 2.2 系統(tǒng)的開(kāi)發(fā)運(yùn)行環(huán)境</p><p> 本系統(tǒng)開(kāi)發(fā)平臺(tái): Java </p><p> 本系統(tǒng)集成開(kāi)發(fā)環(huán)境:Eclipse</p><p> 本系統(tǒng)運(yùn)
12、行環(huán)境: windows xp或以上版本</p><p><b> 總體設(shè)計(jì)</b></p><p> 3.1 系統(tǒng)體系結(jié)構(gòu)設(shè)計(jì)</p><p><b> a系統(tǒng)的功能描述</b></p><p> 程序是一個(gè)雙人對(duì)戰(zhàn)五子棋程序,提供下五子棋必須的悔棋、重新開(kāi)始、退出等功能,兼播放聲音。&l
13、t;/p><p><b> b相關(guān)類設(shè)計(jì)</b></p><p> ChessBoard.java</p><p> 包含ChessBoard的公共類,主要功能是繪制棋盤(pán)、棋子、判斷輸贏。</p><p> Point.java</p><p> 包含名為Point的公共類,主要功能定義棋子
14、顏色,獲取索引。</p><p> StartChessJFrame.Java</p><p> 包含StartChessJFrame的公共類,主要功能,顯示主窗體界面,包括工具條面板,“重新開(kāi)始”、“悔棋”、“退出”按鈕。菜單欄,“系統(tǒng)”菜單,“重新開(kāi)始”、“悔棋”、“退出”菜單項(xiàng);“幫助”菜單,“關(guān)于五子棋”、“關(guān)于作者”菜單項(xiàng)。以上菜單項(xiàng)和按鈕,均加監(jiān)聽(tīng)器,實(shí)現(xiàn)對(duì)棋盤(pán)和窗口的控制
15、。令外,鼠標(biāo)點(diǎn)擊“退出”按鈕或菜單項(xiàng)時(shí)彈出提示。</p><p> 3.2系統(tǒng)功能模塊及主要類設(shè)計(jì)</p><p> ?、賁tartChessJFrame.java包含名為StartChessJFrame的pubilc類,主要用來(lái)顯示主窗體界面,包括工具條面板,“重新開(kāi)始”、“悔棋”、“退出”按鈕。菜單欄,“系統(tǒng)”菜單,“重新開(kāi)始”、“悔棋”、“退出”菜單項(xiàng);“幫助”菜單,“關(guān)于五子棋”
16、、“關(guān)于作者”菜單項(xiàng)。以上菜單項(xiàng)和按鈕,均加監(jiān)聽(tīng)器,實(shí)現(xiàn)對(duì)棋盤(pán)和窗口的控制。令外,鼠標(biāo)點(diǎn)擊“退出”按鈕或菜單項(xiàng)時(shí)彈出提示。編寫(xiě)一個(gè)內(nèi)部類MyItemListenerl來(lái)很監(jiān)聽(tīng)按鈕及菜單項(xiàng)單擊事件。</p><p> ?、诰帉?xiě)Point類,包括棋子x/y索引及其顏色,定義相應(yīng)的構(gòu)造方法和get()函數(shù)。</p><p> ③編寫(xiě)ChessBoard類,設(shè)置棋盤(pán)背景顏色為橘黃色,然后在主框架
17、中創(chuàng)建ChessBoard的對(duì)象,添加到主框架中。編寫(xiě)paintComponent方法繪制棋盤(pán)。</p><p> ?、茉贑hessBoard中創(chuàng)建Point[],然后在paintComponent繪制棋子數(shù)組。</p><p> ?、轂镃hessBoard實(shí)現(xiàn)監(jiān)聽(tīng)器MouseListener,覆蓋相應(yīng)的抽象方法,在構(gòu)造方法中添加監(jiān)聽(tīng)器(addMouseListener).。</p&
18、gt;<p> ⑥編寫(xiě)mousePressed方法內(nèi)容,預(yù)先定義isBlack表示下的黑棋還是白棋,PointCount表示當(dāng)前棋子數(shù)。</p><p> ?、邔⒃趍ousePressed中獲得的坐標(biāo)轉(zhuǎn)換成索引,在創(chuàng)建Point對(duì)象,添加到PointList中,在重新繪制。</p><p> ?、嗵砑酉鄳?yīng)判斷:不能畫(huà)到棋盤(pán)外,下過(guò)的地方不可以在下。(需要輔助方法findPo
19、int ).</p><p> ?、崽砑勇曇舨シ糯a。游戲結(jié)束后,點(diǎn)擊鼠標(biāo),不播放聲音,一方勝利后,播放勝利音樂(lè)。</p><p> 添加勝利判斷isWin,添加標(biāo)記變量GameOver。在mousePressed方法最前面加入GameOver的判斷,在mousePressed方法的最后調(diào)用isWin,返回true,則給消息提示,GamerOver設(shè)置為true。</p>
20、<p> ?、鈏sWin方法具體的編寫(xiě)。在當(dāng)前下棋的橫向,縱向,兩個(gè)斜向上分別判斷是否有連續(xù)的同色五子。</p><p><b> 詳細(xì)設(shè)計(jì)與實(shí)現(xiàn)</b></p><p><b> 4.1 主窗體模塊</b></p><p><b> 功能設(shè)計(jì)</b></p><p
21、> StartChessJFrame.java包含名為StartChessJFrame的pubilc類,主要用來(lái)顯示主窗體界面,包括工具條面板,“重新開(kāi)始”、“悔棋”、“退出”按鈕。菜單欄,“系統(tǒng)”菜單,“重新開(kāi)始”、“悔棋”、“退出”菜單項(xiàng);“幫助”菜單,“關(guān)于五子棋”、“關(guān)于作者”菜單項(xiàng)。以上菜單項(xiàng)和按鈕,均加監(jiān)聽(tīng)器,實(shí)現(xiàn)對(duì)棋盤(pán)和窗口的控制。令外,鼠標(biāo)點(diǎn)擊“退出”按鈕或菜單項(xiàng)時(shí)彈出提示。</p><p&g
22、t;<b> 界面設(shè)計(jì)</b></p><p> 包括菜單欄、棋盤(pán)、工具欄。菜單欄含系統(tǒng)、幫助菜單。</p><p> 系統(tǒng)菜單包含:重新開(kāi)始、悔棋、退出。幫助菜單包含:關(guān)于五子棋、關(guān)于作者。</p><p> 工具欄包含按鈕:重新開(kāi)始、悔棋、退出。</p><p><b> 棋盤(pán)用于對(duì)戰(zhàn)。</
23、b></p><p> 3模塊算法(或重要代碼段);</p><p> a下面的代碼實(shí)現(xiàn)的是監(jiān)聽(tīng)器,用于響應(yīng)菜單項(xiàng)和按鈕。</p><p> private class MyItemListener implements ActionListener {//事件監(jiān)聽(tīng)器內(nèi)部類</p><p> public void action
24、Performed(ActionEvent e) {</p><p> Object obj = e.getSource(); // 取得事件源</p><p> if (obj == StartChessJFrame.this.startMenuItem || obj == startButton) { </p><p><b> // 重新開(kāi)始&
25、lt;/b></p><p> // JFiveFrame.this內(nèi)部類引用外部類</p><p> System.out.println("重新開(kāi)始...");</p><p> chessBoard.restartGame();</p><p> } else if (obj == exitMenuIt
26、em || obj == exitButton) {</p><p> int exit=JOptionPane.showConfirmDialog(null, "確認(rèn)退出嗎?","" , JOptionPane.YES_NO_CANCEL_OPTION );</p><p> if(exit==JOptionPane.YES_OPTION)&l
27、t;/p><p> System.exit(0); // 結(jié)束應(yīng)用程序</p><p> } else if (obj == backMenuItem || obj == backButton) { // 悔棋</p><p> System.out.println("悔棋...");</p><p> chessBo
28、ard.goback();</p><p> }else if(obj == aboutMenuItem) </p><p> {JDialog jd = new JDialog(new StartChessJFrame(),"關(guān)于五子棋");</p><p> jd.setSize(200, 200);</p><p
29、> JLabel l = new JLabel("player1 vs player2,請(qǐng)2 位輪流使用鼠標(biāo)來(lái)下棋吧 ");</p><p> jd.add(l, BorderLayout.NORTH);</p><p> jd.setLocation(100, 200);</p><p> jd.setSize(300,300);
30、</p><p> jd.setVisible(true);</p><p> // jd.pack();</p><p> jd.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);</p><p> }else if(obj == authorMenuItem) </p&g
31、t;<p> {JDialog jd = new JDialog( new StartChessJFrame(),"關(guān)于作者");</p><p> jd.setSize(200, 200);</p><p> JLabel l = new JLabel("*_*");</p><p> jd.add(l
32、, BorderLayout.NORTH);</p><p> jd.setLocation(100, 200);</p><p> jd.setSize(300, 300);</p><p> jd.setVisible(true);</p><p> // jd.pack();</p><p> jd.s
33、etDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);</p><p><b> }</b></p><p><b> }</b></p><p> b主窗體的構(gòu)造方法 </p><p> StartChessJFrame() {</p&g
34、t;<p> setTitle("單機(jī)版五子棋");//設(shè)置標(biāo)題</p><p> chessBoard = new ChessBoard();//初始化面板對(duì)象</p><p> // 創(chuàng)建和添加菜單</p><p> menuBar = new JMenuBar();//初始化菜單欄</p><p&g
35、t; sysMenu = new JMenu("系統(tǒng)");//初始化菜單</p><p> helpMenu = new JMenu("幫助");</p><p> startMenuItem = new JMenuItem("重新開(kāi)始");</p><p> exitMenuItem = new
36、JMenuItem("退出");</p><p> backMenuItem = new JMenuItem("悔棋");//初始化菜單項(xiàng)</p><p> aboutMenuItem = new JMenuItem("關(guān)于五子棋");</p><p> authorMenuItem = new JM
37、enuItem("關(guān)于作者");</p><p> sysMenu.add(startMenuItem);</p><p> sysMenu.add(backMenuItem);</p><p> sysMenu.add(exitMenuItem);</p><p> helpMenu.add(aboutMenuI
38、tem);</p><p> helpMenu.add(authorMenuItem);</p><p> MyItemListener lis = new MyItemListener();//初始化按鈕事件監(jiān)聽(tīng)器內(nèi)部類</p><p> this.startMenuItem.addActionListener(lis);//將菜單項(xiàng)注冊(cè)到事件監(jiān)聽(tīng)器上<
39、;/p><p> backMenuItem.addActionListener(lis);</p><p> exitMenuItem.addActionListener(lis);</p><p> aboutMenuItem.addActionListener(lis);</p><p> authorMenuItem.addActi
40、onListener(lis);</p><p> menuBar.add(sysMenu);//將系統(tǒng)菜單添加到菜單欄上</p><p> menuBar.add(helpMenu);</p><p> setJMenuBar(menuBar);// 將menuBar設(shè)置為菜單欄</p><p> toolbar = new JPa
41、nel();//工具面板欄實(shí)例化</p><p> startButton = new JButton("重新開(kāi)始");//三個(gè)按鈕初始化</p><p> backButton = new JButton("悔棋");</p><p> exitButton = new JButton("退出");
42、</p><p> toolbar.setLayout(new FlowLayout(FlowLayout.LEFT));//將工具面板按鈕用FlowLayout布局</p><p> toolbar.add(startButton);//將三個(gè)按鈕添加到工具面板上</p><p> toolbar.add(backButton);</p>&l
43、t;p> toolbar.add(exitButton);</p><p> startButton.addActionListener(lis);//將三個(gè)按鈕注冊(cè)監(jiān)聽(tīng)事件</p><p> backButton.addActionListener(lis);</p><p> exitButton.addActionListener(lis);&l
44、t;/p><p> add(toolbar, BorderLayout.SOUTH);//將工具面板布局到界面"南"方也就是下面</p><p> add(chessBoard);//將面板對(duì)象添加到窗體上</p><p> setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);//設(shè)置界面
45、關(guān)閉事件</p><p> setSize(800,800);</p><p> pack(); // 自適應(yīng)大小</p><p> this.addWindowListener(new WindowAdapter(){</p><p> public void windowClosing(WindowEvent e) {</p
46、><p> int exit=JOptionPane.showConfirmDialog(null, "確認(rèn)退出嗎?","" , JOptionPane.YES_NO_CANCEL_OPTION );</p><p> if(exit==JOptionPane.YES_OPTION)</p><p> System.exit
47、(0);</p><p><b> }</b></p><p><b> });</b></p><p><b> 4調(diào)試與測(cè)試 </b></p><p> 測(cè)試結(jié)果的分析與討論,測(cè)試過(guò)程中遇到的主要問(wèn)題及采取的解決措施。</p><p> 下
48、圖是初步完成的界面,即未調(diào)用point類和ChessBoard類時(shí)的狀況。</p><p> 4.2 棋子索引模塊</p><p> 位于Point.java</p><p><b> 1主要功能</b></p><p> 此功能對(duì)應(yīng)Point.java文件,包含名為Point的public類,主要功能是獲取棋子
49、位置,定義棋子顏色。</p><p><b> 2主要代碼</b></p><p> import java.awt.Color;</p><p> /*五子棋的棋子設(shè)計(jì)。</p><p><b> */</b></p><p> public class Poin
50、t {</p><p> private int x; // 棋盤(pán)中的x索引</p><p> private int y; // 棋盤(pán)中的y索引</p><p> private Color color;//顏色</p><p> public static final int DIAMETER = 30;//直徑</p>
51、;<p> public Point(int x, int y, Color color) {</p><p> this.x = x;</p><p> this.y = y;</p><p> this.color = color;</p><p><b> }</b></p>
52、<p> public int getX() {// 拿到棋盤(pán)中的x索引</p><p><b> return x;</b></p><p><b> }</b></p><p> public int getY() {// 拿到棋盤(pán)中的Y索引</p><p><b>
53、 return y;</b></p><p><b> }</b></p><p> public Color getColor() {//得到顏色</p><p> return color;</p><p><b> }</b></p><p>&l
54、t;b> }</b></p><p> 4.3 棋盤(pán)構(gòu)造模塊</p><p> 位于ChessBoard.java</p><p><b> 1功能設(shè)計(jì)</b></p><p> 對(duì)應(yīng)ChessBoard類的構(gòu)造方法,主要功能設(shè)置棋盤(pán)邊距,橫豎線距離、棋子大小,將坐標(biāo)轉(zhuǎn)換成棋子的索引,并添加監(jiān)
55、聽(tīng)器,對(duì)棋子做相應(yīng)的處理:將坐標(biāo)轉(zhuǎn)換成索引,設(shè)置鼠標(biāo)形狀——指針型(指針在棋盤(pán)外和(x,y)坐標(biāo)已有棋子時(shí),這時(shí)不能下棋子。),其余情況設(shè)置成手型。</p><p> 2模塊算法(或重要代碼段);</p><p><b> a 預(yù)先定義的變量</b></p><p><b> b棋盤(pán)構(gòu)造方法。</b></p&g
56、t;<p> public ChessBoard() {</p><p> setBackground(Color.ORANGE);//設(shè)置背景顏色為橘黃色</p><p> addMouseListener(this);// 添加監(jiān)聽(tīng)器</p><p> addMouseMotionListener(new MouseMotionListen
57、er() { // 匿名內(nèi)部類</p><p> public void mouseDragged(MouseEvent e) {</p><p><b> }</b></p><p> public void mouseMoved(MouseEvent e) {</p><p> int x1 = (e.get
58、X() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; </p><p> // 將鼠標(biāo)點(diǎn)擊的坐標(biāo)位置轉(zhuǎn)換成網(wǎng)格索引。</p><p> int y1 = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;</p><p> // 游戲已經(jīng)結(jié)束,不能下</p><p
59、> // 落在棋盤(pán)外,不能下</p><p> // x,y位置已經(jīng)有棋子存在,不能下</p><p> if (x1 < 0 || x1 > ROWS || y1 < 0 || y1 > COLS || gameOver</p><p> || findChess(x1, y1))</p><p>
60、setCursor(new Cursor(Cursor.DEFAULT_CURSOR)); // 設(shè)置成默認(rèn)形狀</p><p><b> else</b></p><p> setCursor(new Cursor(Cursor.HAND_CURSOR)); // 設(shè)置成手型</p><p><b> }</b>&
61、lt;/p><p><b> });</b></p><p><b> }</b></p><p><b> 4.4 畫(huà)棋盤(pán)模塊</b></p><p> 位于ChessBoard.java</p><p><b> 1功能設(shè)計(jì)</
62、b></p><p> 繪制棋盤(pán),橫豎各有11條線,121個(gè)交點(diǎn)。底色橘黃黃色。棋盤(pán)的邊距30像素。</p><p> 繪制白棋子和黑棋子,最后下的子用紅色矩形標(biāo)記。</p><p><b> 2界面設(shè)計(jì)</b></p><p><b> 3模塊算法</b></p>&l
63、t;p><b> // 繪制</b></p><p> public void paintComponent(Graphics g) {</p><p> super.paintComponent(g);</p><p><b> // 畫(huà)棋盤(pán)</b></p><p> for (i
64、nt i = 0; i <= ROWS; i++) { // 畫(huà)橫線</p><p> g.drawLine(MARGIN, MARGIN + i * GRID_SPAN, MARGIN + COLS</p><p> * GRID_SPAN, MARGIN + i * GRID_SPAN);</p><p><b> }</b>&
65、lt;/p><p> for (int i = 0; i <= COLS; i++) {// 畫(huà)直線</p><p> g.drawLine(MARGIN + i * GRID_SPAN, MARGIN, MARGIN + i * GRID_SPAN,</p><p> MARGIN + ROWS * GRID_SPAN);</p><p
66、><b> }</b></p><p><b> // 畫(huà)棋子</b></p><p> for (int i = 0; i < chessCount; i++) {</p><p> int xPos = chessList[i].getX() * GRID_SPAN + MARGIN; // 網(wǎng)格交
67、叉點(diǎn)的x坐標(biāo)</p><p> int yPos = chessList[i].getY() * GRID_SPAN + MARGIN;// 網(wǎng)格交叉點(diǎn)的y坐標(biāo)</p><p> g.setColor(chessList[i].getColor()); // 設(shè)置顏色</p><p> g.fillOval(xPos - Point.DIAMETER / 2,
68、 yPos - Point.DIAMETER / 2,</p><p> Point.DIAMETER, Point.DIAMETER);</p><p> // 標(biāo)記最后一個(gè)棋子的紅矩形框</p><p> if (i == chessCount - 1) { // 最后一個(gè)棋子</p><p> g.setColor(Color.
69、red);</p><p> g.drawRect(xPos - Point.DIAMETER / 2,</p><p> yPos - Point.DIAMETER / 2, Point.DIAMETER,</p><p> Point.DIAMETER);</p><p><b> }</b></p&g
70、t;<p><b> }</b></p><p> 4.5 鼠標(biāo)按下模塊</p><p><b> 1 功能設(shè)計(jì)</b></p><p> 是對(duì)所下的棋子進(jìn)行處理,定義MousePress方法,預(yù)先定義isBlack表示下的是黑棋還是白棋,Point Count 表示當(dāng)前棋子數(shù),添加相應(yīng)的判斷,不能畫(huà)
71、到棋盤(pán)外,下過(guò)的地方不能再下。(需要輔助方法findPiont),然后將棋子的坐標(biāo)轉(zhuǎn)換成索引,在創(chuàng)建Point對(duì)象添加到PointList中,再重新繪制,當(dāng)游戲沒(méi)結(jié)束時(shí),落子播放聲音,當(dāng)有一方勝利時(shí),播放勝利音樂(lè),彈出提示窗口。</p><p><b> 2模塊算法</b></p><p> public void mousePressed(MouseEvent
72、e) {// 鼠標(biāo)按鍵在組件上按下時(shí)調(diào)用。</p><p> // 游戲已經(jīng)結(jié)束,不能下</p><p> if (gameOver)</p><p><b> return;</b></p><p> String colorName = isBlack ? "黑棋" : "白棋&
73、quot;;</p><p> xIndex = (e.getX() - MARGIN + GRID_SPAN / 2) / GRID_SPAN; // 將鼠標(biāo)點(diǎn)擊的坐標(biāo)位置轉(zhuǎn)換成網(wǎng)格索引。</p><p> yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;</p><p> // 落在棋盤(pán)外,
74、不能下</p><p> if (xIndex < 0 || xIndex > ROWS || yIndex < 0 || yIndex > COLS)</p><p><b> return;</b></p><p> // x,y位置已經(jīng)有棋子存在,不能下</p><p> if (f
75、indChess(xIndex, yIndex))</p><p><b> return;</b></p><p> Point ch = new Point(xIndex, yIndex, isBlack ? Color.black: Color.white);</p><p> chessList[chessCount++] = c
76、h;</p><p> repaint(); // 通知系統(tǒng)重新繪制</p><p> if(isWin()==false){ //播放落子音</p><p> musicFile=new File("qi.wav");</p><p> uri=musicFile.toURI();</p><
77、;p> try{ url=uri.toURL();}</p><p> catch(Exception exp){}</p><p> AudioClip clip=Applet.newAudioClip(url);</p><p> clip.play ();</p><p><b> } </b>&
78、lt;/p><p> if (isWin()) { //播放勝利音樂(lè)</p><p> musicFile=new File("win.wav");</p><p> uri=musicFile.toURI();</p><p> try{ url=uri.toURL();}</p><p>
79、 catch(Exception exp){}</p><p> AudioClip clip1=Applet.newAudioClip(url);</p><p> clip1.play ();</p><p> // 給出勝利信息,不能再繼續(xù)下棋</p><p> String msg = String.format("
80、恭喜,%s贏了!", colorName);</p><p> JOptionPane.showMessageDialog(this, msg);</p><p> gameOver = true;</p><p><b> }</b></p><p> isBlack = !isBlack;<
81、;/p><p><b> }</b></p><p> 4.6 判斷勝利算法模塊</p><p> 位于ChessBoard.java</p><p><b> 1 功能設(shè)計(jì)</b></p><p> 判斷黑子或白子勝利。對(duì)應(yīng)方法private boolean isWi
82、n()。</p><p><b> 2模塊算法</b></p><p> 大致算法介紹,要判斷那方勝利,,應(yīng)以棋盤(pán)上最后的棋子為中心,依次個(gè)方向上尋找棋子———東西方向、南北方向、東南西北、東北西南,只要一個(gè)啊放蕩向上同色棋子大于等于5個(gè),該色棋子就勝利。</p><p> 下面是橫向查找的算法,其他3個(gè)方向的查找方法與此類似</p
83、><p> int continueCount = 1; // 連續(xù)棋子的個(gè)數(shù)</p><p><b> // 橫向向西尋找</b></p><p> for (int x = xIndex - 1; x >= 0; x--) {</p><p> Color c = isBlack ? Color.black
84、 : Color.white;</p><p> if (getChess(x, yIndex, c) != null) {</p><p> continueCount++;</p><p><b> } else</b></p><p><b> break;</b></p>
85、<p><b> }</b></p><p><b> // 橫向向東尋找</b></p><p> for (int x = xIndex + 1; x <= ROWS; x++) {</p><p> Color c = isBlack ? Color.black : Color.white
86、;</p><p> if (getChess(x, yIndex, c) != null) {</p><p> continueCount++;</p><p><b> } else</b></p><p><b> break;</b></p><p><
87、;b> }</b></p><p> if (continueCount >= 5) {</p><p> return true;</p><p><b> } else</b></p><p> continueCount = 1;</p><p> 4.7
88、 重新開(kāi)始和悔棋算法模塊</p><p> 位于ChessBoard.java</p><p><b> 1 功能設(shè)計(jì)</b></p><p> 提供重新開(kāi)始和悔棋功能</p><p><b> 2模塊算法</b></p><p> public void rest
89、artGame() {</p><p><b> // 清除棋子</b></p><p> for (int i = 0; i < chessList.length; i++)</p><p> chessList[i] = null;</p><p> // 恢復(fù)游戲相關(guān)的變量值</p>&
90、lt;p> isBlack = true;</p><p> gameOver = false;// 游戲是否結(jié)束</p><p> chessCount = 0; // 當(dāng)前棋盤(pán)的棋子個(gè)數(shù)</p><p> repaint();</p><p><b> }</b></p><p&g
91、t;<b> // 悔棋</b></p><p> public void goback() {</p><p> if (chessCount == 0)</p><p><b> return;</b></p><p> chessList[chessCount - 1] = null
92、;</p><p> chessCount--;</p><p> if (chessCount > 0) {</p><p> xIndex = chessList[chessCount - 1].getX();</p><p> yIndex = chessList[chessCount - 1].getY();</p
93、><p><b> }</b></p><p> isBlack = !isBlack;</p><p> repaint();</p><p><b> }</b></p><p> // Dimension: 矩形</p><p> pub
94、lic Dimension getPreferredSize() {</p><p> return new Dimension(MARGIN * 2 + GRID_SPAN * COLS, MARGIN * 2</p><p> + GRID_SPAN * ROWS);</p><p><b> }</b></p><
95、;p><b> 小結(jié)和展望</b></p><p> 小結(jié):五子棋雖然是一個(gè)簡(jiǎn)單的游戲,但用程序?qū)崿F(xiàn)起來(lái)也不是那么容易的。不過(guò)</p><p> 通過(guò)寫(xiě)這個(gè)程序,加深了圖形界面程序的設(shè)計(jì),對(duì)監(jiān)聽(tīng)器的使用,更加熟悉個(gè)程一</p><p> 共有三個(gè)java文件,但chessboard和point其主要作用,也可以說(shuō)是整個(gè)程枝干<
96、;/p><p> 枝干。個(gè)人認(rèn)為設(shè)計(jì)chessboard.java是這3個(gè)java文件中最難的,包括繪制棋盤(pán)</p><p> 棋子、鼠標(biāo)的形狀、設(shè)置監(jiān)聽(tīng)器。但編寫(xiě)判斷輸贏的方法雖然難,但很有趣。開(kāi)始</p><p> 認(rèn)為以最后一個(gè)棋子為基點(diǎn),分別向8 個(gè)方向?qū)ふ?,但后?lái)想到作為基點(diǎn)的棋子,</p><p> 不一定在五個(gè)連續(xù)棋子的頭或
97、尾,改成了現(xiàn)在的算法,其實(shí),前一個(gè)算法只是一個(gè)</p><p> 雛形考慮到的情況并不全面,但是很有益處,在它的基礎(chǔ)上完成了現(xiàn)在的算法。在</p><p> 程序的主要功能實(shí)現(xiàn)之后,添加了落子聲音和勝利聲音,落子聲音添加了游戲結(jié)束</p><p> 的判斷,當(dāng)有一方勝利后,鼠標(biāo)不能下棋子,同時(shí)不播放聲音。只有游戲沒(méi)結(jié)束時(shí)</p><p>
98、; ,才可以落子并播放聲音。勝利音樂(lè)是和窗口彈出是一起的。</p><p><b> 程序不足</b></p><p> 由于和棋的概率極小,故程序并沒(méi)有編寫(xiě)判斷和棋的方法,若有五子棋高手能夠</p><p> 和棋,那恭喜了,就點(diǎn)“重新開(kāi)始”按鈕重新開(kāi)局吧。</p><p><b> 總結(jié)</
99、b></p><p> 除去不足,這個(gè)程序還是很有趣味性的,無(wú)論從程序設(shè)計(jì)還是游戲本身。</p><p><b> 參 考 文 獻(xiàn)</b></p><p> [1] Java基礎(chǔ)與案例開(kāi)發(fā)詳解 清華大學(xué)出版社</p><p><b> 附 錄</b></p><
100、p><b> 使用說(shuō)明書(shū)</b></p><p> 使用java開(kāi)發(fā)工具(eclipse或其他)運(yùn)行StartChessJFrame.java.</p><p><b> 源程序清單</b></p><p> 包含三個(gè)java文件,StartChessJFrame .java、Point .java、 Che
溫馨提示
- 1. 本站所有資源如無(wú)特殊說(shuō)明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁(yè)內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒(méi)有圖紙預(yù)覽就沒(méi)有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 眾賞文庫(kù)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- java課程設(shè)計(jì)報(bào)告-五子棋
- java五子棋課程設(shè)計(jì)
- java課程設(shè)計(jì)--五子棋
- 五子棋java課程設(shè)計(jì)
- 五子棋java課程設(shè)計(jì)
- 五子棋java語(yǔ)言課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--五子棋游戲
- java課程設(shè)計(jì)--對(duì)戰(zhàn)五子棋
- java課程設(shè)計(jì)報(bào)告---java 五子棋游戲設(shè)計(jì)
- java課程設(shè)計(jì)-五子棋游戲
- 五子棋-課程設(shè)計(jì)報(bào)告
- java課程設(shè)計(jì)--人機(jī)對(duì)弈五子棋
- 五子棋課程設(shè)計(jì)
- java五子棋實(shí)習(xí)報(bào)告
- java課程設(shè)計(jì)五子棋(附源代碼)
- java_五子棋小游戲課程設(shè)計(jì)
- 五子棋游戲課程設(shè)計(jì)報(bào)告
- 五子棋畢業(yè)課程設(shè)計(jì)報(bào)告
- c++五子棋課程設(shè)計(jì)報(bào)告
- 面向?qū)ο蟪绦蛟O(shè)計(jì)---五子棋-java課程設(shè)計(jì)
評(píng)論
0/150
提交評(píng)論