java課程設計實驗報告---俄羅斯方塊_第1頁
已閱讀1頁,還剩17頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p><b>  課程設計報告</b></p><p>  課程名稱: JAVA面向對象程序設計 </p><p>  設計題目: 俄羅斯方塊 </p><p>  系 別: 計算機科學與技術

2、 </p><p>  專 業(yè): 2010級計算機科學與技術 </p><p>  組 別: </p><p>  起止日期: 2010年12月1日 ~ 2010年 12月31日 </p>

3、<p>  指導教師: </p><p>  計算機科學與技術系二○○九年制</p><p><b>  課程設計任務書</b></p><p><b>  目錄</b></p><p><b> 

4、 一.引言3</b></p><p><b>  1.1運行環(huán)境3</b></p><p><b>  二.需求分析4</b></p><p><b>  2.1開發(fā)背景4</b></p><p><b>  2.2設計目的4</b>

5、</p><p><b>  2.3功能需求4</b></p><p><b>  三.概要設計4</b></p><p><b>  3.1設計思想4</b></p><p><b>  3.2系統(tǒng)架構5</b></p><p

6、><b>  四.詳細設計5</b></p><p><b>  4.1事件處理5</b></p><p><b>  4.2界面設計6</b></p><p>  4.3游戲畫布類6</p><p><b>  4.4方塊類8</b>&l

7、t;/p><p>  4.5消行并統(tǒng)計分數(shù)13</p><p><b>  五.使用說明14</b></p><p>  5.1游戲開始運行14</p><p>  5.2填滿一行即消行得分15</p><p>  5.3列被填滿,則游戲自動結束16</p><p>

8、  六.課程設計總結與體會16</p><p><b>  七.參考文獻17</b></p><p><b>  一.引言</b></p><p><b>  1.1運行環(huán)境</b></p><p>  操作系統(tǒng):Microsoft Windows XP</p>

9、<p><b>  程序語言:Java</b></p><p>  開發(fā)工具:JCreator LE 4.50</p><p><b>  二.需求分析</b></p><p><b>  2.1開發(fā)背景</b></p><p>  Java是現(xiàn)在全球最時髦的開發(fā)

10、工具之一,它擁有一套龐大且完善的類庫,內(nèi)置了其他語言需要靠庫甚至是操作系統(tǒng)才能支持的功能。Java的產(chǎn)生與流行是Internet發(fā)展的客觀要求。如今越來越多的應用程序是Java開發(fā)的,用Java開發(fā)的應用程序可在任何計算平臺安全運行。Java作為一個分布式的,面向對象的程序設計方法,可以讓位于任何地方的任何計算機使用網(wǎng)絡上的應用程序??梢哉fJava是一個萬能的開發(fā)平臺,用Java編程成為一種趨勢。</p><p>

11、;<b>  2.2設計目的</b></p><p>  通過本次課程設計了解和掌握JDK開發(fā)環(huán)境以及JCreator等集成開發(fā)環(huán)境,鞏固所學的Java知識及編程機制。了解Java程序開發(fā)流程,學會構思比較復雜的課程設計思想;能合理的利用本學期所掌握的多線程、類、GUI等知識編寫一個較為復雜的Java應用軟件。掌握面向對象成學設計的有關概念和開發(fā)方法,鍛煉團隊合作開發(fā)精神。</p>

12、;<p><b>  2.3功能需求</b></p><p>  本課程設計的目標是設計一個名為《俄羅斯方塊》的游戲軟件,實現(xiàn)其界面的初始化,程序運行,退出,和相應數(shù)據(jù)處理。能實現(xiàn)游戲的基本功能,類似下移、左移、右移、翻轉、得分累加等,并在規(guī)定時間內(nèi)達到課題所需要實現(xiàn)的功能及要求。</p><p><b>  三.概要設計</b>&

13、lt;/p><p><b>  3.1設計思想</b></p><p>  1)使用JPanel框架,并添加按鈕、文本框等對象,用布局管理器定義各個對象的分布。</p><p>  2)設計一個二維數(shù)組來表示方塊,默認為不顯示。</p><p>  3)設計一個設計定時線程來控制方塊的下落速度。</p><

14、;p>  4)設計七種形狀的方塊,每種形狀定義四種形態(tài)來實現(xiàn)方塊變換</p><p>  5)每個方塊落到底后判斷是否消沉。</p><p><b>  3.2系統(tǒng)架構</b></p><p><b>  四.詳細設計</b></p><p><b>  4.1事件處理</b&

15、gt;</p><p>  用actionPerformed()方法實現(xiàn)選擇不同類型方塊以及控制方塊變化功能的實現(xiàn),用keyPressed()方法實現(xiàn)用鍵盤控制方塊變化功能的實現(xiàn),在FinalElsBlock.java類中實現(xiàn)事件的監(jiān)聽。</p><p><b>  4.2界面設計</b></p><p><b>  游戲基本界面圖&

16、lt;/b></p><p><b>  4.3游戲畫布類</b></p><p>  LeftShowCanvas類繼承Canvas類,實現(xiàn)方塊在畫布上的顯示,主要代碼如下:</p><p>  package game3;</p><p>  import java.awt.*;</p><

17、p>  import java.awt.event.*;</p><p>  import javax.swing.*;</p><p>  import javax.swing.event.*;</p><p>  class LeftShowCanvas extends Canva</p><p><b>  {</

18、b></p><p>  int maxrows, maxcols; // 畫布最大行數(shù),列數(shù)</p><p>  int unitSize; // 單元格的大小,小正方格</p><p>  int[][] unitState; // 每個小方格的狀態(tài) 0、1、2表示</p><p>  RightPanel rp;</p>

19、;<p>  int score;</p><p>  public LeftShowCanvas(RightPanel rp)</p><p><b>  {</b></p><p>  this.rp = rp;</p><p>  score = Integer.valueOf(rp.jtf.getT

20、ext());</p><p>  maxrows = 20;</p><p>  maxcols = 10;</p><p>  unitSize = 20;</p><p>  unitState = new int[maxrows][maxcols];</p><p>  initCanvas();</p&

21、gt;<p><b>  }</b></p><p>  public void initCanvas() // 初始化,畫布方格</p><p><b>  {</b></p><p>  for (int i = 0; i < maxrows; i++)</p><p>  

22、for (int j = 0; j < maxcols; j++)</p><p>  unitState[i][j] = 0;</p><p><b>  }</b></p><p>  public void paint(Graphics g)</p><p><b>  {</b><

23、;/p><p>  for (int i = 0; i < maxrows; i++)</p><p><b>  {</b></p><p>  for (int j = 0; j < maxcols; j++)</p><p>  drawUnit(i, j, unitState[i][j]); // 畫方格

24、</p><p>  if (i == 3)</p><p><b>  {</b></p><p>  g.setColor(Color.RED);</p><p>  g.drawLine(0, (i + 1) * (unitSize + 1) - 1, maxcols</p><p>  *

25、 (unitSize + 1) - 1, (i + 1) * (unitSize + 1) - 1);</p><p><b>  } } }</b></p><p>  public void drawUnit(int row, int col, int tag) // 畫方格</p><p><b>  {</b>&l

26、t;/p><p>  unitState[row][col] = tag; // 記錄狀態(tài)</p><p>  Graphics g = getGraphics();</p><p>  switch (tag)</p><p><b>  {</b></p><p>  case 0: // 初始黑

27、色</p><p>  g.setColor(Color.BLACK);</p><p><b>  break;</b></p><p>  case 1: // 方格黑色</p><p>  g.setColor(Color.RED);</p><p><b>  break;<

28、;/b></p><p><b>  case 2:</b></p><p>  g.setColor(Color.BLUE);</p><p><b>  break;</b></p><p><b>  }</b></p><p>  g.fi

29、llRect(col * (unitSize + 1), row * (unitSize + 1), unitSize,</p><p>  unitSize);</p><p><b>  }}</b></p><p><b>  4.4方塊類</b></p><p>  方塊類,定義了七種形狀的

30、方塊,每種形狀有四種狀態(tài),實現(xiàn)用鍵盤控制方塊的的左移,右移,下移以及翻轉。</p><p><b>  具體代碼如下:</b></p><p>  package game3;</p><p>  import java.awt.*;</p><p>  import java.awt.event.*;</p>

31、;<p>  import javax.swing.*;</p><p>  import javax.swing.event.*;</p><p>  class Block implements Runnable// 方塊類</p><p><b>  {</b></p><p>  static fi

32、nal int type = 7, state = 4;</p><p>  static final int[][] patten = { // 16進制代表每種方塊</p><p>  { 0x0f00, 0x4444, 0x0f00, 0x4444 },// 長條</p><p>  { 0x6600, 0x6600, 0x6600, 0x6600 },//

33、正方塊</p><p>  { 0x04e0, 0x0464, 0x00e4, 0x04c4 },// 三角</p><p>  { 0x08e0, 0x0644, 0x00e2, 0x044c },// 彎折一下,1、3,1左</p><p>  { 0x02e0, 0x0446, 0x00e8, 0x0c44 },// 彎折一下,1、3,1右</p>

34、<p>  { 0x0462, 0x006c, 0x0462, 0x006c },// 彎折兩下,1、2、1,1左上;1右下</p><p>  { 0x0264, 0x00c6, 0x0264, 0x00c6 } // 彎折兩下,1、2、1,1右上;1左下</p><p><b>  };</b></p><p>  priva

35、te int blockType = -1; // 方塊類型,7種,大小范圍0-6</p><p>  private int blockState;// 方塊狀態(tài),4種,大小范圍0-3</p><p>  private int row, col; // 方塊所在的行數(shù),列數(shù)</p><p>  private int oldRow, oldCol; // 記錄方

36、塊變化前所在的行數(shù),列數(shù)</p><p>  private int oldType = -1, oldState; // 記錄方塊變化前的類型和狀態(tài)</p><p>  private int isfall = 1; // 標記若畫,畫成什么顏色的,</p><p>  // 1表示可以下落,畫為紅色;0表示不可下落,畫為藍色</p><p&g

37、t;  private boolean end = false;// 結束標記,為true時表示結束</p><p>  LeftShowCanvas lsc;</p><p>  public Block(LeftShowCanvas lsc)</p><p><b>  {</b></p><p>  this.ls

38、c = lsc;</p><p><b>  row = 0;</b></p><p><b>  col = 3;</b></p><p>  oldRow = row;</p><p>  oldCol = col;</p><p><b>  }</b&

39、gt;</p><p>  public void reInit() // 一個方塊無法下落后,重新初始化</p><p><b>  {</b></p><p>  blockType = -1;</p><p>  isfall = 1;</p><p><b>  }</b&

40、gt;</p><p>  public void reInitRowCol() // 初始化方塊起始點</p><p><b>  {</b></p><p><b>  row = 0;</b></p><p><b>  col = 3;</b></p>&

41、lt;p><b>  }</b></p><p>  public void run() // 下落線程</p><p><b>  {</b></p><p>  lsc.requestFocusInWindow(); // 獲得焦點</p><p>  while (!end)</p

42、><p><b>  {</b></p><p>  int blocktype = (int) (Math.random() * 100) % 7;</p><p>  drawBlock(blocktype);</p><p><b>  do</b></p><p><

43、;b>  {try</b></p><p>  { Thread.sleep(500); // 控制下落速度</p><p>  } catch (InterruptedException e)</p><p><b>  { }</b></p><p>  } while (fallMove());

44、// 下落</p><p>  for (int j = 0; j < lsc.maxcols; j++)</p><p><b>  // 判斷是否結束</b></p><p>  if (lsc.unitState[3][j] == 2)</p><p>  end = true;</p><

45、;p><b>  } }</b></p><p>  public synchronized void drawBlock(int blockType) // 畫方塊</p><p><b>  {</b></p><p>  if (this.blockType != blockType)</p>&

46、lt;p>  blockState = (int) (Math.random() * 100) % 4; // 狀態(tài)</p><p>  this.blockType = blockType; // 樣式</p><p>  if (!isMove(3)) // 判斷是否能畫</p><p><b>  {</b></p>

47、<p>  this.blockType = oldType;</p><p>  this.blockState = oldState;</p><p><b>  return;</b></p><p><b>  }</b></p><p>  int comIndex = 0x80

48、00;</p><p>  if (this.oldType != -1)</p><p><b>  {</b></p><p>  for (int i = oldRow; i < oldRow + 4; i++)</p><p>  for (int j = oldCol; j < oldCol + 4

49、; j++)</p><p><b>  {</b></p><p>  if ((patten[oldType][oldState] & comIndex) != 0</p><p>  && lsc.unitState[i][j] == 1)</p><p>  lsc.drawUnit(i,

50、 j, 0); // 先還原</p><p>  comIndex = comIndex >> 1;</p><p><b>  }}</b></p><p>  comIndex = 0x8000;</p><p>  for (int i = row; i < row + 4; i++)</p

51、><p>  for (int j = col; j < col + 4; j++)</p><p><b>  {</b></p><p>  if ((patten[blockType][blockState] & comIndex) != 0)</p><p><b>  {</b>

52、</p><p>  if (isfall == 1)</p><p>  lsc.drawUnit(i, j, 1); // 再畫,畫為RED</p><p>  else if (isfall == 0)</p><p><b>  {</b></p><p>  lsc.drawUnit(i

53、, j, 2); // 無法下落,畫為BLUE</p><p>  lsc.deleteFullLine(i); // 判斷此行是否可以消</p><p><b>  }}</b></p><p>  comIndex = comIndex >> 1;</p><p><b>  }</b&g

54、t;</p><p>  if (isfall == 0) // 無法下落,先判斷是否能消行,再重新初始化</p><p><b>  {</b></p><p>  // lsc.deleteFullLine(row,col);</p><p><b>  reInit();</b></p&

55、gt;<p>  reInitRowCol();</p><p><b>  }</b></p><p>  oldRow = row;</p><p>  oldCol = col;</p><p>  oldType = blockType;</p><p>  oldState

56、 = blockState;</p><p><b>  }</b></p><p>  public void leftTurn() // 旋轉,左轉</p><p><b>  {</b></p><p>  if (this.blockType != -1)</p><p&

57、gt;<b>  {</b></p><p>  blockState = (blockState + 1) % 4;</p><p>  if (isMove(3))</p><p>  drawBlock(blockType);</p><p><b>  else</b></p>

58、<p>  blockState = (blockState + 3) % 4;</p><p><b>  }}</b></p><p>  public void leftMove() // 左移</p><p>  { if (this.blockType != -1 && isMove(0))</

59、p><p><b>  {</b></p><p><b>  col -= 1;</b></p><p>  drawBlock(blockType);</p><p><b>  }}</b></p><p>  public void rightMov

60、e() // 右移</p><p><b>  {</b></p><p>  if (this.blockType != -1 && isMove(1))</p><p>  { col += 1;</p><p>  drawBlock(blockType);</p><p&

61、gt;<b>  }}</b></p><p>  public boolean fallMove() // 下移</p><p><b>  {</b></p><p>  if (this.blockType != -1)</p><p><b>  {</b></p

62、><p>  if (isMove(2))</p><p><b>  {</b></p><p><b>  row += 1;</b></p><p>  drawBlock(blockType);</p><p>  return true;</p><

63、p><b>  } else</b></p><p><b>  {</b></p><p>  isfall = 0;</p><p>  drawBlock(blockType);</p><p>  return false;</p><p><b> 

64、 }}</b></p><p>  return false;</p><p><b>  }</b></p><p>  public synchronized boolean isMove(int tag) // 左 0 ,右 1 ,下 2 ,旋轉 3</p><p><b>  {</b

65、></p><p>  int comIndex = 0x8000;</p><p>  for (int i = row; i < row + 4; i++)</p><p>  for (int j = col; j < col + 4; j++)</p><p><b>  {</b></p

66、><p>  if ((patten[blockType][blockState] & comIndex) != 0)</p><p><b>  {</b></p><p>  if (tag == 0 && (j == 0 || lsc.unitState[i][j - 1] == 2))// 是否能左移</p&g

67、t;<p>  return false;</p><p>  else if (tag == 1 && // 是否能右移</p><p>  (j == lsc.maxcols - 1 || lsc.unitState[i][j + 1] == 2))</p><p>  return false;</p><p&

68、gt;  else if (tag == 2 && // 是否能下移</p><p>  (i == lsc.maxrows - 1 || lsc.unitState[i + 1][j] == 2))</p><p>  return false;</p><p>  else if (tag == 3 && // 是否能旋轉<

69、/p><p>  (i > lsc.maxrows - 1 || j < 0</p><p>  || j > lsc.maxcols - 1 || lsc.unitState[i][j] == 2))</p><p>  return false;</p><p><b>  }</b></p>

70、;<p>  comIndex = comIndex >> 1;</p><p><b>  }</b></p><p>  return true;</p><p><b>  }}</b></p><p>  4.5消行并統(tǒng)計分數(shù)</p><p>

71、;  public void deleteFullLine(int row) // 判斷此行是否可以消,同時可消就消行</p><p><b>  {</b></p><p>  for (int j = 0; j < maxcols; j++)</p><p>  if (unitState[row][j] != 2)</p>

72、;<p><b>  return;</b></p><p>  for (int i = row; i > 3; i--)</p><p>  // 到此即為可消,將上面的移下消此行</p><p>  for (int j = 0; j < maxcols; j++)</p><p>  d

73、rawUnit(i, j, unitState[i - 1][j]);</p><p><b>  score++;</b></p><p>  rp.jtf.setText(String.valueOf(score));</p><p><b>  }</b></p><p><b> 

74、 五.使用說明</b></p><p><b>  5.1游戲開始運行</b></p><p>  5.2填滿一行即消行得分</p><p>  5.3列被填滿,則游戲自動結束</p><p>  六.課程設計總結與體會</p><p>  本次課程設計花費我們小組一個月的時間來完成,

75、從設計開始選擇課題到最終完成課程設計,小組成員分工明確,相互合作,按時完成相關任務。通過這次實驗,我們學習到了很多Java編碼成知識,同時對這個學期的課本所學的知識有了進一步鞏固,特別是多線程,Swing組件和事件等能更熟練的運用。</p><p>  這次實驗過后,我們發(fā)現(xiàn),動手比看書更能獲取實際有用的知識。真理是從實踐中得知的,而且也只有實踐才能檢驗真理。而這次實驗也加強了我們這些方面的理解能力,對書面上的東

76、西實際操作在具體項目上有了一個更清晰的認識。我們還意識到一個大的程序,在寫代碼之前,一定要有良好的需求分析和結構設計,應該占整個程序設計的大部分時間,一個好的程序,分析設計應該要非常充分,這樣才不至于代碼寫了一半才發(fā)現(xiàn)很多錯誤。很多具體代碼操作之前的設計規(guī)劃和構建才是優(yōu)秀程序設計的靈魂。</p><p>  設計過程中,我們另一個大的體會就是合作的好處,通過相互幫助,大大的提高了工作效率。同時我們也發(fā)現(xiàn)自己的不足

77、之處。而且讓我感受比較深的是,做事細心很重要,所謂細節(jié)決定成敗。</p><p>  程序還有很多不足,在今后的日子里,我們會虛心向老師同學請教,盡自己最大的努力做到最好。</p><p><b>  七.參考文獻</b></p><p>  [1]. 李芝興,楊瑞龍.《Java程序設計之網(wǎng)絡編程》.[M].北京:清華大學出版社</p&g

溫馨提示

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

評論

0/150

提交評論