1、Java 课程设计报告蜘蛛纸牌课程设计报告蜘蛛纸牌 面向对象程序设计课程设计报告 JAVA程序设计 课程设计 之 蜘蛛纸牌 学院:年级:班级:指导老师:小组成员:时间:课程设计题目 JAVA课程设计蜘蛛纸牌 学院 计算机学院 专业 网络工程 年级 2009 已知参数和设计要求:蜘蛛纸牌的主要功能模块包括:a、游戏界面的布局以及纸牌的设定;b、能够设定不同等级以实现游戏难易度的不同;c、实现游戏主功能;d、实现帮助功能;e、实现退出功能。要求以小组为单位,用 JAVA实现蜘蛛纸牌的主要功能模块;可以根据自己对蜘蛛纸牌游戏的理解,对实现的内容进行扩展最后需要提供的材料包括课程设计报告 1 份,程序
2、拷贝 1 份(包括源代码和可执行程序)。学生应完成的工作:根据 JAVA程序设计的思想和编程技术,设计实现蜘蛛纸牌游戏。上机调试并能正确运行,并提交完整的设计报告和软件程序拷贝。目前资料收集情况(含指定参考资料):Java程序设计,朱庆生,古平等著,清华大学出版社,2011,1 Java编程,王伟平等著,清华大学出版社,2010,5 Java课程设计案例精编黄晓东编著,中国水利水电出版社出版 Java程序设计实用教程张永常主编,电子工业出版社出版 课程设计时间为一周,从 15周星期一开始(2011年 12月 12 日),到 15周星期五结束(2011年 12 月 16日)。课程设计以组为单位进
3、行。每组 34 个人。星期一进行蜘蛛纸牌游戏的内容和规则设计。星期二查找资料解决具体的技术问题。星期三用 JAVA语言实现程序。星期四精星课堂演示程序以及完成课程设计报告。星期五提交程序和课程设计报告。本组由组成 任务下达日期 年 月 日 完成日期 年 月 日 指导教师 (签名)学 生 (签名)第一章第一章 课程设计要求课程设计要求 题目名称:蜘蛛纸牌游戏 题目类型:设计型 课程设计目的:学会综合运用已学的 JAVA知识,用面向对象的技术实现一个小型的应用程序。实验原理:面向对象程序分析与设计、类的灵活运用、继承技术、多态技术、异常处理、GUI程序设计等。实验内容:参照 windows游戏蜘蛛
4、纸牌,自己编写设计实现其功能,它具有如下一些功能:(1)设计一个游戏界面,包括玩牌区、发牌区和回收区。(2)纸牌以及其背景的设定。(3)移动纸牌。使用鼠标将较小的纸牌拖放到较大的纸牌下方,可以拖动一组纸牌,当要求这组纸牌是同一个花色,并且这一组纸牌从上到下是从大到小排列的,且不间断。(4)回收纸牌。当某列出现同一花色,从上到下依次是从 K到 A 的不间组合时,这组纸牌将被回收到回收区中。(5)发牌。用鼠标单击发牌区,若发牌区还有剩余的纸牌,则将发出一叠纸牌共10 张,依次添加到玩牌区的 10 列纸牌最下方,但要求这 10列纸牌没有空白列。(6)若玩家不了解游戏规则可以点击帮助获得游戏方法。(7
5、)级别设定。点击“游戏”菜单中选取游戏难以级别,有 3 种级别,分别对应初级、中级、高级。(8)退出游戏。第二章第二章 设计概要设计概要 2.1 功能设计功能设计 编写程序以实现游戏蜘蛛纸牌的功能。1、设计游戏界面。2、纸牌以及其背景的设定。3、移动纸牌。4、回收纸牌。5、发牌。6、若玩家不了解游戏规则可以点击帮助获得游戏方法。7、级别设定。8、退出游戏。2.2 程序流程程序流程 2.3 功能分析功能分析 1.主要界面:主要界面:以下是主菜单界面的主要代码:JMenu jNewGame=new JMenu(游戏);JMenu jHelp=new JMenu(帮助);JMenuItem jIte
6、mAbout=new JMenuItem(关于);JMenuItem jItemOpen=new JMenuItem(开始新游戏);JMenuItem jItemDeal=new JMenuItem(发牌);JMenuItem jItemExit=new JMenuItem(退出);JRadioButtonMenuItem jRMItemEasy=new JRadioButtonMenuItem(初级:单花色);/菜单中的可选项按钮 JRadioButtonMenuItem jRMItemNormal=new JRadioButtonMenuItem(中级:双花色);JRadioButtonM
7、enuItem jRMItemHard=new JRadioButtonMenuItem(高级:四花色);public SpiderMenuBar(Spider spider)this.main=spider;jNewGame.add(jItemOpen);jNewGame.add(jItemDeal);jNewGame.addSeparator();/添加划分线 jNewGame.add(jRMItemEasy);jNewGame.add(jRMItemNormal);jNewGame.add(jRMItemHard);jNewGame.addSeparator();jNewGame.add
8、(jItemExit);ButtonGroup group=new ButtonGroup();/(用来获取 JRadioButtonMenuItem 的值)group.add(jRMItemEasy);group.add(jRMItemNormal);group.add(jRMItemHard);jHelp.add(jItemAbout);this.add(jNewGame);this.add(jHelp);/添加到菜单栏 以下是游戏窗口界面初始化的主要代码:pane=this.getContentPane();/获得容器 pane.setBackground(new Color(0,112
9、,26);/设置背景颜色 clickLabel=new JLabel();/发牌区的鼠标点击响应区域 clickLabel.setBounds(890,580,110,96);/设置响应区域大小与坐标 clickLabel.setBorder(javax.swing.BorderFactory .createEtchedBorder(javax.swing.border.EtchedBorder.RAISED);pane.add(clickLabel);/将响应区域添加到容器中 this.initCards();/纸牌初始化 this.randomCards();/随机分配纸牌 this.se
10、tCardsLocation();/为纸牌设置坐标位置 this.deal();/从右下角发出一叠纸牌。游戏刚开始时,需要先发出一叠纸牌。groundLabel=new JLabel10;/创建背景框数组,一共有 10 个背景框。int x=20;/背景框的 x 坐标,10个背景框是并排放置的,y坐标相等。第一个背景框的 x 坐标为 20。for(int i=0;i 10;i+)/循环创建背景框,并设置其坐标大小等属性 groundLabeli=new JLabel();/创建背景框 groundLabeli .setBorder(javax.swing.BorderFactory .crea
11、teEtchedBorder(javax.swing.border.EtchedBorder.RAISED);/为 Label 设置边框 /,/形成背景框 groundLabeli.setBounds(x,25,71,96);/设置背景框的大小与坐标 x+=101;/相邻的背景框的 x 坐标差值为 101。this.pane.add(groundLabeli);/将背景框添加到容器中 this.setVisible(true);/显示窗口 2 初始化纸牌及发牌操作:初始化纸牌及发牌操作:初始化纸牌的主要代码(包括所有纸牌生成及存入数组,右下角发牌区纸牌初始化以及表面显示纸牌初始化):所有纸牌的
12、生成及存入数组代码:public void initCards()/如果纸牌已被赋值,即将其从框架的面板中移去 if(cards0!=null)for(int i=0;i 104;i+)pane.remove(cardsi);int n=0;/通过难度等级,为 n赋值 if(this.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
13、,this);/当 n为 1 时,i%8的值永远是 0,所以 i%8+1的值永远是 1,因此 n为 1时,创建的 card的名称是 1 /-1 到 1-13,全是黑桃。其他等级类似。/纸牌随机分配 public void randomCards()/将纸牌的顺序打乱,否则牌号的将是从 A到 K的出现规律 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;右下
14、角发牌区纸牌的初始化代码:int x=883;/将坐标定位到右下角发牌区 int y=580;for(int i=0;i 6;i+)/初始化右下角发牌区的纸牌,共 6 叠 for(int j=0;j 5;i-)/初始化玩牌区的纸牌,共 5行 for(int j=0;j=104)/如果索引值超出数组下标 continue;/退出本次循环,执行外层循环 pane.add(cardsn);/将索引处的纸牌添加到容器中 cardsn.turnRear();/将纸牌转向背面 cardsn.moveto(new Point(x,y);/将纸牌放在固定的位置上 map.put(new Point(x,y),
15、cardsn);/将纸牌及其坐标值存入 map中 x+=101;/每两列之间的 x 坐标相距 101 个像素 x=20;/x 坐标回到起点位置 y-=5;/主坐标向上移 5 个像素 发牌操作功能代码:public void deal()/发牌,指从右下角的发牌区发牌 this.setNA();/判断 10列中是否有空列 for(int i=0;i 10;i+)if(this.getLastCardLocation(i)=null)JOptionPane.showMessageDialog(this,有空位不能发牌!,提示,JOptionPane.WARNING_MESSAGE);return;
16、int x=20;for(int i=0;i 10;i+)Point lastPoint=this.getLastCardLocation(i);/这张牌应“背面向上”if(c=0)/当还没有发过牌时,玩牌区的纸牌列中,每两张纸牌之间的 y坐标值相差 5,/指的是背面牌与背面牌之间以及背面牌与第一张正面牌之间的 y距离 lastPoint.y+=5;/这张牌应“正面向上”else/两张正面牌之间的 y距离 lastPoint.y+=20;map.remove(cardsc+i.getLocation();cardsc+i.moveto(lastPoint);map.put(new Point(
17、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.getValue()=1)int n=cardsc+i.whichColumnAvailable(point);point.y-=240;PKCard card=(PKCard)this.map.get(point);if(card!=null&
18、card.isCanMove()this.haveFinish(n);x+=101;c+=10;3 纸牌移动放置操作:纸牌移动放置操作:/用鼠标拖动纸牌 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.moving(x,y);/*方法:放置纸牌 */public void setNextCardLocation(Point point)PKCard card=main.getNextCard(t
19、his);if(card!=null)if(point=null)card.setNextCardLocation(null);main.map.remove(card.getLocation();/先从 HashMap中删除 card card.setLocation(card.initPoint);/为 card设置新的坐标 main.map.put(card.initPoint,card);/再将 card 添加到 HashMap中 else point=new Point(point);point.y+=20;card.setNextCardLocation(point);point.
20、y-=20;main.map.remove(card.getLocation();card.setLocation(point);main.map.put(card.getLocation(),card);card.initPoint=card.getLocation();4.回收纸牌操作:回收纸牌操作:回收纸牌及过关判定功能主要代码:public void haveFinish(int column)Point point=this.getLastCardLocation(column);PKCard card=(PKCard)this.map.get(point);do this.map.
21、remove(point);card.moveto(new Point(20+finish*10,580);/将组件移动到容器中指定的顺序索引。pane.setComponentZOrder(card,1);/将纸牌新的相关信息存入 HashMap this.map.put(card.getLocation(),card);card.setCanMove(false);point=this.getLastCardLocation(column);if(point=null)card=null;else card=this.map.get(point);while(card!=null&card
22、.isCanMove();finish+;/如果 8付牌全部组合成功,则显示成功的对话框 if(finish=8)JOptionPane.showMessageDialog(this,恭喜你,顺利通过!,成功,JOptionPane.PLAIN_MESSAGE);if(card!=null)card.turnFront();card.setCanMove(true);5.帮助菜单功能的实现:帮助菜单功能的实现:主要代码如下:public class AboutDialog extends JDialog JPanel jMainPanel=new JPanel();JTabbedPane jT
23、abbedPane=new JTabbedPane();private JPanel jPanel1=new JPanel();private JTextArea jt1=new JTextArea(将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。);public AboutDialog()setTitle(蜘蛛牌);setSize(300,200);setResizable(false);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);Container c=this.getContentPa
24、ne();jt1.setSize(260,200);jt1.setEditable(false);jt1.setLineWrap(true);jt1.setFont(new Font(楷体,java.awt.Font.BOLD,13);jt1.setForeground(Color.BLUE);jPanel1.add(jt1);jTabbedPane.setSize(300,200);jTabbedPane.addTab(游戏规则,null,jPanel1,null);jMainPanel.add(jTabbedPane);c.add(jMainPanel);pack();this.setVi
25、sible(true);6.退出功能的实现:退出功能的实现:主要代码如下:/“退出”jItemExit.addActionListener(new ActionListener()public void actionPerformed(ActionEvent e)main.dispose();System.exit(0););第第 3 章章 调试分析与测试结果调试分析与测试结果 通过对游戏的运行,包括移牌、发牌、开始游戏、选择等级等等。未发现明显异常现象。在这里:我们将测试的结果图片贴在了下面:进入游戏主界面:游戏菜单:打开帮助菜单:拖动纸牌:发牌以及收牌:完成游戏:选择难度(高级):有空位不
26、能发牌:第第 4 章章 设计总结设计总结 通过这次 JAVA课程设计实验,我发现 java作为一种面向对象的编程语言,具有可移植性高,安全,可靠等优点,最初设计时就是本着一次编写到处执行设计的。可以开发各种应用程序和游戏。在实验中开始我们遇到了很多问题,但小组成员一起努力查找资料,一起讨论提出各自的想法,最终把问题很好的解决掉了.这也让我们知道了团队在计算机编程小组中的重要性.它提醒着我们无论在生活中还是在以后的工作中都要记住团队的重要性。第第 5 章章 参考文献参考文献 Java程序设计,朱庆生,古平等著,清华大学出版社,2011,1 Java编程,王伟平等著,清华大学出版社,2010,5 Java课程设计案例精编黄晓东编著,中国水利水电出版社出版 Java程序设计实用教程张永常主编,电子工业出版社出版
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1