《java课程设计 蜘蛛纸牌游戏设计课程设计报告.doc》由会员分享,可在线阅读,更多相关《java课程设计 蜘蛛纸牌游戏设计课程设计报告.doc(17页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、学号xxxx面向对象程序设计课程设计报告题目:下拉列表运算器设计专业:xxxxx班级:xxx姓名:xx指导教师:xx成绩:xxxxxx年 x月xx日目录1设计内容及要求21.1 设计内容21.2 设计要求22概要设计32.1代码功能功能模块设计:32.2程序的总体设计流程图:32.3模块一的详细介绍:32.3.1主要的类:32.3.2主要的变量:42.3.3主要的方法:42.4模块二的详细介绍:52.4.1主要的类:52.4.2主要的变量:52.4.3主要的方法:52.5模块三的详细介绍:62.5.1主要类介绍:62.5.2主要变量:72.5.3主要方法:72.6模块四的详细介绍:82.6.1
2、主要的类:82.6.2主要的变量:82.6.3主要的方法:83设计过程或程序代码93.1需要实现的主要功能:93.2功能设计流程图:103.3主要功能的代码实现:103.3.1游戏菜单栏内游戏菜单及帮助菜单功能展示:103.3.2主界面的设计:113.3.3纸牌的初始化以及发牌操作133.3.4纸牌的移动以及放置183.3.5显示当前纸牌可行的操作:193.3.6回收纸牌:214设计结果与分析224.1运行程序:224.2发布程序:234.3总结:235参考文献241设计内容及要求1.1 设计内容相信很多人都玩过蜘蛛纸牌这款休闲游戏,现在随着生活水平的提高,人们拥有充分的时间来享受休闲游戏带来
3、的快乐,越来越多的人亲睐蜘蛛纸牌游戏。谈起这款游戏,大家并不陌生。从WINDOWS2000系统开始,就嵌入了蜘蛛纸牌游戏,可是随着微软系统的不段升级,蜘蛛纸牌游戏的功能业变得越来越强大,游戏的界面也更加美观。用户的体验感受也更加美好。所以,蜘蛛纸牌游戏的开发对于人类的生活娱乐更加有意义。了解蜘蛛纸牌的开发过程也是作为一名学习计算机专业大学生所应该尝试的过程。游戏的目标是以最少的移动次数将牌面中的十叠牌以及待发的五组,共计八副牌整理移除。当所有牌被移除整理到界面的左下方,游戏获胜。1.2 设计要求需要做的工作有学习掌握开发程序的方法,开了解发工具,进行需求分析,根据得到的需求规格说明书设计具体的
4、程序流程图,编写程序,修改程序,运行程序,系统调试程序、测试程序,发布程序。2概要设计2.1代码功能功能模块设计:蜘蛛纸牌游戏共由4个部分组成,分别 是:Spider.java,SpiderMenuBar.java,PKCard.java,AboutDialog.java。SpiderMenuBar.java包含名为SpiderMenuBar的public类,其主要功能为生成蜘蛛纸牌游戏的菜单栏,实现菜单栏中各个组件的事件侦听。主要包括3个模块:图形用户界面的构建;组件监听接口的实现:显示可执行操作的线程。PKCard.java包含名为PKCard的public类,其主要功能为:定义纸牌的属性
5、,包括名称,位置等相关信息。并通过相关方法实现纸牌的移动等。AboutDialog.java包含名为AboutDialog的public类,其主要功能为生成蜘蛛纸牌游戏的帮助栏。Spider.java包含名为Spider的public类,其主要功能为生成蜘蛛纸牌游戏的框架,实现游戏中的方法,包括:纸牌的随机生成,位置的摆放等。2.2程序的总体设计流程图:2.3模块一的详细介绍:SpiderMenuBar.java的功能是生成蜘蛛纸牌游戏的菜单栏。实现菜单栏中的各个组件的事件。2.3.1主要的类:JMenuBar类、JMenu类、JMenuItem类、JRadioButton类都是设计GUI(图
6、形用户界面)的包javax.swing中的类。可以用import引用这些类。JMenuBar类是JComponent类的子类负责创建菜单条的。即JMenuBar类的一个实例就是一个菜单条。JMenu类是JComponent类的子类负责创建菜单组的。即JMenu类的一个实例化就是一个菜单。JMenuItem类是JMenu类的父类负责创建菜单项。即JMenuItem类的一个实例化就是一个菜单项。JRadioButtonMenuItem类负责一个单选按钮菜单项的实现。JRadioButtonMenuItem 是属于一组菜单项中的一个菜单项,该组中只能选择一个项。ButtonGroup 类用于为一组按
7、钮创建一个多斥作用域。使用相同的 ButtonGroup 对象创建一组按钮意味着“开启”其中一个按钮时,将关闭组中的其他所有按钮。SpiderMenuBar类是此文件的一个主类是JMenuBar的子类。Show类是Thread的子类用于创建线程。2.3.2主要的变量:jNewGame、jHelp变量分别是JMenu类创建的“游戏”、“帮助”菜单。jItemAbout、jItemOpen、jItemPlayAgain、jItemExit、jItemValid变量分别是JMenuItem类创建的“关于”、“开局”、“重新发牌”、“退出”、“显示可行操作”菜单项。jRMItemEasy、jRMIte
8、mNormal、jRMItemHard变量分别是JRadioButtonMenuItem类创建的“简单:单一花色”、“中级:双花色”、“高级:四花色”的单选按钮菜单项。group变量是ButtonGroup 类创建的一组按钮选择对象。spider变量是Spider类创建的对象用于主界面窗口的实现。将在Spider.java文件中介绍。2.3.3主要的方法:public JMenuBar()创建新的菜单栏。public JMenu(String text)构造一个新菜单,用提供的字符串作为其文本。public JMenuItem(String text)创建带有指定文本的菜单项。public J
9、RadioButtonMenuItem(String text)创建一个带文本的单选按钮菜单项。public ButtonGroup()创建一个新的单选按钮对象组。 public void add(MenuItem item)向菜单增加由参数item指定的菜单项对象。public void add(AbstractButton b)将单选按钮添菜单项加到组中。public void add(JMenu c)将指定的菜单添加加到菜单栏中。public void addSeparator()将新分隔符追加到菜单的末尾。所需要添加的事件处理的接口方法将在后来的模块中进行介绍。事件源即能够产生的事件的
10、对象。监视器用于对事件源进行监视以便对发生的事件做出处理。事件源通过调用相应的方法将某个对象作为自己的监视器。这个方法是addActionListen(ActionListener listen)该方法中的参数是ActionListener类型的接口。因此必须用ActionListener接口的类创建的对象传递给该方法的参数,使得该对象成为事件源的的监视器。监视器负责调用特定的方法处理事件,创建监视器的类必须提供处理事件的特定的方法,即实现接口方法。public void addMenuListener(MenuListener l)添加菜单事件的侦听器。void menuSelected(M
11、enuEvent e)选择某个菜单时调用。 void menuDeselected(MenuEvent e)取消选择某个菜单时调用。 void menuCanceled(MenuEvent e)取消菜单时调用。2.4模块二的详细介绍:PKCard的功能是定义纸牌的属性,包括名称,位置等相关信息。并通过相关方法实现了纸牌的移动等。2.4.1主要的类:JDialog类是创建对话框窗口的主要类。可以使用此类创建自定义的对话框,或者调用 JOptionPane 中的多个类方法来创建各种标准对话框。Jpanel类是一个面板类负责创建一个面板容器,再向这个面板添加组件,然后将面板添加到底层容器中。JTab
12、bedPane类负责创建一个组件,它允许用户通过单击具有给定标题和/或图标的选项卡,在一组组件之间进行切换。JTextArea类负责创建一个显示纯文本的多行区域。它作为一个轻量级组件Container类负责创建一个容器对象,此容器可以包含其它组件。AboutDialog类是JDialog类的子类,负责创建一个显示对话框。2.4.2主要的变量:jMainPane、jPanel1、jPanel2、变量是JPane1创建的面板容器。jt1、jt2是JTextArea类创建的文本区对象。jTabbedPane是JTabbedPane类创建的选项卡窗格对象。c变量是Container类创建的容器。2.4
13、.3主要的方法:public JTabbedPane()创建一个具有默认的 JTabbedPane.TOP 选项卡布局的空 TabbedPane.public JDialog()创建一个没有标题并且没有指定 Frame 所有者的无模式对话框。一个共享的、隐藏的窗体将被设置为该对话框的所有者。public JPanel()创建具有双缓冲和流布局的新面板容器。public JTextArea(String text)构造显示指定文本为text的新的文本区。public void setTittle(String s)设置一个标题为s的对话框。public void setSize(int widt
14、h,int heigth)创建宽为width,高位heigth大小的对话框。public void setResizable(boolean b)设置对话框是否可调整大小。b为true时,对话框可调整大小。public void setDefaultCloseOperation(int operation)该方法用来设置单机窗体右上角的关闭图标后,程序会做出怎样的处理。operation取DISPOSE_ON_CLOSE时/隐藏当前窗口,并释放窗体所占有的其他资源。public void setVisible(boolean b)设置框口是可见还是不可见。b取true是为可见。public C
15、ontainer getContentPane()方法可得到窗口的内容面板容器。public void JTextArea.setSize(int width,int heigth)设置文本区的大小。public void JTextArea.setEditable(boolean b)设置文本区是否可以编辑。public void JTextArea.setLineWrap(boolean b)设置文本区中输入的文本是否可以实现在右边界自动换行。public void JTextArea.setFont(Font f)设置文本区内的字体。public void JTextArea.setFo
16、reground(Color c)设置文本区组件的前景色。public void addTab(String title,Icon icon,Component component,String tip)添加由 title 和/或 icon 表示的 component 和 tip,其中任意一个都可以为 nul参数:title - 此选项卡中要显示的标题,icon - 此选项卡中要显示的图标,component - 单击此选项卡时要显示的组件,tip - 此选项卡要显示的工具提示。public void pack()调整此窗口的大小,以适合其子组件的首选大小和布局。2.5模块三的详细介绍:PKC
17、ard的作用是定义纸牌的属性,包括名称、位置等相关信息。并通过相关方法实现纸牌的移动。2.5.1主要类介绍:JLable类负责创建标签对象。标签用于短文本字符串或图像或二者的显示区。Thread类负责创建线程对象。MouseListener接口、MouseMotionListener接口负责处理事件源所触发的鼠标事件,包括处理鼠标按下、释放、进入、退出、单击、连击、拖动、移动所触发鼠标事件。Point类负责创建表示 (x,y) 坐标空间中的位置的点对象,以整数精度指定。MouseEvent类负责创建鼠标所发生的事件对象。Flash类负责创建线程对象,不断的获取下一张纸牌。PKCard类是文件的
18、主类,实现MouseListener接口的JLable的子类。负责创建纸牌对象。2.5.2主要变量:Point point变量表示纸牌的位置对象。Point initPoint表示纸牌的初始化位置对象。int value变量表示纸牌的内容值。int type变量表示纸牌的类型。String name变量表示纸牌的名称。Container pane变量表示标签内主容器。boolean canMove 变量表示纸牌是否可以移动,值为true时,可以移动。boolean isFront变量表示纸牌是否正面显示,值为true时,则为正面显示。PKCard previousCard变量表示上面一张纸牌2
19、.5.3主要方法:public void flashCard(PKCard card)方法启动Flash线程不停的获取下一张纸牌直至完成。public void run()方法为纸牌的正面设置白色图片。card.updateUI()方法将UI属性重置为当前外观的值。public void mousePressed(MouseEvent mp)方法按下鼠标时事件的处理方法。public void mouseReleased(MouseEvent mr)方法释放鼠标时事件处理的方法。public void setNextCardLocation(Point point)方法放置鼠标时事件处理方法。
20、public int whichColumnAvailable(Point point)方法为判断可用列。public void mouseDragged(MouseEvent argO)方法鼠标拖动纸牌时事件处理方法。public void moving(int x,int y)方法将纸牌移动(x,y)个位置。pane.setComponentZOrder(this,1)方法将主件移动到容器中指定的顺序索引。public PKCard(String name,Spider spider)方法纸牌的构造函数。public void turnFront()方法令纸牌显示正面。public voi
21、d turnRear()方法令纸牌显示背面。public void moveto(Point point()方法将纸牌移动到点pointpublic void setCanMove(boolean can)方法判断纸牌是否能够移动。public boolean isCardFront()方法判断纸牌是否正面显示。public boolean isCardCanMove()方法判断纸是否能够移动。public int getCardValue()方法获得纸牌的内容值。public int getCardType()方法获得纸牌的类型。2.6模块四的详细介绍:Spider.java文件是蜘蛛纸牌游
22、戏的主类文件,其主要功能是生成蜘蛛纸牌游戏的框架,实现游戏中的方法,包括纸牌的随机生成、位置的摆放等。2.6.1主要的类: JFrame类及其子类负责创建的对象称为窗体。JLable类负责创建标签对象。标签用于短文本字符串或图像或二者的显示区。Container类负责创建一个容器对象,此容器可以包含其它组件。PKCard类负责创建纸牌对象。Hashtable类实现一个哈希表,该哈希表将键映射到相应的值。2.6.2主要的变量:public static final int EASY=1;代表“简单”等级。public static finalint NATURAL=2 代表“普通”等级。publ
23、ic static finalint HARD=3 代表“难”等级。private int grade=Spider.EASY设定初始等级为简单等级;private Container pane 变量为Container类创建的面板容器。private PKCard card变量为PKCard类创建的纸牌数组。private JLable clickLable1变量为JLable类创建的右下角发牌区的鼠标点击响应区域。private JLable groudLable变量为JLable类创建的背景框数组。Hshtable table变量为Hashtable类创建的一个哈希表对象,用于存储键值数
24、据对。private int c变量为纸牌的数量。private int n变量为纸牌的等级。private int a变量为纸牌所在的列号。private int finish变量为纸牌从小到大排列成功的次数。2.6.3主要的方法:public void setTittle(String s)设置一个标题为s的窗体。public void setVisible(boolean b)设置框体是可见还是不可见。b取true是为可见。public void setSize(int width,int heigth)创建宽为width,高位heigth大小的窗体。public void setDef
25、aultCloseOperation(int operation)该方法用来设置单机窗体右上角的关闭图标后,程序会做出怎样的处理。operation取EXIT_ON_CLOSE时结束窗体所在的应用程序。public void setMenuBar(MenuBar mb)将此窗体的菜单栏设置为指定的菜单栏。public void pane.setBackground(Color c)设置面板的背景颜色。public void pane.setLayout(布局对象)设置面板的布局。public Container getContentPane()方法可得到窗口的内容面板容器。public voi
26、d setBounds(int a,int b,int weidth, int heigth)设置出现在屏幕中的组件距离屏幕的左面a个像素,距屏幕上面b个像素,组件宽为weidth,高为heigth。public void newGame()方法开始新游戏。public int getC()方法返回纸牌的数量。public void setGrade(int grade)方法设置纸牌游戏的等级。public void initCards()方法进行初始化纸牌public void randomCards()方法令纸牌随机分配。public void setNA()方法设置还原纸牌游戏。publ
27、ic void setCardsLocation()方法设置待展开纸牌级表面初始化纸牌的位置。public void showEnableOperator()方法进行显示是否有可以移动的纸牌。public void deal()方法开始运行游戏。public PKCard getPreviousCard(PKCard card)方法获取当前纸牌上面的那一张纸牌。public PKCard getNextCard(PKCard card)方法获取当前纸牌的下面的那一张纸牌。public Point getLastCardLocation(int n)方法获取第n列纸牌最后一张纸牌的位置。publ
28、ic Point getGroundLabelLocation(int n)方法获取第n列纸牌的背景框架的位置。public void setGroundLabelZOrder()放置groundLable组件。将组件groundLable移动到容器中指定的顺序索引。顺序(105+i)确定了绘制组件的顺序;具有最高顺序的组件将第一个绘制,具有最低顺序的组建将最后一个绘制。在组建重叠的地方,具有较低顺序的组建将覆盖具有较高顺序的组件。public void haveFinish(int column)判断纸牌的摆放是否成功。3设计过程或程序代码3.1需要实现的主要功能:(1)游戏主界面的设计包括
29、背景颜色、框架大小、玩牌区域、发牌区域、回收纸牌的区域组件的设置。(2)点击鼠标、释放鼠标、拖动鼠标时纸牌需要实现的事件处理程序。(3)移动放置一组或者单个纸牌时。需要纸牌按照由小到大的顺序排列,并列类型相同。(4)当某列的纸牌按照从A到K得顺序排列时,程序会自动回收这组纸牌到回收纸牌的区域。(5)当用鼠标单击发牌区域的纸牌时,如果10列纸牌中没有空白列,则顺序把纸牌发到每列纸牌的最下面。否则,弹出有空位不能发牌对话框。(6)当玩家不知道当前游戏如何进行时,可以点击菜单项显示可行的操作提示玩家下一步该移动哪一张纸牌。(7)等级设置,玩家通过单击游戏菜单里相应的等级菜单项来设置游戏的难度等级。游
30、戏的默认等级是简单等级。 3.2功能设计流程图:3.3主要功能的代码实现:3.3.1游戏菜单栏内游戏菜单及帮助菜单功能展示:3.3.2主界面的设计:代码实现如下:public Spider()setTitle(蜘蛛牌); setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE); /设置框架的大小setSize(1024, 742);/生成SpiderMenuBar对象,并放置在框架之上setJMenuBar(new SpiderMenuBar(this); pane = this.getContentPane(); /设置背景颜色p
31、ane.setBackground(new Color(0, 139, 69); /将布局管理器设置成为nullpane.setLayout(null); clickLabel = new JLabel(); clickLabel.setBounds(883, 606, 121, 96);设置发牌区组件的位置 pane.add(clickLabel);clickLabel.addMouseListener(new MouseAdapter() public void mouseReleased(MouseEvent me) if (c 60)Spider.this.deal();this.in
32、itCards(); this.randomCards(); this.setCardsLocation();为纸牌设置位置 groundLabel = new JLabel10;创建背景框组件数组int x = 20; for (int i = 0; i 10; i+) groundLabeli = new JLabel();创建背景框组件 groundLabeli .setBorder(javax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED); groundLabeli.set
33、Bounds(x, 25, 71, 96);设置组件的大小 x += 101; this.pane.add(groundLabeli);向容器添加组件this.setVisible(true); this.deal();运行程序,从发牌去发出一组纸牌3.3.3纸牌的初始化以及发牌操作代码实现如下:public void initCards() /如果纸牌已被赋值,即将其从框架的面板中移去if (cards0 != null) for (int i = 0; i 104; i+) pane.remove(cardsi);int n = 0; /通过难度等级,为n赋值if (this.grade
34、= 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);假设n=1,此时i%n的值为0,则1%n+1的值为1,所以创建的图片应该是1-1到1-13全是黑桃,为同一花色,n等于其它值时类似。如图所示:简单,单一花色:中级,双高级,四花色:/随
35、机纸牌初始化this.randomCards();将纸牌的顺序打乱 *纸牌随机分配public void randomCards() 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 setCardsLocation() table = new Hashtable
36、(); c = 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 5; i-) for (int j = 0; j = 104) continue;值超过104则退出本次循环 pane.add(cardsn);将索引值所指的纸牌添加到面板容器 cardsn.turnRear();将纸牌转到背面去 cardsn.moveto(new Point(x, y);将纸牌移动的固定的位置上去 table.put(ne
37、w Point(x, y), cardsn);将纸牌及其对应的位置存入到哈希表中 x += 101;背景框间隔的X值为101 x = 20;X坐标回到原先的位置处 y -= 5;Y坐标会向下移动5个单位,表示第二行纸牌的初始化开始方法:游戏运行public void deal() this.setNA(); /判断10列中是否空列for (int i = 0; i 10; i+) if (this.getLastCardLocation(i) = null) JOptionPane.showMessageDialog(this, 有空位不能发牌!, 提示, JOptionPane.WARNIN
38、G_MESSAGE); return; int x = 20;for (int i = 0; i 10; i+) Point lastPoint = this.getLastCardLocation(i); /这张牌应“背面向上”if (c = 0) lastPoint.y += 5;当还没有发过牌时,每列的纸牌中y坐标相差5个单位。 /这张牌应“正面向上”else lastPoint.y += 20;否则是两张正面显示纸牌差值table.remove(cardsc + i.getLocation(); cardsc + i.moveto(lastPoint); table.put(new P
39、oint(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.y -= 240; PKCard card = (P
40、KCard) this.table.get(point); if (card != null & card.isCardCanMove() this.haveFinish(n);判断纸牌是否可以回收以及回收的总次数 x += 101; c += 10;3.3.4纸牌的移动以及放置代码实现如下:用鼠标拖动纸牌public void mouseDragged(MouseEvent arg0) if (canMove)int x = 0;int y = 0;Point p = arg0.getPoint();x = p.x - point.x;y = p.y - point.y;this.movin
41、g(x, y);方法:放置纸牌public void setNextCardLocation(Point point)PKCard card = main.getNextCard(this);if (card != null)if (point = null)card.setNextCardLocation(null);main.table.remove(card.getLocation();card.setLocation(card.initPoint);main.table.put(card.initPoint, card);elsepoint = new Point(point);point.y += 20;card.setNextCardLocation(point);point.y -= 20;main.table.remove(card.getLocation();card.setLocation(point);main.ta