Java课程设计——蜘蛛纸牌游戏.doc
《Java课程设计——蜘蛛纸牌游戏.doc》由会员分享,可在线阅读,更多相关《Java课程设计——蜘蛛纸牌游戏.doc(34页珍藏版)》请在三一办公上搜索。
1、Java课程设计蜘蛛纸牌游戏(陈浩 数学与应用数学专业091班)摘要本游戏通过java语言编写,实现了游戏的难度选择、开局、重新发牌以及可视化的相关操作界面。并通过设计鼠标事件,引入线程,构建游戏程序框架完成了对该游戏的难度选择、开局、发牌、显示可执行操作的各个基本功能。关键词蜘蛛纸牌 java语言 操作界面 1. 问题重述该游戏通过鼠标操作,将电脑多次分发的纸牌,按照相同的花色由大到小排列起来,直到桌面上的纸牌全都消失,即为胜利。包括如下功能:a.难度选择:包括简单(单色)、中级(双色)、高级(四色)。b.开局:任何时候可以重新开始一盘新的游戏。c.发牌。d.显示可行操作:提示当前可行操作。
2、e.简单的帮助文档:对软件的简单介绍和编制说明。2.理论分析 参照windows游戏蜘蛛纸牌,自己编写设计实现其功能,它具有如下一些功能: a.设计一个游戏界面,包括玩牌区、发牌区和回收区。 b.纸牌以及其背景的设定。 C.移动纸牌。使用鼠标将较小的纸牌拖放到较大的纸牌下方,可以拖动一组纸牌,当要求这组纸牌是同一个花色,并且这一组纸牌从上到下是从大到小排列的,且不间断。 d.回收纸牌。当某列出现同一花色,从上到下依次是从K到A的不间组合时,这组纸牌将被回收到回收区中。 e.发牌。用鼠标单击发牌区,若发牌区还有剩余的纸牌,则将发出一叠纸牌共10张,依次添加到玩牌区的10列纸牌最下方,但要求这10
3、列纸牌没有空白列。 f.若玩家不了解游戏规则可以点击帮助获得游戏方法。 g.级别设定。点击“游戏”菜单中选取游戏难以级别,有3种级别,分别对应初级、中级、高级。 h.退出游戏。3.模型该游戏可分为以下各项功能: a.Spider.java 用于实现纸牌初始化、设置游戏等级以及异常处理。 b.PKCard.java用于定义纸牌的显示的各种属性以及鼠标事件的相应属性。c.SpiderMenu.java用于添加游戏下拉菜单的各个选项,包含图形用户界面的构建,组件监听的实现,以及显示可执行操作的线程。d.SpiderMenu.class生成Spider.class,AboutDialog.class和
4、PKCard.class4.程序流程图5.程序设计技术文档编写程序以实现游戏蜘蛛纸牌的功能。1、设计游戏界面。2、纸牌以及其背景的设定。3、移动纸牌。4、回收纸牌。5、发牌。6、若玩家不了解游戏规则可以点击帮助获得游戏方法。7、级别设定。8、退出游戏。该游戏的开发及相关功能的实现需要在Eclipse下建立java project,同时编写Spider.java、PKCard.java、SpiderMenu.java、AboutDialog.class,另外将纸牌的图片文件保存在images文件夹中。6.程序使用说明6.1 主要界面:以下是主菜单界面的主要代码:JMenu jNewGame =
5、new JMenu(游戏);JMenu jHelp = new JMenu(帮助);JMenuItem jItemAbout = new JMenuItem(关于);JMenuItem jItemOpen = new JMenuItem(开始新游戏);JMenuItem jItemDeal = new JMenuItem(发牌);JMenuItem jItemExit = new JMenuItem(退出);JRadioButtonMenuItem jRMItemEasy = new JRadioButtonMenuItem(初级:单花色);/菜单中的可选项按钮JRadioButtonMenu
6、Item jRMItemNormal = new JRadioButtonMenuItem(中级:双花色);JRadioButtonMenuItem jRMItemHard = new JRadioButtonMenuItem(高级:四花色);public SpiderMenuBar(Spider spider) this.main = spider;jNewGame.add(jItemOpen);jNewGame.add(jItemDeal);jNewGame.addSeparator();/添加划分线jNewGame.add(jRMItemEasy);jNewGame.add(jRMIte
7、mNormal);jNewGame.add(jRMItemHard);jNewGame.addSeparator();jNewGame.add(jItemExit);ButtonGroup group = new ButtonGroup();/(用来获取JRadioButtonMenuItem 的值)group.add(jRMItemEasy);group.add(jRMItemNormal);group.add(jRMItemHard);jHelp.add(jItemAbout);this.add(jNewGame);this.add(jHelp);/添加到菜单栏以下是游戏窗口界面初始化的主
8、要代码:pane = this.getContentPane(); / 获得容器pane.setBackground(new Color(0, 112, 26);/ 设置背景颜色clickLabel = new JLabel(); / 发牌区的鼠标点击响应区域clickLabel.setBounds(890, 580, 110, 96); / 设置响应区域大小与坐标clickLabel.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED);pane.add(c
9、lickLabel); / 将响应区域添加到容器中this.initCards();/ 纸牌初始化this.randomCards();/ 随机分配纸牌this.setCardsLocation();/ 为纸牌设置坐标位置this.deal(); / 从右下角发出一叠纸牌。游戏刚开始时,需要先发出一叠纸牌。groundLabel = new JLabel10;/ 创建背景框数组,一共有10个背景框。int x = 20;/ 背景框的x坐标,10个背景框是并排放置的,y坐标相等。第一个背景框的x坐标为20。for (int i = 0; i 10; i+) / 循环创建背景框,并设置其坐标大小等
10、属性groundLabeli = new JLabel();/ 创建背景框groundLabeli.setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED);/ 为Label设置边框/ ,/ 形成背景框groundLabeli.setBounds(x, 25, 71, 96);/ 设置背景框的大小与坐标x += 101; / 相邻的背景框的x坐标差值为101。this.pane.add(groundLabeli);/ 将背景框添加到容器中this.setVisib
11、le(true);/ 显示窗口6.2初始化纸牌及发牌操作: 初始化纸牌的主要代码(包括所有纸牌生成及存入数组,右下角发牌区纸牌初始化以及表面显示纸牌初始化): 所有纸牌的生成及存入数组代码: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.NA
12、TURAL) 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%8的值永远是0,所以i%8+1的值永远是1,因此n为1时,创建的card的名称是1/ -1到1-13,全是黑桃。其他等级类似。 /纸牌随机分配public void randomCards() / 将纸牌的顺序打乱,否则牌号的将是从A到K的出现规律PKCard temp =
13、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;右下角发牌区纸牌的初始化代码:int x = 883;/ 将坐标定位到右下角发牌区int y = 580;for (int i = 0; i 6; i+) / 初始化右下角发牌区的纸牌,共6叠for (int j = 0; j 5; i-) / 初始化玩牌区的纸牌,共5行for (int
14、j = 0; j = 104) / 如果索引值超出数组下标continue; / 退出本次循环,执行外层循环pane.add(cardsn); / 将索引处的纸牌添加到容器中cardsn.turnRear(); / 将纸牌转向背面cardsn.moveto(new Point(x, y); / 将纸牌放在固定的位置上map.put(new Point(x, y), cardsn); / 将纸牌及其坐标值存入map中x += 101; / 每两列之间的x坐标相距101个像素x = 20; / x坐标回到起点位置y -= 5; / 主坐标向上移5个像素发牌操作功能代码:public void de
15、al() / 发牌,指从右下角的发牌区发牌this.setNA();/ 判断10列中是否有空列for (int i = 0; i 10; i+) if (this.getLastCardLocation(i) = null) JOptionPane.showMessageDialog(this, 有空位不能发牌!, 提示,JOptionPane.WARNING_MESSAGE);return;int x = 20;for (int i = 0; i 10; i+) Point lastPoint = this.getLastCardLocation(i);/ 这张牌应“背面向上”if (c =
16、 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(lastPoint), cardsc + i);cardsc + i.turnFront();cardsc + i.setCanMove(true);/ 将组件
17、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 & card.isCanMove() this.haveFinish(n);x += 101;c +
18、= 10;6.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(this);if (card != null) if (
19、point = null) card.setNextCardLocation(null);main.map.remove(card.getLocation();/ 先从HashMap中删除cardcard.setLocation(card.initPoint); / 为card设置新的坐标main.map.put(card.initPoint, card); / 再将card添加到HashMap中 else point = new Point(point);point.y += 20;card.setNextCardLocation(point);point.y -= 20;main.map.
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Java 课程设计 蜘蛛 纸牌 游戏

链接地址:https://www.31ppt.com/p-2387026.html