俄羅斯方塊游戲課程設(shè)計報告_第1頁
已閱讀1頁,還剩20頁未讀 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  摘要</b></p><p>  Java是一種可以撰寫跨平臺應(yīng)用軟件的面向?qū)ο蟮某绦蛟O(shè)計語言,是由Sun Microsystems公司于1995年5月推出的Java程序設(shè)計語言和Java平臺(即JavaSE, JavaEE, JavaME)的總稱。Java 技術(shù)具有卓越的通用性、高效性、平臺移植性和安全性,廣泛應(yīng)用于個人PC、數(shù)據(jù)中心、游戲控制臺、科學超級計算

2、機、移動電話和互聯(lián)網(wǎng),同時擁有全球最大的開發(fā)者專業(yè)社群。在全球云計算和移動互聯(lián)網(wǎng)的產(chǎn)業(yè)環(huán)境下,Java更具備了顯著優(yōu)勢和廣闊前景。</p><p><b>  目錄 </b></p><p><b>  引言1</b></p><p><b>  1研究方法1</b></p><

3、;p>  1.1俄羅斯方塊游戲的基本要求1</p><p>  1.1.1游戲基本功能:移動、加速、變形、消除、游戲結(jié)束等。1</p><p>  1.1.2顯示下一個方塊。1</p><p>  1.1.3游戲難度歲分數(shù)遞增。1</p><p>  1.1.4玩家自己設(shè)置游戲難度、開始、暫停等。1</p>&l

4、t;p>  1.1.5分數(shù)的統(tǒng)計等。1</p><p><b>  2、研究過程1</b></p><p>  2.1、模塊設(shè)計1</p><p>  2.1.1、控制面板類1</p><p>  2.1.2、塊類2</p><p>  2.1.3、游戲主類2</p>

5、<p>  2.1.4、方格類2</p><p>  2.1.5、畫布類2</p><p>  2.2、詳細設(shè)計2</p><p>  2.2.1、游戲控制2</p><p>  2.2.2、方塊設(shè)計3</p><p>  2.2.3、畫布設(shè)計4</p><p><

6、;b>  3、運行結(jié)果6</b></p><p>  3.1、初始畫面:6</p><p>  3.2、游戲設(shè)置界面:7</p><p>  3.3、游戲進行中的界面:8</p><p>  3.4、游戲結(jié)束界面:9</p><p><b>  4、心得體會9</b>

7、</p><p><b>  5、參考文獻:9</b></p><p>  6、附錄:游戲主類代碼9</p><p><b>  引言</b></p><p>  開發(fā)一個單機游戲系統(tǒng),能夠?qū)崿F(xiàn)俄羅斯方塊程序。通過鍵盤按鍵可以調(diào)整方塊的旋轉(zhuǎn)方向。最終達到能夠通過本次課程設(shè)計,進一步鞏固所學jav

8、a知識,學會將理論用于實踐,掌握所學知識的實驗意義。操作系統(tǒng):windows xp,開發(fā)工具:Myeclipse 開發(fā)語言:java</p><p><b>  1研究方法</b></p><p>  1.1俄羅斯方塊游戲的基本要求</p><p>  1.1.1游戲基本功能:移動、加速、變形、消除、游戲結(jié)束等。</p><

9、p>  1.1.2顯示下一個方塊。</p><p>  1.1.3游戲難度歲分數(shù)遞增。</p><p>  1.1.4玩家自己設(shè)置游戲難度、開始、暫停等。</p><p>  1.1.5分數(shù)的統(tǒng)計等。</p><p><b>  2、研究過程</b></p><p><b>  2

10、.1、模塊設(shè)計</b></p><p>  2.1.1、控制面板類</p><p>  繼承自JPanel.上邊安放預顯窗口、等級、得分、控制按鈕。主要用來控制游戲進程。</p><p><b>  2.1.2、塊類</b></p><p>  繼承自線程類(Thread)由 4 * 4 個方格(ErsBox

11、)構(gòu)成一個塊,控制塊的移動、下落、變形等。</p><p>  2.1.3、游戲主類</p><p>  繼承自JFrame類,負責游戲的全局控制。</p><p>  內(nèi)含: 一個GameCanvas畫布類的實例引用;一個保存當前活動塊(ErsBlock)實例的引用; 一個保存當前控制面板(ControlPanel)實例的引用。</p><p&

12、gt;<b>  2.1.4、方格類</b></p><p>  是組成塊的基本元素,用自己的顏色來表示塊的外觀。</p><p><b>  2.1.5、畫布類</b></p><p>  內(nèi)有<行數(shù)> *<列數(shù)>個方格類實例。繼承自JPanel類。 ErsBlock線程類動態(tài)改變畫布類的方格顏色

13、,畫布類通過 檢查方格顏</p><p>  色來體現(xiàn)ErsBlock塊的移動情況。</p><p><b>  2.2、詳細設(shè)計</b></p><p>  2.2.1、游戲控制</p><p>  一輪游戲過程,實現(xiàn)了Runnable接口。一輪游戲是一個大循環(huán),在這個循環(huán)中,每隔100毫秒,檢查游戲中的當前塊是否已經(jīng)

14、到底了,如果沒有,就繼續(xù)等待。如果到底了,就看有沒有全填滿的行,如果有就刪除它,并為游戲者加分,同時隨機產(chǎn)生一個,新的當前塊,讓它自動下落。當新產(chǎn)生一個塊時,先檢查畫布最頂上的一行是否已經(jīng)被占了,如果是,可以判斷Game Over了。</p><p><b>  代碼示例:</b></p><p>  private class Game implements Run

15、nable {</p><p>  public void run() {</p><p>  int col = (int) (Math.random() * (canvas.getCols() - 3)),</p><p>  style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.rando

16、m() * 4)];</p><p>  while (playing) {</p><p>  if (block != null) { //第一次循環(huán)時,block為空</p><p>  if (block.isAlive()) {</p><p><b>  try {</b></p><

17、;p>  Thread.currentThread().sleep(100);</p><p>  } catch (InterruptedException ie) {</p><p>  ie.printStackTrace();</p><p><b>  }</b></p><p><b>  c

18、ontinue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  checkFullLine(); //檢查是否有全填滿的行</p><p>  if (isGameOver()) { //檢查游戲是否應(yīng)該

19、結(jié)束了</p><p>  miPlay.setEnabled(true);</p><p>  miPause.setEnabled(true);</p><p>  miResume.setEnabled(false);</p><p>  ctrlPanel.setPlayButtonEnable(true);</p>&

20、lt;p>  ctrlPanel.setPauseButtonLabel(true);</p><p>  reportGameOver();</p><p><b>  return;</b></p><p><b>  }</b></p><p>  block = new ErsBloc

21、k(style, -1, col, getLevel(), canvas);</p><p>  block.start();</p><p>  col = (int) (Math.random() * (canvas.getCols() - 3));</p><p>  style = ErsBlock.STYLES[(int) (Math.random() *

22、 7)][(int) (Math.random() * 4)];</p><p>  ctrlPanel.setTipStyle(style);</p><p><b>  }</b></p><p><b>  }</b></p><p>  2.2.2、方塊設(shè)計</p><p

23、>  構(gòu)造函數(shù),產(chǎn)生一個特定的塊style 塊的樣式,對應(yīng)STYLES的28個值中的一個y 起始位置,左上角在canvas中的坐標行x 起始位置,左上角在canvas中的坐標列l(wèi)evel 游戲等級,控制塊的下落速度。canvas 畫板</p><p><b>  代碼:</b></p><p>  public ErsBlock(int style, int y

24、, int x, int level, GameCanvas canvas) {</p><p>  this.style = style;</p><p>  this.y = y;</p><p>  this.x = x;</p><p>  this.level = level;</p><p>  this.

25、canvas = canvas;</p><p>  int key = 0x8000;</p><p>  for (int i = 0; i < boxes.length; i++) {</p><p>  for (int j = 0; j < boxes[i].length; j++) {</p><p>  boolea

26、n isColor = ((style & key) != 0);</p><p>  boxes[i][j] = new ErsBox(isColor);</p><p>  key >>= 1;</p><p><b>  }</b></p><p><b>  }</b>&

27、lt;/p><p>  display();</p><p><b>  }</b></p><p>  2.2.3、畫布設(shè)計</p><p>  包括顯示方塊、積分;取得游戲成績、控制積分的疊加、清零;游戲升級積分的變化等。</p><p><b>  代碼:</b></

28、p><p><b>  /**</b></p><p>  * 取得自上一次升級后的積分</p><p>  * @return int, 上一次升級后的積分</p><p><b>  */</b></p><p>  public int getScoreForLevelUp

29、date() {</p><p>  return scoreForLevelUpdate;</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 升級后,將上一次升級以來的積分清0</p><p><b>  

30、*/</b></p><p>  public void resetScoreForLevelUpdate() {</p><p>  scoreForLevelUpdate -= ErsBlocksGame.PER_LEVEL_SCORE;</p><p><b>  }</b></p><p><b

31、>  /**</b></p><p>  * 得到某一行某一列的方格引用。</p><p>  * @param row int, 要引用的方格所在的行</p><p>  * @param col int, 要引用的方格所在的列</p><p>  * @return ErsBox, 在row行col列的方格的引用<

32、/p><p><b>  */</b></p><p>  public ErsBox getBox(int row, int col) {</p><p>  if (row < 0 || row > boxes.length - 1</p><p>  || col < 0 || col > bo

33、xes[0].length - 1)</p><p>  return null;</p><p>  return (boxes[row][col]);</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 覆蓋JCom

34、ponent類的函數(shù),畫組件。</p><p>  * @param g 圖形設(shè)備環(huán)境</p><p><b>  */</b></p><p>  public void paintComponent(Graphics g) {</p><p>  super.paintComponent(g);</p>

35、<p>  g.setColor(frontColor);</p><p>  for (int i = 0; i < boxes.length; i++) {</p><p>  for (int j = 0; j < boxes[i].length; j++) {</p><p>  g.setColor(boxes[i][j].isCo

36、lorBox() ? frontColor : backColor);</p><p>  g.fill3DRect(j * boxWidth, i * boxHeight,</p><p>  boxWidth, boxHeight, true);</p><p><b>  }</b></p><p><b&g

37、t;  }</b></p><p><b>  }</b></p><p><b>  /*</b></p><p>  * 根據(jù)窗口的大小,自動調(diào)整方格的尺寸</p><p><b>  */</b></p><p>  public vo

38、id fanning() {</p><p>  boxWidth = getSize().width / cols;</p><p>  boxHeight = getSize().height / rows;</p><p><b>  }</b></p><p><b>  /**</b>&l

39、t;/p><p>  * 當一行被游戲者疊滿后,將此行清除,并為游戲者加分</p><p>  * @param row int, 要清除的行,是由ErsBoxesGame類計算的</p><p><b>  */</b></p><p>  public synchronized void removeLine(int r

40、ow) {</p><p>  for (int i = row; i > 0; i--) {</p><p>  for (int j = 0; j < cols; j++)</p><p>  boxes[i][j] = (ErsBox) boxes[i - 1][j].clone();</p><p><b>  

41、}</b></p><p>  score += ErsBlocksGame.PER_LINE_SCORE;</p><p>  scoreForLevelUpdate += ErsBlocksGame.PER_LINE_SCORE;</p><p>  repaint();</p><p><b>  }</b&

42、gt;</p><p><b>  /**</b></p><p>  * 重置畫布,置積分為0</p><p><b>  */</b></p><p>  public void reset() {</p><p>  score = 0;</p><

43、p>  scoreForLevelUpdate = 0;</p><p>  for (int i = 0; i < boxes.length; i++) {</p><p>  for (int j = 0; j < boxes[i].length; j++)</p><p>  boxes[i][j].setColor(false);</

44、p><p><b>  }</b></p><p>  repaint();</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  3、運行結(jié)果</b></p><

45、;p><b>  3.1、初始</b></p><p>  3.2、游戲設(shè)置界面:</p><p>  3.3、游戲進行中的界面:</p><p>  3.4、游戲結(jié)束界面:</p><p><b>  4、心得體會</b></p><p>  通過對俄羅斯方塊游戲的編

46、寫,加深了對java多線程的理解。體驗到了將理論應(yīng)用到實踐中的快樂。在編程過程中遇到了許多困難,通過老師、同學的幫助已經(jīng)書籍的查閱和上網(wǎng)查資料,基本上都得到了解決。通過這次的課程設(shè)計,使我們對JAVA面向?qū)ο蟮木幊逃辛松钜徊降牧私狻M瑫r也發(fā)現(xiàn)了自己的許多不足之處,從此以后要更加認真的學習各種知識,不斷完善、提高自己的水平,才能得到真正的提高。</p><p><b>  5、參考文獻:</b>

47、;</p><p>  《Java語言程序設(shè)計》-------------徐保民 陳旭東 李春艷</p><p>  《Java大學實用教程》-------------耿祥義 張躍平</p><p>  《Java程序設(shè)計實用教程》--------錢慎一</p><p>  6、附錄:游戲主類代碼</p><p>  

48、package Block;</p><p>  import javax.swing.*;</p><p>  import java.awt.*;</p><p>  import java.awt.event.*;</p><p><b>  /**</b></p><p>  * 游戲主類

49、,繼承自JFrame類,負責游戲的全局控制。</p><p><b>  * 內(nèi)含</b></p><p>  * 1, 一個GameCanvas畫布類的實例引用,</p><p>  * 2, 一個保存當前活動塊(ErsBlock)實例的引用,</p><p>  * 3, 一個保存當前控制面板(ControlPane

50、l)實例的引用;</p><p><b>  */</b></p><p>  public class ErsBlocksGame extends JFrame {</p><p>  private static final long serialVersionUID = 1L; </p><p><b>

51、  /**</b></p><p>  * 每填滿一行計多少分</p><p><b>  */</b></p><p>  public final static int PER_LINE_SCORE = 100;</p><p><b>  /**</b></p>&

52、lt;p>  * 積多少分以后能升級</p><p><b>  */</b></p><p>  public final static int PER_LEVEL_SCORE = PER_LINE_SCORE * 20;</p><p><b>  /**</b></p><p>  *

53、最大級數(shù)是10級</p><p><b>  */</b></p><p>  public final static int MAX_LEVEL = 10;</p><p><b>  /**</b></p><p><b>  * 默認級數(shù)是5</b></p>

54、<p><b>  */</b></p><p>  public final static int DEFAULT_LEVEL = 5;</p><p>  private GameCanvas canvas;</p><p>  private ErsBlock block;</p><p>  priv

55、ate boolean playing = false;</p><p>  private ControlPanel ctrlPanel;</p><p>  private JMenuBar bar = new JMenuBar();</p><p>  private JMenu</p><p>  mGame = new JMenu(

56、"游戲"),</p><p>  mControl = new JMenu("控制"),</p><p>  mWindowStyle = new JMenu("界面風格"),</p><p>  mInfo = new JMenu("關(guān)于");</p><p>

57、  private JMenuItem</p><p>  miNewGame = new JMenuItem("新游戲"),</p><p>  miSetBlockColor = new JMenuItem("設(shè)置方塊顏色"),</p><p>  miSetBackColor = new JMenuItem("

58、設(shè)置背景顏色"),</p><p>  miTurnHarder = new JMenuItem("增加難度級別"),</p><p>  miTurnEasier = new JMenuItem("減小難度級別"),</p><p>  miExit = new JMenuItem("退出"),

59、</p><p>  miPlay = new JMenuItem("開始"),</p><p>  miPause = new JMenuItem("暫停"),</p><p>  miResume = new JMenuItem("恢復"),</p><p>  miStop =

60、 new JMenuItem("停止"),</p><p>  miAuthor = new JMenuItem("作者: 2009081314 quyan "),</p><p>  miSourceInfo = new JMenuItem("2012 課程設(shè)計。");</p><p>  private

61、 JCheckBoxMenuItem</p><p>  miAsWindows = new JCheckBoxMenuItem("Windows"),</p><p>  miAsMotif = new JCheckBoxMenuItem("Motif"),</p><p>  miAsMetal = new JCheckB

62、oxMenuItem("Metal", true);</p><p><b>  /**</b></p><p>  * 主游戲類的構(gòu)造函數(shù)</p><p>  * @param title String,窗口標題</p><p><b>  */</b></p>

63、<p>  public ErsBlocksGame(String title) {</p><p>  super(title);</p><p>  setSize(315, 392);</p><p>  Dimension scrSize = Toolkit.getDefaultToolkit().getScreenSize();</p>

64、;<p>  setLocation((scrSize.width - getSize().width) / 2,</p><p>  (scrSize.height - getSize().height) / 2);</p><p>  createMenu();</p><p>  Container container = getContentP

65、ane();</p><p>  container.setLayout(new BorderLayout(6, 0));</p><p>  canvas = new GameCanvas(20, 12);</p><p>  ctrlPanel = new ControlPanel(this);</p><p>  container.a

66、dd(canvas, BorderLayout.CENTER);</p><p>  container.add(ctrlPanel, BorderLayout.EAST);</p><p>  addWindowListener(new WindowAdapter() {</p><p>  public void windowClosing(WindowEven

67、t we) {</p><p>  stopGame();</p><p>  System.exit(0);</p><p><b>  }</b></p><p><b>  });</b></p><p>  addComponentListener(new Compo

68、nentAdapter() {</p><p>  public void componentResized(ComponentEvent ce) {</p><p>  canvas.fanning();</p><p><b>  }</b></p><p><b>  });</b></

69、p><p><b>  show(); </b></p><p>  canvas.fanning();</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 讓游戲“復位”</

70、b></p><p><b>  */</b></p><p>  public void reset() {</p><p>  ctrlPanel.reset();</p><p>  canvas.reset();</p><p><b>  }</b></

71、p><p><b>  /**</b></p><p>  * 判斷游戲是否還在進行</p><p>  * @return boolean, true-還在運行,false-已經(jīng)停止</p><p><b>  */</b></p><p>  public boolean i

72、sPlaying() {</p><p>  return playing;</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 得到當前活動的塊</p><p>  * @return ErsBlock, 當前活動塊的

73、引用</p><p><b>  */</b></p><p>  public ErsBlock getCurBlock() {</p><p>  return block;</p><p><b>  }</b></p><p><b>  /**</b

74、></p><p><b>  * 得到當前畫布</b></p><p>  * @return GameCanvas, 當前畫布的引用</p><p><b>  */</b></p><p>  public GameCanvas getCanvas() {</p><

75、p>  return canvas;</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 開始游戲</b></p><p><b>  */</b></p><p&g

76、t;  public void playGame() {</p><p><b>  play();</b></p><p>  ctrlPanel.setPlayButtonEnable(false);</p><p>  miPlay.setEnabled(false);</p><p>  ctrlPanel.re

77、questFocus();</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 游戲暫停</b></p><p><b>  */</b></p><p>  publ

78、ic void pauseGame() {</p><p>  if (block != null) block.pauseMove();</p><p>  ctrlPanel.setPauseButtonLabel(false);</p><p>  miPause.setEnabled(false);</p><p>  miResum

79、e.setEnabled(true);</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 讓暫停中的游戲繼續(xù)</p><p><b>  */</b></p><p>  public void

80、resumeGame() {</p><p>  if (block != null) block.resumeMove();</p><p>  ctrlPanel.setPauseButtonLabel(true);</p><p>  miPause.setEnabled(true);</p><p>  miResume.setEna

81、bled(false);</p><p>  ctrlPanel.requestFocus();</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 用戶停止游戲</b></p><p>&

82、lt;b>  */</b></p><p>  public void stopGame() {</p><p>  playing = false;</p><p>  if (block != null) block.stopMove();</p><p>  miPlay.setEnabled(true);</p

83、><p>  miPause.setEnabled(true);</p><p>  miResume.setEnabled(false);</p><p>  ctrlPanel.setPlayButtonEnable(true);</p><p>  ctrlPanel.setPauseButtonLabel(true);</p>

84、<p><b>  }</b></p><p><b>  /**</b></p><p>  * 得到當前游戲者設(shè)置的游戲難度</p><p>  * @return int, 游戲難度1-MAX_LEVEL</p><p><b>  */</b></p

85、><p>  public int getLevel() {</p><p>  return ctrlPanel.getLevel();</p><p><b>  }</b></p><p><b>  /**</b></p><p>  * 讓用戶設(shè)置游戲難度</p&

86、gt;<p>  * @param level int, 游戲難度1-MAX_LEVEL</p><p><b>  */</b></p><p>  public void setLevel(int level) {</p><p>  if (level < 11 && level > 0) ctr

87、lPanel.setLevel(level);</p><p><b>  }</b></p><p><b>  /**</b></p><p><b>  * 得到游戲積分</b></p><p>  * @return int, 積分。</p><p&

88、gt;<b>  */</b></p><p>  public int getScore() {</p><p>  if (canvas != null) return canvas.getScore();</p><p><b>  return 0;</b></p><p><b>

89、;  }</b></p><p><b>  /**</b></p><p>  * 得到自上次升級以來的游戲積分,升級以后,此積分清零</p><p>  * @return int, 積分。</p><p><b>  */</b></p><p>  pub

90、lic int getScoreForLevelUpdate() {</p><p>  if (canvas != null) return canvas.getScoreForLevelUpdate();</p><p><b>  return 0;</b></p><p><b>  }</b></p>

91、<p><b>  /**</b></p><p>  * 當分數(shù)累計到一定的數(shù)量時,升一次級</p><p>  * @return boolean, ture-update successufl, false-update fail</p><p><b>  */</b></p><

92、p>  public boolean levelUpdate() {</p><p>  int curLevel = getLevel();</p><p>  if (curLevel < MAX_LEVEL) {</p><p>  setLevel(curLevel + 1);</p><p>  canvas.reset

93、ScoreForLevelUpdate();</p><p>  return true;</p><p><b>  }</b></p><p>  return false;</p><p><b>  }</b></p><p><b>  /**</b

94、></p><p><b>  * 游戲開始</b></p><p><b>  */</b></p><p>  private void play() {</p><p><b>  reset();</b></p><p>  playing

95、 = true;</p><p>  Thread thread = new Thread(new Game());</p><p>  thread.start();</p><p><b>  }</b></p><p><b>  /**</b></p><p><

96、;b>  * 報告游戲結(jié)束了</b></p><p><b>  */</b></p><p>  private void reportGameOver() {</p><p>  JOptionPane.showMessageDialog(this, "Game Over!");</p>

97、<p><b>  }</b></p><p><b>  /**</b></p><p>  * 建立并設(shè)置窗口菜單</p><p><b>  */</b></p><p>  private void createMenu() {</p><

98、p>  bar.add(mGame);</p><p>  bar.add(mControl);</p><p>  bar.add(mWindowStyle);</p><p>  bar.add(mInfo);</p><p>  mGame.add(miNewGame);</p><p>  mGame.a

99、ddSeparator();</p><p>  mGame.add(miSetBlockColor);</p><p>  mGame.add(miSetBackColor);</p><p>  mGame.addSeparator();</p><p>  mGame.add(miTurnHarder);</p><

100、p>  mGame.add(miTurnEasier);</p><p>  mGame.addSeparator();</p><p>  mGame.add(miExit);</p><p>  mControl.add(miPlay);</p><p>  mControl.add(miPause);</p><

101、;p>  mControl.add(miResume);</p><p>  mControl.add(miStop);</p><p>  mWindowStyle.add(miAsWindows);</p><p>  mWindowStyle.add(miAsMotif);</p><p>  mWindowStyle.add(m

102、iAsMetal);</p><p>  mInfo.add(miAuthor);</p><p>  mInfo.add(miSourceInfo);</p><p>  setJMenuBar(bar);</p><p>  miPause.setAccelerator(</p><p>  KeyStroke.g

103、etKeyStroke(KeyEvent.VK_P, KeyEvent.CTRL_MASK));</p><p>  miResume.setAccelerator(KeyStroke.getKeyStroke(KeyEvent.VK_ENTER, 0));</p><p>  miNewGame.addActionListener(new ActionListener() {</p

104、><p>  public void actionPerformed(ActionEvent ae) {</p><p>  stopGame();</p><p><b>  reset();</b></p><p>  setLevel(DEFAULT_LEVEL);</p><p><b&

105、gt;  }</b></p><p><b>  });</b></p><p>  miSetBlockColor.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p>

106、<p>  Color newFrontColor =</p><p>  JColorChooser.showDialog(ErsBlocksGame.this,</p><p>  "Set color for block", canvas.getBlockColor());</p><p>  if (newFrontColor

107、!= null)</p><p>  canvas.setBlockColor(newFrontColor);</p><p><b>  }</b></p><p><b>  });</b></p><p>  miSetBackColor.addActionListener(new Actio

108、nListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  Color newBackColor =</p><p>  JColorChooser.showDialog(ErsBlocksGame.this,</p><p>  "

109、Set color for block", canvas.getBackgroundColor());</p><p>  if (newBackColor != null)</p><p>  canvas.setBackgroundColor(newBackColor);</p><p><b>  }</b></p>

110、<p><b>  });</b></p><p>  miTurnHarder.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  int curLevel = get

111、Level();</p><p>  if (curLevel < MAX_LEVEL) setLevel(curLevel + 1);</p><p><b>  }</b></p><p><b>  });</b></p><p>  miTurnEasier.addActionList

112、ener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  int curLevel = getLevel();</p><p>  if (curLevel > 1) setLevel(curLevel - 1);</p>

113、;<p><b>  }</b></p><p><b>  });</b></p><p>  miExit.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {<

114、;/p><p>  System.exit(0);</p><p><b>  }</b></p><p><b>  });</b></p><p>  miPlay.addActionListener(new ActionListener() {</p><p>  publ

115、ic void actionPerformed(ActionEvent ae) {</p><p>  playGame();</p><p><b>  }</b></p><p><b>  });</b></p><p>  miPause.addActionListener(new Acti

116、onListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  pauseGame();</p><p><b>  }</b></p><p><b>  });</b></p><

117、;p>  miResume.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  resumeGame();</p><p><b>  }</b></p><

118、p><b>  });</b></p><p>  miStop.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  stopGame();</p><p&g

119、t;<b>  }</b></p><p><b>  });</b></p><p>  miAsWindows.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p&g

120、t;<p>  String plaf = "com.sun.java.swing.plaf.windows.WindowsLookAndFeel";</p><p>  setWindowStyle(plaf);</p><p>  canvas.fanning();</p><p>  ctrlPanel.fanning();&

121、lt;/p><p>  miAsWindows.setState(true);</p><p>  miAsMetal.setState(false);</p><p>  miAsMotif.setState(false);</p><p><b>  }</b></p><p><b>

122、  });</b></p><p>  miAsMotif.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  String plaf = "com.sun.java.swing.pl

123、af.motif.MotifLookAndFeel";</p><p>  setWindowStyle(plaf);</p><p>  canvas.fanning();</p><p>  ctrlPanel.fanning();</p><p>  miAsWindows.setState(false);</p>

124、<p>  miAsMetal.setState(false);</p><p>  miAsMotif.setState(true);</p><p><b>  }</b></p><p><b>  });</b></p><p>  miAsMetal.addActionLis

125、tener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent ae) {</p><p>  String plaf = "javax.swing.plaf.metal.MetalLookAndFeel";</p><p>  setWindowSty

126、le(plaf);</p><p>  canvas.fanning();</p><p>  ctrlPanel.fanning();</p><p>  miAsWindows.setState(false);</p><p>  miAsMetal.setState(true);</p><p>  miAsMo

127、tif.setState(false);</p><p><b>  }</b></p><p><b>  });</b></p><p><b>  }</b></p><p><b>  /**</b></p><p>  *

128、 根據(jù)字串設(shè)置窗口外觀</p><p>  * @param plaf String, 窗口外觀的描述</p><p><b>  */</b></p><p>  private void setWindowStyle(String plaf) {</p><p><b>  try {</b>&

129、lt;/p><p>  UIManager.setLookAndFeel(plaf);</p><p>  SwingUtilities.updateComponentTreeUI(this);</p><p>  } catch (Exception e) {</p><p><b>  }</b></p>

130、<p><b>  }</b></p><p>  private class Game implements Runnable {</p><p>  public void run() {</p><p>  int col = (int) (Math.random() * (canvas.getCols() - 3)),<

131、/p><p>  style = ErsBlock.STYLES[(int) (Math.random() * 7)][(int) (Math.random() * 4)];</p><p>  while (playing) {</p><p>  if (block != null) { //第一次循環(huán)時,block為空</p><p>

132、;  if (block.isAlive()) {</p><p><b>  try {</b></p><p>  Thread.currentThread().sleep(100);</p><p>  } catch (InterruptedException ie) {</p><p>  ie.printSt

133、ackTrace();</p><p><b>  }</b></p><p><b>  continue;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  checkF

134、ullLine(); //檢查是否有全填滿的行</p><p>  if (isGameOver()) { //檢查游戲是否應(yīng)該結(jié)束了</p><p>  miPlay.setEnabled(true);</p><p>  miPause.setEnabled(true);</p><p>  miResume.set

135、Enabled(false);</p><p>  ctrlPanel.setPlayButtonEnable(true);</p><p>  ctrlPanel.setPauseButtonLabel(true);</p><p>  reportGameOver();</p><p><b>  return;</b&g

溫馨提示

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

評論

0/150

提交評論