蜘蛛纸牌程序设计(共37页)_第1页
蜘蛛纸牌程序设计(共37页)_第2页
蜘蛛纸牌程序设计(共37页)_第3页
蜘蛛纸牌程序设计(共37页)_第4页
蜘蛛纸牌程序设计(共37页)_第5页
已阅读5页,还剩34页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、精选优质文档-倾情为你奉上基于Java的纸牌游戏设计蜘蛛纸牌2015作者:张在吉、黄灵鑫、孙雪超2015/1/15目录1、游戏实现功能解析及界面游戏规则介绍计分规则游戏开始时,为500分。以后每移牌或撤销移牌一次,扣一分。当一组同一花色的牌被移除整理到左下方时,加100分。游戏中可以出现负分。在负分时,执行撤销操作,分数将自动变为0。翻牌规则游戏开局只有每叠牌的第一张默认为翻开状态。当移动一叠牌所有已翻开牌到其他地方时,未翻开牌的中最上面的一张将自动翻开。每次发牌的十张牌都为翻开状态。操作规则1、 移牌 拖动移动一张或一组牌到另一张牌的上面或空牌叠。每次移动的牌都只能放在一叠牌全部移除后的空白

2、位置或者比它最下面的一张牌大1点的牌之上。只有当一组牌全部为同一花色,方可以移动这一组牌。否则,只能移动这一组最上面一张或同一花色的多张。当移动形成同一花色由K到A顺序的一组牌时,这组牌会被自动移除整理到左下方,同时获得分数奖励。2、发牌当需要发牌时,单击界面右下的未发牌叠,可执行发牌操作。该操作不扣分。执行发牌操作时,界面上方的牌叠位必须都有牌,否则不能执行发牌操作。发牌时,将自动再每叠牌最上面发一张翻看状态的牌。2、游戏实现功能主窗口界面 1) 进入游戏 2)游戏菜单: 3)打开帮助菜单: 4)拖动纸牌:5)发牌以及收牌:6)完成游戏:7)有空位不能发牌:主窗口菜单在游戏的主窗口菜单中包括

3、如下几个菜单:(1)“游戏”菜单。包括了,“开局” 、“重新发牌” 、“显示可行操作” 、“三个难度等级、”“退出” 。如图所示。(2)“帮助”菜单。有“关于”下拉菜单。“关于”:可查看该游戏的游戏规则、声明等相关信息。如图所示。4、程序类主要功能介绍蜘蛛纸牌游戏共由4个部分组成,分别是:Spider.java;SpiderMenuBar.java;PKCard.java;AboutDialog.java。其中主要的类实现的功能如下:SpiderMenuBar.java包含名为SpiderMenuBar的public类,其主要功能为生成蜘蛛纸牌游戏的菜单栏,实现菜单栏中各个组件的时间侦听。主要

4、包括3个模块:图形用户界面的构建;组件监听接口的实现:显示可执行操作的线程。PKCard.java包含名为PKCard的public类,其主要功能为:定义纸牌的属性,包括名称,位置等相关信息。并通过相关方法实现纸牌的移动等。AboutDialog.java包含名为AboutDialog的public类,其主要功能为生成蜘蛛纸牌游戏的帮助栏。Spider.java包含名为Spider的public类,其主要功能为生成蜘蛛纸牌游戏的框架,实现游戏中的方法,包括:纸牌的随机生成,位置的摆放等。5、程序的运行将文件Spider.java,SpiderMenuBar.java,PKCard.java,A

5、boutDialog.java以及所需要的images图像文件保存到同一个文件中。利用javac命令对文件进行编译,使用的命令如下:javac Spider.java ;javac SpiderMenuBar.java ;Javac PKCard.java ;javac AboutDialog.java。之后利用 java命令执行程序,使用的命令如下:java Spider.java6、 设计总结 通过这次JAVA课程设计实验,我发现java作为一种面向对象的编程语言,具有可移植性高,安全,可靠等优点,最初设计时就是本着一次编写到处执行设计的。可以开发各种应用程序和游戏.在实验中开始我们遇到了

6、很多问题,但小组成员一起努力查找资料,一起讨论提出各自的想法,最终把问题很好的解决掉了.这也让我们知道了团队在计算机编程小组中的重要性.它提醒着我们无论在生活中还是在以后的工作中都要记住团队的重要性。附录:源代码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; /设定初始难度等级为简单private int grade = Spider.EASY; private Container pane = null; /生成纸牌数组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); /* *构造函数 */ public Spider() /改变系统默认字体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); /设置框架的大小setSi

10、ze(1024, 742); /生成SpiderMenuBar对象,并放置在框架之上setJMenuBar(new SpiderMenuBar(this); pane = this.getContentPane(); /设置背景颜色pane.setBackground(new Color(0, 112, 26); /将布局管理器设置成为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 *返回牌的数量 */public int getC() return c; /* *设置等级 */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); /随机纸牌初始化this.randomCards(); /* *纸牌随机分配 */public void randomCar

16、ds() PKCard temp = null; /随机生成牌号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; /* *设置还原 */public void setNA() a = 0; n = 0; /* *设置纸牌的位置 */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转向背面cardsn.turnRear(); /将card放在固定的位置上cardsn.moveto(new Point(x, y); /将card的位置及相关信息存入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 *方法:游戏运行 */public void deal() this.setNA(); /判断10列中是否空列for (int i = 0; i < 10; i+) if (this.getLastCardLocation(i) = null) JOptionPane.showMessageDialog(this, &

23、quot;有空位不能发牌!", "提示", JOptionPane.WARNING_MESSAGE); return; int x = 20; for (int i = 0; i < 10; i+) Point lastPoint = this.getLastCardLocation(i); /这张牌应“背面向上”if (c = 0) lastPoint.y += 5; /这张牌应“正面向上”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); /将纸牌新的相关信息存入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("关于"); JMenuItem jItemOpen = new JMenuItem("开局"); JMenuItem jItemPlayAgain = new JMenuItem("重新发牌"); /生成单选框 JRadioButtonMenuItem jRMItemEasy = new JRadioButtonMenuItem("简单:单一花色"); JRadioButt

34、onMenuItem jRMItemNormal = new JRadioButtonMenuItem("中级:双花色"); JRadioButtonMenuItem jRMItemHard = new JRadioButtonMenuItem("高级:四花色"); JMenuItem jItemExit = new JMenuItem("退出"); JMenuItem jItemValid = new JMenuItem("显示可行操作"); /* *构造函数,生成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);/为组件添加事件监听并实现 /“开局”jItemOpen.addActionListener(new java.awt.event.ActionListener() public void actionPerformed(java.awt.ev

37、ent.ActionEvent e) main.newGame(); ); /“重新发牌”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); );/“简单级别”默认已选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. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论