蜘蛛紙牌程序設(shè)計(共37頁)_第1頁
蜘蛛紙牌程序設(shè)計(共37頁)_第2頁
蜘蛛紙牌程序設(shè)計(共37頁)_第3頁
蜘蛛紙牌程序設(shè)計(共37頁)_第4頁
蜘蛛紙牌程序設(shè)計(共37頁)_第5頁
已閱讀5頁,還剩34頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

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

文檔簡介

1、精選優(yōu)質(zhì)文檔-傾情為你奉上基于Java的紙牌游戲設(shè)計蜘蛛紙牌2015作者:張在吉、黃靈鑫、孫雪超2015/1/15目錄1、游戲?qū)崿F(xiàn)功能解析及界面游戲規(guī)則介紹計分規(guī)則游戲開始時,為500分。以后每移牌或撤銷移牌一次,扣一分。當(dāng)一組同一花色的牌被移除整理到左下方時,加100分。游戲中可以出現(xiàn)負(fù)分。在負(fù)分時,執(zhí)行撤銷操作,分?jǐn)?shù)將自動變?yōu)?。翻牌規(guī)則游戲開局只有每疊牌的第一張默認(rèn)為翻開狀態(tài)。當(dāng)移動一疊牌所有已翻開牌到其他地方時,未翻開牌的中最上面的一張將自動翻開。每次發(fā)牌的十張牌都為翻開狀態(tài)。操作規(guī)則1、 移牌 拖動移動一張或一組牌到另一張牌的上面或空牌疊。每次移動的牌都只能放在一疊牌全部移除后的空白

2、位置或者比它最下面的一張牌大1點(diǎn)的牌之上。只有當(dāng)一組牌全部為同一花色,方可以移動這一組牌。否則,只能移動這一組最上面一張或同一花色的多張。當(dāng)移動形成同一花色由K到A順序的一組牌時,這組牌會被自動移除整理到左下方,同時獲得分?jǐn)?shù)獎勵。2、發(fā)牌當(dāng)需要發(fā)牌時,單擊界面右下的未發(fā)牌疊,可執(zhí)行發(fā)牌操作。該操作不扣分。執(zhí)行發(fā)牌操作時,界面上方的牌疊位必須都有牌,否則不能執(zhí)行發(fā)牌操作。發(fā)牌時,將自動再每疊牌最上面發(fā)一張翻看狀態(tài)的牌。2、游戲?qū)崿F(xiàn)功能主窗口界面 1) 進(jìn)入游戲 2)游戲菜單: 3)打開幫助菜單: 4)拖動紙牌:5)發(fā)牌以及收牌:6)完成游戲:7)有空位不能發(fā)牌:主窗口菜單在游戲的主窗口菜單中包括

3、如下幾個菜單:(1)“游戲”菜單。包括了,“開局” 、“重新發(fā)牌” 、“顯示可行操作” 、“三個難度等級、”“退出” 。如圖所示。(2)“幫助”菜單。有“關(guān)于”下拉菜單?!瓣P(guān)于”:可查看該游戲的游戲規(guī)則、聲明等相關(guān)信息。如圖所示。4、程序類主要功能介紹蜘蛛紙牌游戲共由4個部分組成,分別是:Spider.java;SpiderMenuBar.java;PKCard.java;AboutDialog.java。其中主要的類實(shí)現(xiàn)的功能如下:SpiderMenuBar.java包含名為SpiderMenuBar的public類,其主要功能為生成蜘蛛紙牌游戲的菜單欄,實(shí)現(xiàn)菜單欄中各個組件的時間偵聽。主要

4、包括3個模塊:圖形用戶界面的構(gòu)建;組件監(jiān)聽接口的實(shí)現(xiàn):顯示可執(zhí)行操作的線程。PKCard.java包含名為PKCard的public類,其主要功能為:定義紙牌的屬性,包括名稱,位置等相關(guān)信息。并通過相關(guān)方法實(shí)現(xiàn)紙牌的移動等。AboutDialog.java包含名為AboutDialog的public類,其主要功能為生成蜘蛛紙牌游戲的幫助欄。Spider.java包含名為Spider的public類,其主要功能為生成蜘蛛紙牌游戲的框架,實(shí)現(xiàn)游戲中的方法,包括:紙牌的隨機(jī)生成,位置的擺放等。5、程序的運(yùn)行將文件Spider.java,SpiderMenuBar.java,PKCard.java,A

5、boutDialog.java以及所需要的images圖像文件保存到同一個文件中。利用javac命令對文件進(jìn)行編譯,使用的命令如下:javac Spider.java ;javac SpiderMenuBar.java ;Javac PKCard.java ;javac AboutDialog.java。之后利用 java命令執(zhí)行程序,使用的命令如下:java Spider.java6、 設(shè)計總結(jié) 通過這次JAVA課程設(shè)計實(shí)驗(yàn),我發(fā)現(xiàn)java作為一種面向?qū)ο蟮木幊陶Z言,具有可移植性高,安全,可靠等優(yōu)點(diǎn),最初設(shè)計時就是本著一次編寫到處執(zhí)行設(shè)計的??梢蚤_發(fā)各種應(yīng)用程序和游戲.在實(shí)驗(yàn)中開始我們遇到了

6、很多問題,但小組成員一起努力查找資料,一起討論提出各自的想法,最終把問題很好的解決掉了.這也讓我們知道了團(tuán)隊在計算機(jī)編程小組中的重要性.它提醒著我們無論在生活中還是在以后的工作中都要記住團(tuán)隊的重要性。附錄:源代碼Spider.javaimport java.awt.*;import java.awt.event.*;import javax.swing.*;import java.util.*;public class Spider extends JFrame/整型變量,表示難度等級為:簡單public static final int EASY = 1; /整型變量,表示難度等級為:普通p

7、ublic static final int NATURAL = 2; /整型變量,表示難度等級為:難public static final int HARD = 3; /設(shè)定初始難度等級為簡單private int grade = Spider.EASY; private Container pane = null; /生成紙牌數(shù)組private PKCard cards = new PKCard104; private JLabel clickLabel = null; private int c = 0; private int n = 0; private int a = 0; pri

8、vate int finish = 0; Hashtable table = null; private JLabel groundLabel = null; public static void main(String args) Spider spider = new Spider();spider.setVisible(true); /* *構(gòu)造函數(shù) */ public Spider() /改變系統(tǒng)默認(rèn)字體Font font = new Font("Dialog", Font.PLAIN, 12);java.util.Enumeration keys = UIMana

9、ger.getDefaults().keys();while (keys.hasMoreElements() Object key = keys.nextElement();Object value = UIManager.get(key);if (value instanceof javax.swing.plaf.FontUIResource) UIManager.put(key, font);setTitle("蜘蛛牌"); setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); /設(shè)置框架的大小setSi

10、ze(1024, 742); /生成SpiderMenuBar對象,并放置在框架之上setJMenuBar(new SpiderMenuBar(this); pane = this.getContentPane(); /設(shè)置背景顏色pane.setBackground(new Color(0, 112, 26); /將布局管理器設(shè)置成為nullpane.setLayout(null); clickLabel = new JLabel(); clickLabel.setBounds(883, 606, 121, 96); pane.add(clickLabel); clickLabel.addM

11、ouseListener(new MouseAdapter() public void mouseReleased(MouseEvent me) if (c < 60)Spider.this.deal(); ); this.initCards(); this.randomCards(); this.setCardsLocation(); groundLabel = new JLabel10; int x = 20; for (int i = 0; i < 10; i+) groundLabeli = new JLabel(); groundLabeli .setBorder(jav

12、ax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED); groundLabeli.setBounds(x, 25, 71, 96); x += 101; this.pane.add(groundLabeli); this.setVisible(true); this.deal(); this.addKeyListener(new KeyAdapter() class Show extends Thread public void run() Spider.this.showEnabl

13、eOperator(); public void keyPressed(KeyEvent e) if (finish != 8) if (e.getKeyCode() = KeyEvent.VK_D && c < 60) Spider.this.deal(); else if (e.getKeyCode() = KeyEvent.VK_M) new Show().start(); ); /* *開始新游戲 */public void newGame() this.randomCards(); this.setCardsLocation(); this.setGroundL

14、abelZOrder(); this.deal(); /* *返回值:int *返回牌的數(shù)量 */public int getC() return c; /* *設(shè)置等級 */public void setGrade(int grade) this.grade = grade; /* *紙牌初始化 */public void initCards() /如果紙牌已被賦值,即將其從框架的面板中移去if (cards0 != null) for (int i = 0; i < 104; i+) pane.remove(cardsi); int n = 0; /通過難度等級,為n賦值if (th

15、is.grade = Spider.EASY) n = 1; else if (this.grade = Spider.NATURAL) n = 2; else n = 4; /為card賦值 for (int i = 1; i <= 8; i+) for (int j = 1; j <= 13; j+) cards(i - 1) * 13 + j - 1 = new PKCard(i % n + 1) + "-" + j, this); /隨機(jī)紙牌初始化this.randomCards(); /* *紙牌隨機(jī)分配 */public void randomCar

16、ds() PKCard temp = null; /隨機(jī)生成牌號for (int i = 0; i < 52; i+) int a = (int) (Math.random() * 104); int b = (int) (Math.random() * 104); temp = cardsa; cardsa = cardsb; cardsb = temp; /* *設(shè)置還原 */public void setNA() a = 0; n = 0; /* *設(shè)置紙牌的位置 */public void setCardsLocation() table = new Hashtable(); c

17、 = 0; finish = 0; n = 0; a = 0; int x = 883; int y = 580;/初始化待展開的紙牌 for (int i = 0; i < 6; i+) for (int j = 0; j < 10; j+) int n = i * 10 + j; pane.add(cardsn); /將card轉(zhuǎn)向背面cardsn.turnRear(); /將card放在固定的位置上cardsn.moveto(new Point(x, y); /將card的位置及相關(guān)信息存入table.put(new Point(x, y), cardsn); x += 10

18、; x = 20; y = 45; /初始化表面顯示的紙牌for (int i = 10; i > 5; i-) for (int j = 0; j < 10; j+) int n = i * 10 + j; if (n >= 104) continue; pane.add(cardsn); cardsn.turnRear(); cardsn.moveto(new Point(x, y); table.put(new Point(x, y), cardsn); x += 101; x = 20; y -= 5; /* *返回值:void *方法:顯示可移動的操作 */publ

19、ic void showEnableOperator() int x = 0; out: while (true) Point point = null; PKCard card = null; do if (point != null)n+; point = this.getLastCardLocation(n); while (point = null) point = this.getLastCardLocation(+n); if (n = 10) n = 0; x+; if (x = 10) break out; card = (PKCard) this.table.get(poin

20、t); while (!card.isCardCanMove(); while (this.getPreviousCard(card) != null && this.getPreviousCard(card).isCardCanMove() card = this.getPreviousCard(card); if (a = 10)a = 0; for (; a < 10; a+) if (a != n) Point p = null; PKCard c = null; do if (p != null)a+;p = this.getLastCardLocation(a

21、); int z = 0; while (p = null) p = this.getLastCardLocation(+a); if (a = 10) a = 0; if (a = n) a+; z+; if (z = 10) break out; c = (PKCard) this.table.get(p); while (!c.isCardCanMove(); if (c.getCardValue() = card.getCardValue() + 1) card.flashCard(card); try Thread.sleep(800); catch (InterruptedExce

22、ption e) e.printStackTrace(); c.flashCard(c); a+; if (a = 10)n+; break out; n+; if (n = 10)n = 0; x+; if (x = 10)break out; /* *返回值:void *方法:游戲運(yùn)行 */public void deal() this.setNA(); /判斷10列中是否空列for (int i = 0; i < 10; i+) if (this.getLastCardLocation(i) = null) JOptionPane.showMessageDialog(this, &

23、quot;有空位不能發(fā)牌!", "提示", JOptionPane.WARNING_MESSAGE); return; int x = 20; for (int i = 0; i < 10; i+) Point lastPoint = this.getLastCardLocation(i); /這張牌應(yīng)“背面向上”if (c = 0) lastPoint.y += 5; /這張牌應(yīng)“正面向上”else lastPoint.y += 20; table.remove(cardsc + i.getLocation(); cardsc + i.moveto(las

24、tPoint); table.put(new Point(lastPoint), cardsc + i); cardsc + i.turnFront(); cardsc + i.setCanMove(true); /將組件card移動到容器中指定的順序索引。 this.pane.setComponentZOrder(cardsc + i, 1); Point point = new Point(lastPoint); if (cardsc + i.getCardValue() = 1) int n = cardsc + i.whichColumnAvailable(point); point.

25、y -= 240; PKCard card = (PKCard) this.table.get(point); if (card != null && card.isCardCanMove() this.haveFinish(n); x += 101; c += 10; /* *返回值:PKCard對象 *方法:獲得card上面的那張牌 */public PKCard getPreviousCard(PKCard card) Point point = new Point(card.getLocation(); point.y -= 5; card = (PKCard) tab

26、le.get(point); if (card != null)return card; point.y -= 15; card = (PKCard) table.get(point); return card; /* *返回值:PKCard對象 *方法:取得card下面的一張牌 */public PKCard getNextCard(PKCard card) Point point = new Point(card.getLocation(); point.y += 5; card = (PKCard) table.get(point); if (card != null)return ca

27、rd; point.y += 15; card = (PKCard) table.get(point); return card; /* *返回值:Point對象 *方法:取得第column列最后一張牌的位置 */public Point getLastCardLocation(int column) Point point = new Point(20 + column * 101, 25); PKCard card = (PKCard) this.table.get(point); if (card = null) return null; while (card != null) poi

28、nt = card.getLocation(); card = this.getNextCard(card); return point; public Point getGroundLabelLocation(int column) return new Point(groundLabelcolumn.getLocation(); /* *返回值:void *方法:放置groundLable組件 */public void setGroundLabelZOrder() for (int i = 0; i < 10; i+) /將組件groundLable移動到容器中指定的順序索引。順序

29、(105+i)確定了繪制組件的順序;具有最高順序的組件將第一個繪制,而具有最低順序的組件將最后一個繪制。在組件重疊的地方,具有較低順序的組件將覆蓋具有較高順序的組件。 pane.setComponentZOrder(groundLabeli, 105 + i); /* *返回值:void *方法:判斷紙牌的擺放是否完成 */public void haveFinish(int column) Point point = this.getLastCardLocation(column); PKCard card = (PKCard) this.table.get(point); do this.

30、table.remove(point); card.moveto(new Point(20 + finish * 10, 580); /將組件移動到容器中指定的順序索引。 pane.setComponentZOrder(card, 1); /將紙牌新的相關(guān)信息存入Hashtablethis.table.put(card.getLocation(), card); card.setCanMove(false); point = this.getLastCardLocation(column); if (point = null) card = null; else card = (PKCard)

31、 this.table.get(point); while (card != null && card.isCardCanMove(); finish+; /如果8付牌全部組合成功,則顯示成功的對話框if (finish = 8) JOptionPane.showMessageDialog(this, "恭喜你,順利通過!", "成功", JOptionPane.PLAIN_MESSAGE); if (card != null) card.turnFront(); card.setCanMove(true); SpiderMenuBar.

32、javaimport javax.swing.JMenuBar;import javax.swing.JMenu;import javax.swing.JMenuItem;import javax.swing.JRadioButtonMenuItem;import javax.swing.ButtonGroup;public class SpiderMenuBar extends JMenuBar /生成spider框架對象 Spider main = null; /生成菜單組 JMenu jNewGame = new JMenu("游戲"); JMenu jHelp =

33、new JMenu("幫助"); /生成菜單項 JMenuItem jItemAbout = new JMenuItem("關(guān)于"); JMenuItem jItemOpen = new JMenuItem("開局"); JMenuItem jItemPlayAgain = new JMenuItem("重新發(fā)牌"); /生成單選框 JRadioButtonMenuItem jRMItemEasy = new JRadioButtonMenuItem("簡單:單一花色"); JRadioButt

34、onMenuItem jRMItemNormal = new JRadioButtonMenuItem("中級:雙花色"); JRadioButtonMenuItem jRMItemHard = new JRadioButtonMenuItem("高級:四花色"); JMenuItem jItemExit = new JMenuItem("退出"); JMenuItem jItemValid = new JMenuItem("顯示可行操作"); /* *構(gòu)造函數(shù),生成JMenuBar的圖形界面 */ public

35、SpiderMenuBar(Spider spider) this.main = spider; /* *初始化“游戲”菜單欄 */ jNewGame.add(jItemOpen); jNewGame.add(jItemPlayAgain); jNewGame.add(jItemValid); jNewGame.addSeparator(); jNewGame.add(jRMItemEasy); jNewGame.add(jRMItemNormal); jNewGame.add(jRMItemHard); jNewGame.addSeparator(); jNewGame.add(jItemE

36、xit); ButtonGroup group = new ButtonGroup(); group.add(jRMItemEasy); group.add(jRMItemNormal); group.add(jRMItemHard); jHelp.add(jItemAbout); this.add(jNewGame); this.add(jHelp);/為組件添加事件監(jiān)聽并實(shí)現(xiàn) /“開局”jItemOpen.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.ev

37、ent.ActionEvent e) main.newGame(); ); /“重新發(fā)牌”jItemPlayAgain.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent e) if(main.getC() < 60) main.deal(); ); /"顯示可行操作"jItemValid.addActionListener(new java.awt.event.ActionListener() publ

38、ic void actionPerformed(java.awt.event.ActionEvent e) new Show().start(); ); /“退出”jItemExit.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent e) main.dispose(); System.exit(0); );/“簡單級別”默認(rèn)已選jRMItemEasy.setSelected(true); /“簡單級別”jRMItemEasy.a

39、ddActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent e) main.setGrade(Spider.EASY); main.initCards(); main.newGame(); ); /“中級”jRMItemNormal.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEv

40、ent e) main.setGrade(Spider.NATURAL); main.initCards(); main.newGame(); ); /“高級”jRMItemHard.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.event.ActionEvent e) main.setGrade(Spider.HARD); main.initCards(); main.newGame(); );jNewGame.addMenuListener(new javax.swing.event.MenuListener() public void menuSelected(javax.swing.event.MenuEvent e) if(main.getC() < 60) jItemPlayAgain.setEnab

溫馨提示

  • 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. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論