版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
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 j
6、rmitemeasy = new jradiobuttonmenuitem("初级:单花色");/菜单中的可选项按钮jradiobuttonmenuitem jrmitemnormal = new jradiobuttonmenuitem("中级:双花色");jradiobuttonmenuitem jrmitemhard = new jradiobuttonmenuitem("高级:四花色");public spidermenubar(spider spider) this.main = spider;jnewgame.add(ji
7、temopen);jnewgame.add(jitemdeal);jnewgame.addseparator();/添加划分线jnewgame.add(jrmitemeasy);jnewgame.add(jrmitemnormal);jnewgame.add(jrmitemhard);jnewgame.addseparator();jnewgame.add(jitemexit);buttongroup group = new buttongroup();/(用来获取jradiobuttonmenuitem 的值)group.add(jrmitemeasy);group.add(jrmitemn
8、ormal);group.add(jrmitemhard);jhelp.add(jitemabout);this.add(jnewgame);this.add(jhelp);/添加到菜单栏以下是游戏窗口界面初始化的主要代码:pane = this.getcontentpane(); / 获得容器pane.setbackground(new color(0, 112, 26);/ 设置背景颜色clicklabel = new jlabel(); / 发牌区的鼠标点击响应区域clicklabel.setbounds(890, 580, 110, 96); / 设置响应区域大小与坐标clicklab
9、el.setborder(javax.swing.borderfactory.createetchedborder(javax.swing.border.etchedborder.raised);pane.add(clicklabel); / 将响应区域添加到容器中this.initcards();/ 纸牌初始化this.randomcards();/ 随机分配纸牌this.setcardslocation();/ 为纸牌设置坐标位置this.deal(); / 从右下角发出一叠纸牌。游戏刚开始时,需要先发出一叠纸牌。groundlabel = new jlabel10;/ 创建背景框数组,一
10、共有10个背景框。int x = 20;/ 背景框的x坐标,10个背景框是并排放置的,y坐标相等。第一个背景框的x坐标为20。for (int i = 0; i < 10; i+) / 循环创建背景框,并设置其坐标大小等属性groundlabeli = new jlabel();/ 创建背景框groundlabeli.setborder(javax.swing.borderfactory.createetchedborder(javax.swing.border.etchedborder.raised);/ 为label设置边框/ ,/ 形成背景框groundlabeli.setboun
11、ds(x, 25, 71, 96);/ 设置背景框的大小与坐标x += 101; / 相邻的背景框的x坐标差值为101。this.pane.add(groundlabeli);/ 将背景框添加到容器中this.setvisible(true);/ 显示窗口6.2初始化纸牌及发牌操作: 初始化纸牌的主要代码(包括所有纸牌生成及存入数组,右下角发牌区纸牌初始化以及表面显示纸牌初始化): 所有纸牌的生成及存入数组代码:public void initcards() / 如果纸牌已被赋值,即将其从框架的面板中移去if (cards0 != null) for (int i = 0; i < 10
12、4; 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,this);/当n为1时,i%
13、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 < 10; j+) int n = i * 10 + j;pane.add(cardsn);/ 将card转向背面cardsn.turnrear();/ 将card放在固定的位置上cardsn.moveto(new point(x, y);/ 将card的位置及相关信息存入map.put(new point(x, y), cardsn);x += 10; /
15、 共6叠纸牌,最上面一叠纸牌的x坐标为883,再往下,x依次增加10表面显示纸牌初始化:x = 20;/ 将坐标定位到上方玩牌区的左边起点,也就是第一个背景框的坐标位置y = 45;/* 初始化表面显示的纸牌 */for (int i = 10; i > 5; i-) / 初始化玩牌区的纸牌,共5行for (int j = 0; j < 10; j+) / 共10列int n = i * 10 + j; / 生成索引值if (n >= 104) / 如果索引值超出数组下标continue; / 退出本次循环,执行外层循环pane.add(cardsn); / 将索引处的纸牌添
16、加到容器中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 deal() / 发牌,指从右下角的发牌区发牌this.setna();/ 判断10列中是否有空列for (int i = 0; i < 10; i+) if (
17、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 = 0) / 当还没有发过牌时,玩牌区的纸牌列中,每两张纸牌之间的y坐标值相差5,/ 指的是背面牌
18、与背面牌之间以及背面牌与第一张正面牌之间的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);/ 将组件card移动到容器中指定的顺序索引。this.pane.setcomponentzorder(c
19、ardsc + 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 += 10;6.3纸牌移动放置操作: /用鼠标拖动纸牌public void m
20、ousedragged(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 (point = null) card.setnextcardlocation(
21、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.remove(card.getlocation();card.setlocat
22、ion(point);main.map.put(card.getlocation(), card);card.initpoint = card.getlocation();6.4回收纸牌操作:回收纸牌及过关判定功能主要代码:public void havefinish(int column) point point = this.getlastcardlocation(column);pkcard card = (pkcard) this.map.get(point);do this.map.remove(point);card.moveto(new point(20 + finish * 1
23、0, 580);/ 将组件移动到容器中指定的顺序索引。pane.setcomponentzorder(card, 1);/ 将纸牌新的相关信息存入hashmapthis.map.put(card.getlocation(), card);card.setcanmove(false);point = this.getlastcardlocation(column);if (point = null)card = null;elsecard = this.map.get(point); while (card != null && card.iscanmove();finish+;
24、/ 如果8付牌全部组合成功,则显示成功的对话框if (finish = 8) joptionpane.showmessagedialog(this, "恭喜你,顺利通过!", "成功",joptionpane.plain_message);if (card != null) card.turnfront();card.setcanmove(true);6.5帮助菜单功能的实现:主要代码如下:public class aboutdialog extends jdialog jpanel jmainpanel = new jpanel();jtabbedpa
25、ne jtabbedpane = new jtabbedpane();private jpanel jpanel1 = new jpanel();private jtextarea jt1 = new jtextarea("将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。");public aboutdialog() settitle("蜘蛛牌");setsize(300, 200);setresizable(false);setdefaultcloseoperation(windowconstants.dispose_on
26、_close);container c = this.getcontentpane();jt1.setsize(260, 200);jt1.seteditable(false);jt1.setlinewrap(true);jt1.setfont(new font("楷体_gb2312", java.awt.font.bold, 13);jt1.setforeground(color.blue);jpanel1.add(jt1);jtabbedpane.setsize(300, 200);jtabbedpane.addtab("游戏规则", null, j
27、panel1, null);jmainpanel.add(jtabbedpane);c.add(jmainpanel);pack();this.setvisible(true);6.6退出功能的实现:主要代码如下:/ “退出”jitemexit.addactionlistener(new actionlistener() public void actionperformed(actionevent e) main.dispose();system.exit(0););7.调试验证运行情况 通过对游戏的运行,包括移牌、发牌、开始游戏、选择等级等等。未发现明显异常现象。在这里:我们将测试的结果图
28、片贴在了下面:进入游戏主界面:游戏菜单: 打开帮助菜单: 拖动纸牌:发牌以及收牌:完成游戏:选择难度(高级):有空位不能发牌:8.设计总结通过这次java课程设计实验,让我对java程序设计语言有了更进一步的认识,同时让我对这门程序设计语言有了浓厚的兴趣。在这次java的编程的实践过程中让我进一步体会到了面向对象编程思想在解决实际问题中的应用,让我受益匪浅。同时在这次课程设计实验中,遇到了不少技术难题,例如引入线程以及对鼠标操作事件的控制。但最终通过询问别人和查阅各种资料把这些问题都一一解决了。希望自己今后能在进一步学习计算机编程语言,为以后就业打下坚实的基础。参考文献java程序设计,朱庆生
29、,古平等著,清华大学出版社,2011,1java编程,王伟平等著,清华大学出版社,2010,5java课程设计案例精编黄晓东编著,中国水利水电出版社出版java程序设计实用教程张永常主编,电子工业出版社出版附录(程序部分代码):import javax.swing.*;import java.awt.*;/* *“关于”窗口*/public class aboutdialog extends jdialogjpanel jmainpane = new jpanel();jtabbedpane jtabbedpane = new jtabbedpane();private jpanel jpan
30、el1 = new jpanel();private jpanel jpanel2 = new jpanel();private jtextarea jt1 = new jtextarea("将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。"); private jtextarea jt2 = new jtextarea("该游戏中,纸牌的图片来自于windows xp的纸牌游戏,图片权属于原作者所有!"); /*构造函数*/public aboutdialog()settitle("蜘蛛牌");sets
31、ize(300,200);setresizable(false);setdefaultcloseoperation (windowconstants.dispose_on_close); container c = this.getcontentpane();jt1.setsize(260,200);jt2.setsize(260,200);jt1.seteditable(false);jt2.seteditable(false);jt1.setlinewrap(true); jt2.setlinewrap(true); jt1.setfont(new font("楷体_gb2312
32、", java.awt.font.bold, 13);jt1.setforeground(color.blue);jt2.setfont(new font("楷体_gb2312", java.awt.font.bold, 13);jt2.setforeground(color.black);jpanel1.add(jt1);jpanel2.add(jt2);jtabbedpane.setsize(300,200);jtabbedpane.addtab("游戏规则", null, jpanel1, null);jtabbedpane.addtab
33、("声明", null, jpanel2, null);jmainpane.add(jtabbedpane);c.add(jmainpane);pack();this.setvisible(true); import java.awt.*;import java.awt.event.*;import javax.swing.*;public class pkcard extends jlabel implements mouselistener, mousemotionlistener /纸牌的位置point point = null; point initpoint =
34、null;int value = 0; int type = 0;string name = null; container pane = null;spider main = null;boolean canmove = false; boolean isfront = false; pkcard previouscard = null; public void mouseclicked(mouseevent arg0) public void flashcard(pkcard card)/启动flash线程new flash(card).start();/不停的获得下一张牌,直到完成if(
35、main.getnextcard(card) != null)card.flashcard(main.getnextcard(card); class flash extends threadprivate pkcard card = null;public flash(pkcard card)this.card = card;/*线程的run()方法*为纸牌的正面设置白色图片*/public void run()boolean is = false;imageicon icon = new imageicon("images/white.gif");for (int i
36、= 0; i < 4; i+)trythread.sleep(200);catch (interruptedexception e)e.printstacktrace();if (is)this.card.turnfront();is = !is;elsethis.card.seticon(icon);is = !is;/ 根据当前外观将card的ui属性重置card.updateui(); /*点击鼠标*/public void mousepressed(mouseevent mp) point = mp.getpoint(); main.setna(); this.previousc
37、ard = main.getpreviouscard(this); /*释放鼠标*/public void mousereleased(mouseevent mr)point point = (jlabel) mr.getsource().getlocation();/判断可行列int n = this.whichcolumnavailable(point);if (n = -1 | n = this.whichcolumnavailable(this.initpoint)this.setnextcardlocation(null);main.table.remove(this.getloca
38、tion();this.setlocation(this.initpoint);main.table.put(this.initpoint, this);return;point = main.getlastcardlocation(n);boolean isempty = false;pkcard card = null;if (point = null)point = main.getgroundlabellocation(n);isempty = true;elsecard = (pkcard) main.table.get(point);if (isempty | (this.valu
39、e + 1 = card.getcardvalue()point.y += 40;if (isempty) point.y -= 20;this.setnextcardlocation(point);main.table.remove(this.getlocation();point.y -= 20;this.setlocation(point);main.table.put(point, this);this.initpoint = point;if (this.previouscard != null)this.previouscard.turnfront();this.previousc
40、ard.setcanmove(true);this.setcanmove(true);elsethis.setnextcardlocation(null);main.table.remove(this.getlocation();this.setlocation(this.initpoint);main.table.put(this.initpoint, this);return; point = main.getlastcardlocation(n); card = (pkcard) main.table.get(point); if (card.getcardvalue() = 1)poi
41、nt.y -= 240;card = (pkcard) main.table.get(point);if (card != null && card.iscardcanmove()main.havefinish(n);/*方法:放置纸牌*/public void setnextcardlocation(point point)pkcard card = main.getnextcard(this);if (card != null)if (point = null)card.setnextcardlocation(null);main.table.remove(card.get
42、location();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.table.put(card.getlocation(), card);card.initpoint = card.getloc
43、ation(); /*返回值:int*方法:判断可用列*/public int whichcolumnavailable(point point)int x = point.x;int y = point.y;int a = (x - 20) / 101;int b = (x - 20) % 101;if (a != 9)if (b > 30 && b <= 71)a = -1;else if (b > 71)a+;else if (b > 71)a = -1;if (a != -1)point p = main.getlastcardlocation(
44、a);if (p = null) p = main.getgroundlabellocation(a);b = y - p.y;if (b <= -96 | b >= 96)a = -1;return a; public void mouseentered(mouseevent arg0) public void mouseexited(mouseevent arg0) /* *用鼠标拖动纸牌*/public void mousedragged(mouseevent arg0) if (canmove)int x = 0;int y = 0;point p = arg0.getpo
45、int();x = p.x - point.x;y = p.y - point.y;this.moving(x, y);public void moving(int x, int y) pkcard card = main.getnextcard(this); point p = this.getlocation(); /将组件移动到容器中指定的顺序索引。 pane.setcomponentzorder(this, 1); /在hashtable中保存新的节点信息main.table.remove(p); p.x += x; p.y += y; this.setlocation(p); mai
46、n.table.put(p, this); if (card != null) card.moving(x, y); public void mousemoved(mouseevent arg0) public pkcard(string name, spider spider) super(); this.type = new integer(name.substring(0, 1).intvalue(); this.value = new integer(name.substring(2).intvalue(); = name; this.main = spider;
47、this.pane = this.main.getcontentpane(); this.addmouselistener(this); this.addmousemotionlistener(this); this.seticon(new imageicon("images/rear.gif"); this.setsize(71, 96); this.setvisible(true); public void turnfront() this.seticon(new imageicon("images/" + name + ".gif&quo
48、t;); this.isfront = true; public void turnrear() this.seticon(new imageicon("images/rear.gif"); this.isfront = false; this.canmove = false; public void moveto(point point) this.setlocation(point); this.initpoint = point; public void setcanmove(boolean can) this.canmove = can; pkcard card =
49、 main.getpreviouscard(this); if (card != null && card.iscardfront() if (!can) if (!card.iscardcanmove() return; elsecard.setcanmove(can); else if (this.value + 1 = card.getcardvalue() && this.type = card.getcardtype()card.setcanmove(can);elsecard.setcanmove(false); public boolean iscardfront() retur
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2024年装修工程合同协议书模板
- 2025年度物流包装材料供应合同范本3篇
- 2024年股东股权协议书:携手共进共铸辉煌
- 2024年餐饮业务合作伙伴加盟合同样本版B版
- 2024年版融资租赁合同详案解析版
- 2024虾池承包养殖与水产养殖废弃物资源化利用合同3篇
- 2024年车展志愿者服务协议
- 2024年货物存储点保管合同
- 2024年顶级高额担保协议模板版B版
- 2024年高速公路停车场安全管理服务协议3篇
- (全)2023电气工程师内部考试习题含答案(继保)
- 辣椒栽培技术
- 纪检监察知识题库-案例分析(20题)
- 2023年中考语文备考之名著阅读《经典常谈》思维导图合集
- 《笨狼的故事》读书会读书分享PPT课件(带内容)
- 就这样当班主任读书分享
- 某kv送电线路铁塔组立监理细则
- 武艳艳数学思政课教学设计《式与方程的整理复习》
- 气柜安装工程施工方案
- GB/T 31989-2015高压电力用户用电安全
- GB/T 28750-2012节能量测量和验证技术通则
评论
0/150
提交评论