java課程設(shè)計報告---單機版五子棋_第1頁
已閱讀1頁,還剩19頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認(rèn)領(lǐng)

文檔簡介

1、<p><b>  課程設(shè)計說明書</b></p><p>  設(shè)計題目: 單機版五子棋 </p><p>  設(shè)計時間: 2011.12.15 至2012.1.5 </p><p>  指導(dǎo)教師: </p

2、><p>  評 語:_________________________________</p><p>  _________________________________________</p><p>  _________________________________________</p><p>  ____________

3、_____________________________</p><p>  _________________________________________</p><p>  評閱成績:__ __評閱教師:__ ___</p><p><b>  目  錄</b></p><p><b>  1

4、 引 言1</b></p><p>  1.1課程設(shè)計選題1</p><p>  1.2課程設(shè)計的目的1</p><p>  1.3本選題的設(shè)計背景1</p><p><b>  2 需求分析1</b></p><p>  2.1 功能需求1</p><

5、;p>  2.2 系統(tǒng)的開發(fā)運行環(huán)境1</p><p><b>  3 總體設(shè)計2</b></p><p>  3.1 系統(tǒng)體系結(jié)構(gòu)設(shè)計2</p><p>  3.2系統(tǒng)功能模塊及主要類設(shè)計2</p><p>  4 詳細設(shè)計與實現(xiàn)3</p><p>  4.1 主窗體模塊3&l

6、t;/p><p>  4.2 棋子索引模塊9</p><p>  4.3 棋盤構(gòu)造模塊10</p><p>  4.4 畫棋盤模塊12</p><p>  4.5 鼠標(biāo)按下模塊14</p><p>  4.6 判斷勝利算法模塊15</p><p>  4.7 重新開始和悔棋算法模塊16&

7、lt;/p><p>  5 小結(jié)和展望18</p><p>  參 考 文 獻19</p><p><b>  附 錄19</b></p><p><b>  使用說明書19</b></p><p><b>  源程序清單19</b></p&

8、gt;<p><b>  引 言</b></p><p><b>  1.1課程設(shè)計選題</b></p><p><b>  《單機版五子棋》</b></p><p>  1.2課程設(shè)計的目的</p><p>  使學(xué)生鞏固和加深以Java 語言為基礎(chǔ)的面向?qū)ο?/p>

9、編程技術(shù)理論知識的理解,提高實際動手編程能力的培養(yǎng),掌握以Java為核心的應(yīng)用軟件開發(fā)方案,達到能獨立閱讀、編制和調(diào)試一定規(guī)模的Java程序的水平。</p><p>  1.3本選題的設(shè)計背景</p><p>  描述為什么選擇本題目?</p><p>  五子棋是大家喜聞樂見的小游戲,規(guī)則簡單,變化多端,非常有趣味性,</p><p>&l

10、t;b>  本選題的設(shè)計意義?</b></p><p>  通過編寫五子棋小游戲的程序,進一步鍛煉java圖形編程技巧和編寫程序的能力。</p><p><b>  需求分析</b></p><p><b>  2.1 功能需求</b></p><p>  用戶角度考察系統(tǒng)應(yīng)具有哪

11、些功能及非功能性需求。</p><p>  這里實現(xiàn)了雙人對下的五子程序,程序提供重新開局、悔棋功能,附加播放棋子落下的聲音和勝利聲音。</p><p>  2.2 系統(tǒng)的開發(fā)運行環(huán)境</p><p>  本系統(tǒng)開發(fā)平臺: Java </p><p>  本系統(tǒng)集成開發(fā)環(huán)境:Eclipse</p><p>  本系統(tǒng)運

12、行環(huán)境: windows xp或以上版本</p><p><b>  總體設(shè)計</b></p><p>  3.1 系統(tǒng)體系結(jié)構(gòu)設(shè)計</p><p><b>  a系統(tǒng)的功能描述</b></p><p>  程序是一個雙人對戰(zhàn)五子棋程序,提供下五子棋必須的悔棋、重新開始、退出等功能,兼播放聲音。&l

13、t;/p><p><b>  b相關(guān)類設(shè)計</b></p><p>  ChessBoard.java</p><p>  包含ChessBoard的公共類,主要功能是繪制棋盤、棋子、判斷輸贏。</p><p>  Point.java</p><p>  包含名為Point的公共類,主要功能定義棋子

14、顏色,獲取索引。</p><p>  StartChessJFrame.Java</p><p>  包含StartChessJFrame的公共類,主要功能,顯示主窗體界面,包括工具條面板,“重新開始”、“悔棋”、“退出”按鈕。菜單欄,“系統(tǒng)”菜單,“重新開始”、“悔棋”、“退出”菜單項;“幫助”菜單,“關(guān)于五子棋”、“關(guān)于作者”菜單項。以上菜單項和按鈕,均加監(jiān)聽器,實現(xiàn)對棋盤和窗口的控制

15、。令外,鼠標(biāo)點擊“退出”按鈕或菜單項時彈出提示。</p><p>  3.2系統(tǒng)功能模塊及主要類設(shè)計</p><p> ?、賁tartChessJFrame.java包含名為StartChessJFrame的pubilc類,主要用來顯示主窗體界面,包括工具條面板,“重新開始”、“悔棋”、“退出”按鈕。菜單欄,“系統(tǒng)”菜單,“重新開始”、“悔棋”、“退出”菜單項;“幫助”菜單,“關(guān)于五子棋”

16、、“關(guān)于作者”菜單項。以上菜單項和按鈕,均加監(jiān)聽器,實現(xiàn)對棋盤和窗口的控制。令外,鼠標(biāo)點擊“退出”按鈕或菜單項時彈出提示。編寫一個內(nèi)部類MyItemListenerl來很監(jiān)聽按鈕及菜單項單擊事件。</p><p> ?、诰帉慞oint類,包括棋子x/y索引及其顏色,定義相應(yīng)的構(gòu)造方法和get()函數(shù)。</p><p> ?、劬帉慍hessBoard類,設(shè)置棋盤背景顏色為橘黃色,然后在主框架

17、中創(chuàng)建ChessBoard的對象,添加到主框架中。編寫paintComponent方法繪制棋盤。</p><p> ?、茉贑hessBoard中創(chuàng)建Point[],然后在paintComponent繪制棋子數(shù)組。</p><p> ?、轂镃hessBoard實現(xiàn)監(jiān)聽器MouseListener,覆蓋相應(yīng)的抽象方法,在構(gòu)造方法中添加監(jiān)聽器(addMouseListener).。</p&

18、gt;<p> ?、蘧帉憁ousePressed方法內(nèi)容,預(yù)先定義isBlack表示下的黑棋還是白棋,PointCount表示當(dāng)前棋子數(shù)。</p><p> ?、邔⒃趍ousePressed中獲得的坐標(biāo)轉(zhuǎn)換成索引,在創(chuàng)建Point對象,添加到PointList中,在重新繪制。</p><p> ?、嗵砑酉鄳?yīng)判斷:不能畫到棋盤外,下過的地方不可以在下。(需要輔助方法findPo

19、int ).</p><p> ?、崽砑勇曇舨シ糯a。游戲結(jié)束后,點擊鼠標(biāo),不播放聲音,一方勝利后,播放勝利音樂。</p><p>  添加勝利判斷isWin,添加標(biāo)記變量GameOver。在mousePressed方法最前面加入GameOver的判斷,在mousePressed方法的最后調(diào)用isWin,返回true,則給消息提示,GamerOver設(shè)置為true。</p>

20、<p> ?、鈏sWin方法具體的編寫。在當(dāng)前下棋的橫向,縱向,兩個斜向上分別判斷是否有連續(xù)的同色五子。</p><p><b>  詳細設(shè)計與實現(xiàn)</b></p><p><b>  4.1 主窗體模塊</b></p><p><b>  功能設(shè)計</b></p><p

21、>  StartChessJFrame.java包含名為StartChessJFrame的pubilc類,主要用來顯示主窗體界面,包括工具條面板,“重新開始”、“悔棋”、“退出”按鈕。菜單欄,“系統(tǒng)”菜單,“重新開始”、“悔棋”、“退出”菜單項;“幫助”菜單,“關(guān)于五子棋”、“關(guān)于作者”菜單項。以上菜單項和按鈕,均加監(jiān)聽器,實現(xiàn)對棋盤和窗口的控制。令外,鼠標(biāo)點擊“退出”按鈕或菜單項時彈出提示。</p><p&g

22、t;<b>  界面設(shè)計</b></p><p>  包括菜單欄、棋盤、工具欄。菜單欄含系統(tǒng)、幫助菜單。</p><p>  系統(tǒng)菜單包含:重新開始、悔棋、退出。幫助菜單包含:關(guān)于五子棋、關(guān)于作者。</p><p>  工具欄包含按鈕:重新開始、悔棋、退出。</p><p><b>  棋盤用于對戰(zhàn)。</

23、b></p><p>  3模塊算法(或重要代碼段);</p><p>  a下面的代碼實現(xiàn)的是監(jiān)聽器,用于響應(yīng)菜單項和按鈕。</p><p>  private class MyItemListener implements ActionListener {//事件監(jiān)聽器內(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>  // 重新開始&

25、lt;/b></p><p>  // JFiveFrame.this內(nèi)部類引用外部類</p><p>  System.out.println("重新開始...");</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,請2 位輪流使用鼠標(biāo)來下棋吧 ");</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("單機版五子棋");//設(shè)置標(biāo)題</p><p>  chessBoard = new ChessBoard();//初始化面板對象</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("重新開始");</p><p>  exitMenuItem = new

36、JMenuItem("退出");</p><p>  backMenuItem = new JMenuItem("悔棋");//初始化菜單項</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)聽器內(nèi)部類</p><p>  this.startMenuItem.addActionListener(lis);//將菜單項注冊到事件監(jiān)聽器上<

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();//工具面板欄實例化</p><p>  startButton = new JButton("重新開始");//三個按鈕初始化</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);//將三個按鈕添加到工具面板上</p><p>  toolbar.add(backButton);</p>&l

43、t;p>  toolbar.add(exitButton);</p><p>  startButton.addActionListener(lis);//將三個按鈕注冊監(jiān)聽事件</p><p>  backButton.addActionListener(lis);</p><p>  exitButton.addActionListener(lis);&l

44、t;/p><p>  add(toolbar, BorderLayout.SOUTH);//將工具面板布局到界面"南"方也就是下面</p><p>  add(chessBoard);//將面板對象添加到窗體上</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)試與測試 </b></p><p>  測試結(jié)果的分析與討論,測試過程中遇到的主要問題及采取的解決措施。</p><p>  下

48、圖是初步完成的界面,即未調(diào)用point類和ChessBoard類時的狀況。</p><p>  4.2 棋子索引模塊</p><p>  位于Point.java</p><p><b>  1主要功能</b></p><p>  此功能對應(yīng)Point.java文件,包含名為Point的public類,主要功能是獲取棋子

49、位置,定義棋子顏色。</p><p><b>  2主要代碼</b></p><p>  import java.awt.Color;</p><p>  /*五子棋的棋子設(shè)計。</p><p><b>  */</b></p><p>  public class Poin

50、t {</p><p>  private int x; // 棋盤中的x索引</p><p>  private int y; // 棋盤中的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() {// 拿到棋盤中的x索引</p><p><b>  return x;</b></p><p><b>  }</b></p><p>  public int getY() {// 拿到棋盤中的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 棋盤構(gòu)造模塊</p><p>  位于ChessBoard.java</p><p><b>  1功能設(shè)計</b></p><p>  對應(yīng)ChessBoard類的構(gòu)造方法,主要功能設(shè)置棋盤邊距,橫豎線距離、棋子大小,將坐標(biāo)轉(zhuǎn)換成棋子的索引,并添加監(jiān)

55、聽器,對棋子做相應(yīng)的處理:將坐標(biāo)轉(zhuǎn)換成索引,設(shè)置鼠標(biāo)形狀——指針型(指針在棋盤外和(x,y)坐標(biāo)已有棋子時,這時不能下棋子。),其余情況設(shè)置成手型。</p><p>  2模塊算法(或重要代碼段);</p><p><b>  a 預(yù)先定義的變量</b></p><p><b>  b棋盤構(gòu)造方法。</b></p&g

56、t;<p>  public ChessBoard() {</p><p>  setBackground(Color.ORANGE);//設(shè)置背景顏色為橘黃色</p><p>  addMouseListener(this);// 添加監(jiān)聽器</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)點擊的坐標(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><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 畫棋盤模塊</b></p><p>  位于ChessBoard.java</p><p><b>  1功能設(shè)計</

62、b></p><p>  繪制棋盤,橫豎各有11條線,121個交點。底色橘黃黃色。棋盤的邊距30像素。</p><p>  繪制白棋子和黑棋子,最后下的子用紅色矩形標(biāo)記。</p><p><b>  2界面設(shè)計</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>  // 畫棋盤</b></p><p>  for (i

64、nt i = 0; i <= ROWS; i++) { // 畫橫線</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++) {// 畫直線</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>  // 畫棋子</b></p><p>  for (int i = 0; i < chessCount; i++) {</p><p>  int xPos = chessList[i].getX() * GRID_SPAN + MARGIN; // 網(wǎng)格交

67、叉點的x坐標(biāo)</p><p>  int yPos = chessList[i].getY() * GRID_SPAN + MARGIN;// 網(wǎng)格交叉點的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)記最后一個棋子的紅矩形框</p><p>  if (i == chessCount - 1) { // 最后一個棋子</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è)計</b></p><p>  是對所下的棋子進行處理,定義MousePress方法,預(yù)先定義isBlack表示下的是黑棋還是白棋,Point Count 表示當(dāng)前棋子數(shù),添加相應(yīng)的判斷,不能畫

71、到棋盤外,下過的地方不能再下。(需要輔助方法findPiont),然后將棋子的坐標(biāo)轉(zhuǎn)換成索引,在創(chuàng)建Point對象添加到PointList中,再重新繪制,當(dāng)游戲沒結(jié)束時,落子播放聲音,當(dāng)有一方勝利時,播放勝利音樂,彈出提示窗口。</p><p><b>  2模塊算法</b></p><p>  public void mousePressed(MouseEvent

72、e) {// 鼠標(biāo)按鍵在組件上按下時調(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)點擊的坐標(biāo)位置轉(zhuǎn)換成網(wǎng)格索引。</p><p>  yIndex = (e.getY() - MARGIN + GRID_SPAN / 2) / GRID_SPAN;</p><p>  // 落在棋盤外,

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()) { //播放勝利音樂</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è)計</b></p><p>  判斷黑子或白子勝利。對應(yīng)方法private boolean isWi

82、n()。</p><p><b>  2模塊算法</b></p><p>  大致算法介紹,要判斷那方勝利,,應(yīng)以棋盤上最后的棋子為中心,依次個方向上尋找棋子———東西方向、南北方向、東南西北、東北西南,只要一個啊放蕩向上同色棋子大于等于5個,該色棋子就勝利。</p><p>  下面是橫向查找的算法,其他3個方向的查找方法與此類似</p

83、><p>  int continueCount = 1; // 連續(xù)棋子的個數(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、 重新開始和悔棋算法模塊</p><p>  位于ChessBoard.java</p><p><b>  1 功能設(shè)計</b></p><p>  提供重新開始和悔棋功能</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)前棋盤的棋子個數(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é):五子棋雖然是一個簡單的游戲,但用程序?qū)崿F(xiàn)起來也不是那么容易的。不過</p><p>  通過寫這個程序,加深了圖形界面程序的設(shè)計,對監(jiān)聽器的使用,更加熟悉個程一</p><p>  共有三個java文件,但chessboard和point其主要作用,也可以說是整個程枝干<

96、;/p><p>  枝干。個人認(rèn)為設(shè)計chessboard.java是這3個java文件中最難的,包括繪制棋盤</p><p>  棋子、鼠標(biāo)的形狀、設(shè)置監(jiān)聽器。但編寫判斷輸贏的方法雖然難,但很有趣。開始</p><p>  認(rèn)為以最后一個棋子為基點,分別向8 個方向?qū)ふ?,但后來想到作為基點的棋子,</p><p>  不一定在五個連續(xù)棋子的頭或

97、尾,改成了現(xiàn)在的算法,其實,前一個算法只是一個</p><p>  雛形考慮到的情況并不全面,但是很有益處,在它的基礎(chǔ)上完成了現(xiàn)在的算法。在</p><p>  程序的主要功能實現(xiàn)之后,添加了落子聲音和勝利聲音,落子聲音添加了游戲結(jié)束</p><p>  的判斷,當(dāng)有一方勝利后,鼠標(biāo)不能下棋子,同時不播放聲音。只有游戲沒結(jié)束時</p><p>

98、;  ,才可以落子并播放聲音。勝利音樂是和窗口彈出是一起的。</p><p><b>  程序不足</b></p><p>  由于和棋的概率極小,故程序并沒有編寫判斷和棋的方法,若有五子棋高手能夠</p><p>  和棋,那恭喜了,就點“重新開始”按鈕重新開局吧。</p><p><b>  總結(jié)</

99、b></p><p>  除去不足,這個程序還是很有趣味性的,無論從程序設(shè)計還是游戲本身。</p><p><b>  參 考 文 獻</b></p><p>  [1] Java基礎(chǔ)與案例開發(fā)詳解 清華大學(xué)出版社</p><p><b>  附 錄</b></p><

100、p><b>  使用說明書</b></p><p>  使用java開發(fā)工具(eclipse或其他)運行StartChessJFrame.java.</p><p><b>  源程序清單</b></p><p>  包含三個java文件,StartChessJFrame .java、Point .java、 Che

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 眾賞文庫僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論