java課程設計報告——蜘蛛紙牌_第1頁
已閱讀1頁,還剩18頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、<p>  面向對象程序設計課程設計報告</p><p><b>  JAVA程序設計</b></p><p><b>  課程設計</b></p><p><b>  之</b></p><p><b>  蜘蛛紙牌</b></p>

2、<p><b>  學院:</b></p><p><b>  年級:</b></p><p><b>  班級:</b></p><p><b>  指導老師:</b></p><p><b>  小組成員: </b>

3、</p><p><b>  時間:</b></p><p><b>  目錄</b></p><p>  第一章 課程設計要求1</p><p><b>  題目名稱1</b></p><p><b>  題目類型1</b>

4、</p><p><b>  課程設計目的1</b></p><p><b>  實驗原理1</b></p><p><b>  實驗內容1</b></p><p>  第二章 設計概要2</p><p>  2.1 功能設計2</p&

5、gt;<p>  2.2 程序流程2</p><p><b>  2.3功能分析3</b></p><p>  1. 主要界面:3</p><p>  2初始化紙牌及發(fā)牌操作:4</p><p>  3紙牌移動放置操作:7</p><p>  4.回收紙牌操作:8<

6、;/p><p>  5.幫助菜單功能的實現(xiàn):9</p><p>  6.退出功能的實現(xiàn):10</p><p>  第三章 調試分析與測試結果11</p><p>  第四章 設計總結15</p><p>  第五章 參考文獻16</p><p>  第一章 課程設計要求</p>

7、<p>  題目名稱:蜘蛛紙牌游戲</p><p><b>  題目類型:設計型</b></p><p><b>  課程設計目的:</b></p><p>  學會綜合運用已學的JAVA知識,用面向對象的技術實現(xiàn)一個小型的應用程序。</p><p><b>  實驗原理:&

8、lt;/b></p><p>  面向對象程序分析與設計、類的靈活運用、繼承技術、多態(tài)技術、異常處理、GUI程序設計等。</p><p><b>  實驗內容:</b></p><p>  參照windows游戲蜘蛛紙牌,自己編寫設計實現(xiàn)其功能,它具有如下一些功能:</p><p> ?。?)設計一個游戲界面,包括

9、玩牌區(qū)、發(fā)牌區(qū)和回收區(qū)。</p><p> ?。?)紙牌以及其背景的設定。</p><p> ?。?)移動紙牌。使用鼠標將較小的紙牌拖放到較大的紙牌下方,可以拖動一組紙牌,當要求這組紙牌是同一個花色,并且這一組紙牌從上到下是從大到小排列的,且不間斷。</p><p>  (4)回收紙牌。當某列出現(xiàn)同一花色,從上到下依次是從K到A的不間組合時,這組紙牌將被回收到回收區(qū)

10、中。</p><p> ?。?)發(fā)牌。用鼠標單擊發(fā)牌區(qū),若發(fā)牌區(qū)還有剩余的紙牌,則將發(fā)出一疊紙牌共10張,依次添加到玩牌區(qū)的10列紙牌最下方,但要求這10列紙牌沒有空白列。</p><p>  (6)若玩家不了解游戲規(guī)則可以點擊幫助獲得游戲方法。</p><p>  (7)級別設定。點擊“游戲”菜單中選取游戲難以級別,有3種級別,分別對應初級、中級、高級。</

11、p><p><b> ?。?)退出游戲。</b></p><p><b>  第二章 設計概要</b></p><p><b>  2.1 功能設計</b></p><p>  編寫程序以實現(xiàn)游戲蜘蛛紙牌的功能。</p><p><b>  1、

12、設計游戲界面。</b></p><p>  2、紙牌以及其背景的設定。</p><p><b>  3、移動紙牌。</b></p><p><b>  4、回收紙牌。</b></p><p><b>  5、發(fā)牌。</b></p><p> 

13、 6、若玩家不了解游戲規(guī)則可以點擊幫助獲得游戲方法。</p><p><b>  7、級別設定。</b></p><p><b>  8、退出游戲。</b></p><p><b>  2.2 程序流程</b></p><p><b>  2.3功能分析</b

14、></p><p><b>  1. 主要界面:</b></p><p>  以下是主菜單界面的主要代碼:</p><p>  JMenu jNewGame = new JMenu("游戲");</p><p>  JMenu jHelp = new JMenu("幫助");

15、</p><p>  JMenuItem jItemAbout = new JMenuItem("關于");</p><p>  JMenuItem jItemOpen = new JMenuItem("開始新游戲");</p><p>  JMenuItem jItemDeal = new JMenuItem("發(fā)

16、牌");</p><p>  JMenuItem jItemExit = new JMenuItem("退出");</p><p>  JRadioButtonMenuItem jRMItemEasy = new JRadioButtonMenuItem("初級:單花色");//菜單中的可選項按鈕</p><p> 

17、 JRadioButtonMenuItem jRMItemNormal = new JRadioButtonMenuItem("中級:雙花色");</p><p>  JRadioButtonMenuItem jRMItemHard = new JRadioButtonMenuItem("高級:四花色");</p><p>  public Spid

18、erMenuBar(Spider spider) {</p><p>  this.main = spider;</p><p>  jNewGame.add(jItemOpen);</p><p>  jNewGame.add(jItemDeal);</p><p>  jNewGame.addSeparator();//添加劃分線<

19、/p><p>  jNewGame.add(jRMItemEasy);</p><p>  jNewGame.add(jRMItemNormal);</p><p>  jNewGame.add(jRMItemHard);</p><p>  jNewGame.addSeparator();</p><p>  jNewG

20、ame.add(jItemExit);</p><p>  ButtonGroup group = new ButtonGroup();//(用來獲取JRadioButtonMenuItem 的值)</p><p>  group.add(jRMItemEasy);</p><p>  group.add(jRMItemNormal);</p><

21、;p>  group.add(jRMItemHard);</p><p>  jHelp.add(jItemAbout);</p><p>  this.add(jNewGame);</p><p>  this.add(jHelp);//添加到菜單欄</p><p>  以下是游戲窗口界面初始化的主要代碼:</p>&l

22、t;p>  pane = this.getContentPane(); // 獲得容器</p><p>  pane.setBackground(new Color(0, 112, 26));// 設置背景顏色</p><p>  clickLabel = new JLabel(); // 發(fā)牌區(qū)的鼠標點擊響應區(qū)域</p><p>  clickLabel.s

23、etBounds(890, 580, 110, 96); // 設置響應區(qū)域大小與坐標</p><p>  clickLabel.setBorder(javax.swing.BorderFactory</p><p>  .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));</p><p>  p

24、ane.add(clickLabel); // 將響應區(qū)域添加到容器中</p><p>  this.initCards();// 紙牌初始化</p><p>  this.randomCards();// 隨機分配紙牌</p><p>  this.setCardsLocation();// 為紙牌設置坐標位置</p><p>  this

25、.deal(); // 從右下角發(fā)出一疊紙牌。游戲剛開始時,需要先發(fā)出一疊紙牌。</p><p>  groundLabel = new JLabel[10];// 創(chuàng)建背景框數(shù)組,一共有10個背景框。</p><p>  int x = 20;// 背景框的x坐標,10個背景框是并排放置的,y坐標相等。第一個背景框的x坐標為20。</p><p>  for (i

26、nt i = 0; i < 10; i++) {// 循環(huán)創(chuàng)建背景框,并設置其坐標大小等屬性</p><p>  groundLabel[i] = new JLabel();// 創(chuàng)建背景框</p><p>  groundLabel[i]</p><p>  .setBorder(javax.swing.BorderFactory.createEtc

27、hedBorder(javax.swing.border.EtchedBorder.RAISED));// 為Label設置邊框</p><p><b>  // ,</b></p><p><b>  // 形成背景框</b></p><p>  groundLabel[i].setBounds(x, 25, 71, 9

28、6);// 設置背景框的大小與坐標</p><p>  x += 101; // 相鄰的背景框的x坐標差值為101。</p><p>  this.pane.add(groundLabel[i]);// 將背景框添加到容器中</p><p><b>  }</b></p><p>  this.setVisible(tr

29、ue);// 顯示窗口</p><p>  2初始化紙牌及發(fā)牌操作: </p><p>  初始化紙牌的主要代碼(包括所有紙牌生成及存入數(shù)組,右下角發(fā)牌區(qū)紙牌初始化以及表面顯示紙牌初始化):</p><p>  所有紙牌的生成及存入數(shù)組代碼:</p><p>  public void initCards() {</p><

30、;p>  // 如果紙牌已被賦值,即將其從框架的面板中移去</p><p>  if (cards[0] != null) {</p><p>  for (int i = 0; i < 104; i++) {</p><p>  pane.remove(cards[i]);</p><p><b>  }</b&

31、gt;</p><p><b>  }</b></p><p>  int n = 0;</p><p>  // 通過難度等級,為n賦值</p><p>  if (this.grade == Spider.EASY) {</p><p><b>  n = 1;</b>&

32、lt;/p><p>  } else if (this.grade == Spider.NATURAL) {</p><p><b>  n = 2;</b></p><p><b>  } else {</b></p><p><b>  n = 4;</b></p>

33、<p><b>  }</b></p><p>  // 為card賦值</p><p>  for (int i = 1; i <= 8; i++) {</p><p>  for (int j = 1; j <= 13; j++) {</p><p>  cards[(i - 1) * 13

34、 + j - 1] = new PKCard((i % n + 1) + "-" + j,</p><p>  this);//當n為1時,i%8的值永遠是0,所以i%8+1的值永遠是1,因此n為1時,創(chuàng)建的card的名稱是1</p><p>  // -1到1-13,全是黑桃。其他等級類似。</p><p><b>  }</b

35、></p><p><b>  }</b></p><p><b>  }</b></p><p><b>  //紙牌隨機分配</b></p><p>  public void randomCards() {// 將紙牌的順序打亂,否則牌號的將是從A到K的出現(xiàn)規(guī)律&l

36、t;/p><p>  PKCard temp = null;</p><p><b>  // 隨機生成牌號</b></p><p>  for (int i = 0; i < 52; i++) {</p><p>  int a = (int) (Math.random() * 104);</p>&l

37、t;p>  int b = (int) (Math.random() * 104);</p><p>  temp = cards[a];</p><p>  cards[a] = cards[b];</p><p>  cards[b] = temp;</p><p><b>  }</b></p>

38、<p><b>  }</b></p><p>  右下角發(fā)牌區(qū)紙牌的初始化代碼:</p><p>  int x = 883;// 將坐標定位到右下角發(fā)牌區(qū)</p><p>  int y = 580;</p><p>  for (int i = 0; i < 6; i++) {// 初始化右下角發(fā)

39、牌區(qū)的紙牌,共6疊</p><p>  for (int j = 0; j < 10; j++) {</p><p>  int n = i * 10 + j;</p><p>  pane.add(cards[n]);</p><p>  // 將card轉向背面</p><p>  cards[n].turn

40、Rear();</p><p>  // 將card放在固定的位置上</p><p>  cards[n].moveto(new Point(x, y));</p><p>  // 將card的位置及相關信息存入</p><p>  map.put(new Point(x, y), cards[n]);</p><p&g

41、t;<b>  }</b></p><p>  x += 10; // 共6疊紙牌,最上面一疊紙牌的x坐標為883,再往下,x依次增加10</p><p><b>  }</b></p><p>  表面顯示紙牌初始化:</p><p>  x = 20;// 將坐標定位到上方玩牌區(qū)的左邊起點,也就

42、是第一個背景框的坐標位置</p><p><b>  y = 45;</b></p><p>  /** 初始化表面顯示的紙牌 */</p><p>  for (int i = 10; i > 5; i--) { // 初始化玩牌區(qū)的紙牌,共5行</p><p>  for (int j = 0; j <

43、10; j++) { // 共10列</p><p>  int n = i * 10 + j; // 生成索引值</p><p>  if (n >= 104) { // 如果索引值超出數(shù)組下標</p><p>  continue; // 退出本次循環(huán),執(zhí)行外層循環(huán)</p><p><b>  }</b><

44、;/p><p>  pane.add(cards[n]); // 將索引處的紙牌添加到容器中</p><p>  cards[n].turnRear(); // 將紙牌轉向背面</p><p>  cards[n].moveto(new Point(x, y)); // 將紙牌放在固定的位置上</p><p>  map.put(new Poin

45、t(x, y), cards[n]); // 將紙牌及其坐標值存入map中</p><p>  x += 101; // 每兩列之間的x坐標相距101個像素</p><p><b>  }</b></p><p>  x = 20; // x坐標回到起點位置</p><p>  y -= 5; // 主坐標向上移5個像素

46、</p><p><b>  }</b></p><p><b>  發(fā)牌操作功能代碼:</b></p><p>  public void deal() { // 發(fā)牌,指從右下角的發(fā)牌區(qū)發(fā)牌</p><p>  this.setNA();</p><p>  // 判斷1

47、0列中是否有空列</p><p>  for (int i = 0; i < 10; i++) {</p><p>  if (this.getLastCardLocation(i) == null) {</p><p>  JOptionPane.showMessageDialog(this, "有空位不能發(fā)牌!", "提示&q

48、uot;,</p><p>  JOptionPane.WARNING_MESSAGE);</p><p><b>  return;</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  int x

49、 = 20;</p><p>  for (int i = 0; i < 10; i++) {</p><p>  Point lastPoint = this.getLastCardLocation(i);</p><p>  // 這張牌應“背面向上”</p><p>  if (c == 0) {// 當還沒有發(fā)過牌時,玩牌區(qū)的紙

50、牌列中,每兩張紙牌之間的y坐標值相差5,</p><p>  // 指的是背面牌與背面牌之間以及背面牌與第一張正面牌之間的y距離</p><p>  lastPoint.y += 5;</p><p><b>  }</b></p><p>  // 這張牌應“正面向上”</p><p>  el

51、se {// 兩張正面牌之間的y距離</p><p>  lastPoint.y += 20;</p><p><b>  }</b></p><p>  map.remove(cards[c + i].getLocation());</p><p>  cards[c + i].moveto(lastPoint);&l

52、t;/p><p>  map.put(new Point(lastPoint), cards[c + i]);</p><p>  cards[c + i].turnFront();</p><p>  cards[c + i].setCanMove(true);</p><p>  // 將組件card移動到容器中指定的順序索引。</p&

53、gt;<p>  this.pane.setComponentZOrder(cards[c + i], 1);</p><p>  Point point = new Point(lastPoint);</p><p>  if (cards[c + i].getValue() == 1) {</p><p>  int n = cards[c + i

54、].whichColumnAvailable(point);</p><p>  point.y -= 240;</p><p>  PKCard card = (PKCard) this.map.get(point);</p><p>  if (card != null && card.isCanMove()) {</p><

55、p>  this.haveFinish(n);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  x += 101;</b></p><p><b>  }</b></p>&l

56、t;p><b>  c += 10;</b></p><p><b>  }</b></p><p>  3紙牌移動放置操作: </p><p><b>  //用鼠標拖動紙牌</b></p><p>  public void mouseDragged(MouseEv

57、ent arg0) {</p><p>  if (canMove) {</p><p>  int x = 0;</p><p>  int y = 0;</p><p>  Point p = arg0.getPoint();</p><p>  x = p.x - point.x;</p><

58、p>  y = p.y - point.y;</p><p>  this.moving(x, y);</p><p><b>  }</b></p><p><b>  }</b></p><p><b>  /*</b></p><p><

59、;b>  * 方法:放置紙牌</b></p><p><b>  */</b></p><p>  public void setNextCardLocation(Point point) {</p><p>  PKCard card = main.getNextCard(this);</p><p>

60、;  if (card != null) {</p><p>  if (point == null) {</p><p>  card.setNextCardLocation(null);</p><p>  main.map.remove(card.getLocation());// 先從HashMap中刪除card</p><p>  

61、card.setLocation(card.initPoint); // 為card設置新的坐標</p><p>  main.map.put(card.initPoint, card); // 再將card添加到HashMap中</p><p><b>  } else {</b></p><p>  point = new Point(po

62、int);</p><p>  point.y += 20;</p><p>  card.setNextCardLocation(point);</p><p>  point.y -= 20;</p><p>  main.map.remove(card.getLocation());</p><p>  card

63、.setLocation(point);</p><p>  main.map.put(card.getLocation(), card);</p><p>  card.initPoint = card.getLocation();</p><p><b>  }</b></p><p><b>  }<

64、;/b></p><p><b>  }</b></p><p><b>  4.回收紙牌操作:</b></p><p>  回收紙牌及過關判定功能主要代碼:</p><p>  public void haveFinish(int column) {</p><p>

65、  Point point = this.getLastCardLocation(column);</p><p>  PKCard card = (PKCard) this.map.get(point);</p><p><b>  do {</b></p><p>  this.map.remove(point);</p>&

66、lt;p>  card.moveto(new Point(20 + finish * 10, 580));</p><p>  // 將組件移動到容器中指定的順序索引。</p><p>  pane.setComponentZOrder(card, 1);</p><p>  // 將紙牌新的相關信息存入HashMap</p><p>

67、  this.map.put(card.getLocation(), card);</p><p>  card.setCanMove(false);</p><p>  point = this.getLastCardLocation(column);</p><p>  if (point == null)</p><p>  card

68、= null;</p><p><b>  else</b></p><p>  card = this.map.get(point);</p><p>  } while (card != null && card.isCanMove());</p><p><b>  finish++;&l

69、t;/b></p><p>  // 如果8付牌全部組合成功,則顯示成功的對話框</p><p>  if (finish == 8) {</p><p>  JOptionPane.showMessageDialog(this, "恭喜你,順利通過!", "成功",</p><p>  JOpt

70、ionPane.PLAIN_MESSAGE);</p><p><b>  }</b></p><p>  if (card != null) {</p><p>  card.turnFront();</p><p>  card.setCanMove(true);</p><p><b&

71、gt;  }</b></p><p><b>  }</b></p><p><b>  }</b></p><p>  5.幫助菜單功能的實現(xiàn):</p><p><b>  主要代碼如下:</b></p><p>  public clas

72、s AboutDialog extends JDialog {</p><p>  JPanel jMainPanel = new JPanel();</p><p>  JTabbedPane jTabbedPane = new JTabbedPane();</p><p>  private JPanel jPanel1 = new JPanel();</

73、p><p>  private JTextArea jt1 = new JTextArea(</p><p>  "將電腦多次分發(fā)給你的牌按照相同的花色由大至小排列起來。直到桌面上的牌全都消失。");</p><p>  public AboutDialog() {</p><p>  setTitle("蜘蛛牌&q

74、uot;);</p><p>  setSize(300, 200);</p><p>  setResizable(false);</p><p>  setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);</p><p>  Container c = this.getCon

75、tentPane();</p><p>  jt1.setSize(260, 200);</p><p>  jt1.setEditable(false);</p><p>  jt1.setLineWrap(true);</p><p>  jt1.setFont(new Font("楷體_GB2312", java.a

76、wt.Font.BOLD, 13));</p><p>  jt1.setForeground(Color.BLUE);</p><p>  jPanel1.add(jt1);</p><p>  jTabbedPane.setSize(300, 200);</p><p>  jTabbedPane.addTab("游戲規(guī)則&qu

77、ot;, null, jPanel1, null);</p><p>  jMainPanel.add(jTabbedPane);</p><p>  c.add(jMainPanel);</p><p><b>  pack();</b></p><p>  this.setVisible(true);</p&g

78、t;<p><b>  }</b></p><p><b>  }</b></p><p>  6.退出功能的實現(xiàn):</p><p><b>  主要代碼如下:</b></p><p><b>  // “退出”</b></p>

79、<p>  jItemExit.addActionListener(new ActionListener() {</p><p>  public void actionPerformed(ActionEvent e) {</p><p>  main.dispose();</p><p>  System.exit(0);</p><

80、;p><b>  }</b></p><p><b>  });</b></p><p><b>  調試分析與測試結果</b></p><p>  通過對游戲的運行,包括移牌、發(fā)牌、開始游戲、選擇等級等等。未發(fā)現(xiàn)明顯異?,F(xiàn)象。在這里:我們將測試的結果圖片貼在了下面:</p>&l

81、t;p><b>  進入游戲主界面:</b></p><p>  游戲菜單: 打開幫助菜單: </p><p><b>  拖動紙牌:</b></p><p><b>  發(fā)牌以及收牌:</b></p>

82、<p><b>  完成游戲:</b></p><p><b>  選擇難度(高級):</b></p><p><b>  有空位不能發(fā)牌:</b></p><p><b>  設計總結</b></p><p>  通過這次JAVA課程設計實

83、驗,我發(fā)現(xiàn)java作為一種面向對象的編程語言,具有可移植性高,安全,可靠等優(yōu)點,最初設計時就是本著一次編寫到處執(zhí)行設計的。可以開發(fā)各種應用程序和游戲。</p><p>  在實驗中開始我們遇到了很多問題,但小組成員一起努力查找資料,一起討論提出各自的想法,最終把問題很好的解決掉了.這也讓我們知道了團隊在計算機編程小組中的重要性.它提醒著我們無論在生活中還是在以后的工作中都要記住團隊的重要性。</p>

84、<p><b>  參考文獻</b></p><p>  《Java程序設計》,朱慶生,古平等著,清華大學出版社,2011,1</p><p>  《Java編程》,王偉平等著,清華大學出版社,2010,5</p><p>  《Java課程設計案例精編》黃曉東編著,中國水利水電出版社出版</p><p> 

溫馨提示

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

評論

0/150

提交評論