java课程设计蜘蛛纸牌李娜

java课程设计蜘蛛纸牌李娜

ID:19780345

大小:745.66 KB

页数:34页

时间:2018-10-06

上传者:jjuclb
java课程设计蜘蛛纸牌李娜_第1页
java课程设计蜘蛛纸牌李娜_第2页
java课程设计蜘蛛纸牌李娜_第3页
java课程设计蜘蛛纸牌李娜_第4页
java课程设计蜘蛛纸牌李娜_第5页
资源描述:

《java课程设计蜘蛛纸牌李娜》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

Java课程设计——蜘蛛纸牌游戏1引言1.1背景相信很多人都玩过蜘蛛纸牌这款休闲游戏,现在随着生活水平的提高,人们拥有充分的时间来享受休闲游戏带来的快乐,越来越多的人亲睐蜘蛛纸牌游戏。谈起这款游戏,大家并不陌生。从WINDOWS2000系统开始,就嵌入了蜘蛛纸牌游戏,可是随着微软系统的不段升级,蜘蛛纸牌游戏的功能业变得越来越强大,游戏的界面也更加美观。用户的体验感受也更加美好。所以,蜘蛛纸牌游戏的开发对于人类的生活娱乐更加有意义。本游戏通过java语言编写,实现了游戏的难度选择、开局、重新发牌以及可视化的相关操作界面。并通过设计鼠标事件,引入线程,构建游戏程序框架完成了对该游戏的难度选择、开局、发牌、显示可执行操作的各个基本功能。1.2目标该游戏通过鼠标操作,将电脑多次分发的纸牌,按照相同的花色由大到小排列起来,直到桌面上的纸牌全都消失,即为胜利。包括如下功能:(a)难度选择:包括简单(单色)、中级(双色)、高级(四色)。(b)开局:任何时候可以重新开始一盘新的游戏。(c)发牌。(d)显示可行操作:提示当前可行操作。(e)简单的帮助文档:对软件的简单介绍和编制说明。2开发工具介绍2.1java语言概述java是由Sun Microsystems公司于1995年5月推出的java程序设计语言和java平台的总称。用java实现的浏览器显示它的魅力:跨平台的特点使得它越来越受到许多程序员的亲睐。java除了可以开发动态的Web页还可以开发各种系统软件。  java平台由java虚拟机和各种java应用编程接口(简称API)构成。java应用编程接口为java提供了一个独立于操作系统的标准接口,可分为基本部分和扩展部分。在操作系统上安装一个java平台就可以运行任何一个java程序啦。现在java平台已经几乎嵌入到所有的操作系统中。这样java程序就可以只编译一次,就可以在各种系统当中运行。2.2java语言的特点java语言是一种简单的、面向对象的、分布式的、健壮的、安全的、与平台无关的、多线程、高性能的、动态程序设计语言。  java语言简单易学的。java语言的语法与C语言和C++语言很接近,使得多数程序员很容易学习和使用java。另一方面,java丢弃了C++中很少使用的,很难理解的、令人迷惑的那些特性,如操作符重载、多继承、自动的强制类型转换。特别地。java语言不使用指针,并提供了自动的废料收集,使得程序员不必为内存管理而担忧。 平台无关性。平台无关性是指Java能运行于不同的平台。Java引进虚拟机 原理,并运行于虚拟机,实现不同平台的Java接口之间。使用Java编写的程序能在世界范围内共享。Java的数据类型与 机器无关,Java虚拟机(Java Virtual Machine)是建立在硬件和操作系统之上,实现Java二进制代码的解释执行功能, 提供于不同平台的接口的。     安全性。Java的编程类似C++,学习过C++的读者将很快掌握Java的精髓。Java舍弃了C++的指针对存储器地址的直接操作,程序运行时,内存由操作系统分配,这样可以避免病毒通过指针侵入系统。Java对程序提供了安全管理器,防止程序的非法访问。    面向对象。Java吸取了C++面向对象的概念,将数据封装于类中,利用类的优点,实现了程序的简洁性和便于维护性。类的封装性、继承性等有关对象的特性,使程序代码只需一次编译,然后通过上述特性反复利用。程序员只需把主要精力用在类和接口的设计和应用上。Java提供了众多的一般对象的类,通过继承即可使用父类的方法。在Java中,类的继承关系是单一的非多重的,一个子类只有一个父类,子类的父类又有一个父类。Java提供的Object类及其子类的继承关系如同一棵倒立的树形,根类为Object类,Object类功能强大,经常会使用到它及其它派生的子类。    分布式 。Java建立在扩展TCP/IP网络平台上。库函数提供了用HTTP和FTP协议传送和接受信息的方法。这使得程序员使用网络上的文件和使用本机文件一样容易。    健壮性。Java致力于检查程序在编译和运行时的错误。类型检查帮助检查出许多开发早期出现的错误。Java自己操纵内存减少了内存出错的可能性。Java还实现了真数组,避免了覆盖数据的可能,这些功能特征大大提高了开发Java应用程序的周期。并且Java还提供了Null指针检测、数组边界检测、异常出口、Byte code校验等功能。解释型。我们知道C,C++等语言,都是针对CPU芯片进行编译,生成机器代码,该代码的运行就和特定的CPU有关。Java不像C或C++,它不针对CPU芯片进行编译,而是把程序编译成称为自字节码的一种“中间代码”。字节码是很接近机器码的文件,可以在提供了java虚拟机(JVM)的任何系统上被解释执行。    动态性。java程序的基本组成单元就是类,有些类是自己编写的,有些是从类库中引入的,而类又是运行时动态装载的,这就使得Java可以在分部环境中动态的维护程序及分类,而不像C++那样,没档期类库升级以后,如果想让程序具有新类库提供的功能,就需要修改程序,重新编译。 多线程 。Java是支持多线程的语言。多线程是一种应用程序设计方法。线程是一大进程里分出来的,小的、独立的进程,使得在一个程序里可同时执行多个小任务。多线程带来的好处是具有更好的交互性能和实时控制性能。但采用传统的程序设计语言(如:C/C++)实现多线程程序并非易事。Java实现了多线程技术,提供了简便的实现多线程的方法,并拥有一组高复杂性的同步机制。可以移植的。这种可移植性来源于体系结构中立性,另外,java还严格规定了各个基本数据类型的长度。java系统本身也具有很强的可移植性,java编译器是用java实现的,java运行环境是用ANSIC实现的。3总体设计3.1代码功能模块设计蜘蛛纸牌游戏共由4个部分组成,分别是:Spider.java,SpiderMenuBar.java,PKCard.java,AboutDialog.java,SpiderMenuBar.java  包含名为SpiderMenuBar的public类,其主要功能为生成蜘蛛纸牌游戏的菜单栏,实现菜单栏中各个组件的事件侦听。主要包括3个模块:图形用户界面的构建;组件监听接口的实现:显示可执行操作的线程。PKCard.java 。包含名为PKCard的public类,其主要功能为:定义纸牌的属性,包括名称,位置等相关信息。并通过相关方法实现纸牌的移动等。 AboutDialog.java 。包含名为AboutDialog的public类,其主要功能为生成蜘蛛纸牌游戏的帮助栏。 Spider.java 。包含名为Spider的public类,其主要功能为生成蜘蛛纸牌游戏的框架,实现游戏中的方法,包括:纸牌的随机生成,位置的摆放等。4程序流程图 5程序使用说明5.1主要界面以下是主菜单界面的主要代码:JMenujNewGame=newJMenu("游戏");JMenujHelp=newJMenu("帮助");JMenuItemjItemAbout=newJMenuItem("关于");JMenuItemjItemOpen=newJMenuItem("开始新游戏");JMenuItemjItemDeal=newJMenuItem("发牌");JMenuItemjItemExit=newJMenuItem("退出");JRadioButtonMenuItemjRMItemEasy=newJRadioButtonMenuItem("初级:单花色");//菜单中的可选项按钮JRadioButtonMenuItemjRMItemNormal=newJRadioButtonMenuItem("中级:双花色");JRadioButtonMenuItemjRMItemHard=newJRadioButtonMenuItem("高级:四花色");publicSpiderMenuBar(Spiderspider){this.main=spider;jNewGame.add(jItemOpen);jNewGame.add(jItemDeal);jNewGame.addSeparator();//添加划分线jNewGame.add(jRMItemEasy);jNewGame.add(jRMItemNormal);jNewGame.add(jRMItemHard);jNewGame.addSeparator();jNewGame.add(jItemExit);ButtonGroupgroup=newButtonGroup();//(用来获取JRadioButtonMenuItem的值) group.add(jRMItemEasy);group.add(jRMItemNormal);group.add(jRMItemHard);jHelp.add(jItemAbout);this.add(jNewGame);this.add(jHelp);//添加到菜单栏以下是游戏窗口界面初始化的主要代码:pane=this.getContentPane();//获得容器pane.setBackground(newColor(0,112,26));//设置背景颜色clickLabel=newJLabel();//发牌区的鼠标点击响应区域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.setCardsLocation();//为纸牌设置坐标位置this.deal();//从右下角发出一叠纸牌。游戏刚开始时,需要先发出一叠纸牌。groundLabel=newJLabel[10];//创建背景框数组,一共有10个背景框。intx=20;//背景框的x坐标,10个背景框是并排放置的,y坐标相等。第一个背景框的x坐标为20。for(inti=0;i<10;i++){//循环创建背景框,并设置其坐标大小等属性groundLabel[i]=newJLabel();//创建背景框groundLabel[i].setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));//为Label设置边框//,//形成背景框groundLabel[i].setBounds(x,25,71,96);//设置背景框的大小与坐标x+=101;//相邻的背景框的x坐标差值为101。this.pane.add(groundLabel[i]);//将背景框添加到容器中}this.setVisible(true);//显示窗口5.2初始化纸牌及发牌操作初始化纸牌的主要代码(包括所有纸牌生成及存入数组,右下角发牌区纸牌初始化以及表面显示纸牌初始化):所有纸牌的生成及存入数组代码:publicvoidinitCards(){//如果纸牌已被赋值,即将其从框架的面板中移去if(cards[0]!=null){for(inti=0;i<104;i++){pane.remove(cards[i]);} }intn=0;//通过难度等级,为n赋值if(this.grade==Spider.EASY){n=1;}elseif(this.grade==Spider.NATURAL){n=2;}else{n=4;}//为card赋值for(inti=1;i<=8;i++){for(intj=1;j<=13;j++){cards[(i-1)*13+j-1]=newPKCard((i%n+1)+"-"+j,this);//当n为1时,i%8的值永远是0,所以i%8+1的值永远是1,因此n为1时,创建的card的名称是1//-1到1-13,全是黑桃。其他等级类似。}}}//纸牌随机分配publicvoidrandomCards(){//将纸牌的顺序打乱,否则牌号的将是从A到K的出现规律PKCardtemp=null;//随机生成牌号for(inti=0;i<52;i++){inta=(int)(Math.random()*104);intb=(int)(Math.random()*104);temp=cards[a];cards[a]=cards[b];cards[b]=temp;}}右下角发牌区纸牌的初始化代码:intx=883;//将坐标定位到右下角发牌区inty=580;for(inti=0;i<6;i++){//初始化右下角发牌区的纸牌,共6叠for(intj=0;j<10;j++){intn=i*10+j;pane.add(cards[n]);//将card转向背面cards[n].turnRear();//将card放在固定的位置上cards[n].moveto(newPoint(x,y)); //将card的位置及相关信息存入map.put(newPoint(x,y),cards[n]);}x+=10;//共6叠纸牌,最上面一叠纸牌的x坐标为883,再往下,x依次增加10}表面显示纸牌初始化:x=20;//将坐标定位到上方玩牌区的左边起点,也就是第一个背景框的坐标位置y=45;/**初始化表面显示的纸牌*/for(inti=10;i>5;i--){//初始化玩牌区的纸牌,共5行for(intj=0;j<10;j++){//共10列intn=i*10+j;//生成索引值if(n>=104){//如果索引值超出数组下标continue;//退出本次循环,执行外层循环}pane.add(cards[n]);//将索引处的纸牌添加到容器中cards[n].turnRear();//将纸牌转向背面cards[n].moveto(newPoint(x,y));//将纸牌放在固定的位置上map.put(newPoint(x,y),cards[n]);//将纸牌及其坐标值存入map中x+=101;//每两列之间的x坐标相距101个像素}x=20;//x坐标回到起点位置y-=5;//主坐标向上移5个像素}发牌操作功能代码:publicvoiddeal(){//发牌,指从右下角的发牌区发牌this.setNA();//判断10列中是否有空列for(inti=0;i<10;i++){if(this.getLastCardLocation(i)==null){JOptionPane.showMessageDialog(this,"有空位不能发牌!","提示",JOptionPane.WARNING_MESSAGE);return;}}intx=20;for(inti=0;i<10;i++){PointlastPoint=this.getLastCardLocation(i);//这张牌应“背面向上”if(c==0){//当还没有发过牌时,玩牌区的纸牌列中,每两张纸牌之间的y坐标值相差5,//指的是背面牌与背面牌之间以及背面牌与第一张正面牌之间的y距离lastPoint.y+=5;} //这张牌应“正面向上”else{//两张正面牌之间的y距离lastPoint.y+=20;}map.remove(cards[c+i].getLocation());cards[c+i].moveto(lastPoint);map.put(newPoint(lastPoint),cards[c+i]);cards[c+i].turnFront();cards[c+i].setCanMove(true);//将组件card移动到容器中指定的顺序索引。this.pane.setComponentZOrder(cards[c+i],1);Pointpoint=newPoint(lastPoint);if(cards[c+i].getValue()==1){intn=cards[c+i].whichColumnAvailable(point);point.y-=240;PKCardcard=(PKCard)this.map.get(point);if(card!=null&&card.isCanMove()){this.haveFinish(n);}}x+=101;}c+=10;}5.3纸牌移动操作/用鼠标拖动纸牌publicvoidmouseDragged(MouseEventarg0){if(canMove){intx=0;inty=0;Pointp=arg0.getPoint();x=p.x-point.x;y=p.y-point.y;this.moving(x,y);}}/**方法:放置纸牌*/publicvoidsetNextCardLocation(Pointpoint){PKCardcard=main.getNextCard(this);if(card!=null){if(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=newPoint(point);point.y+=20;card.setNextCardLocation(point);point.y-=20;main.map.remove(card.getLocation());card.setLocation(point);main.map.put(card.getLocation(),card);card.initPoint=card.getLocation();}}}5.4纸牌回收操作回收纸牌及过关判定功能主要代码:publicvoidhaveFinish(intcolumn){Pointpoint=this.getLastCardLocation(column);PKCardcard=(PKCard)this.map.get(point);do{this.map.remove(point);card.moveto(newPoint(20+finish*10,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++;//如果8付牌全部组合成功,则显示成功的对话框if(finish==8){JOptionPane.showMessageDialog(this,"恭喜你,顺利通过!","成功",JOptionPane.PLAIN_MESSAGE);}if(card!=null){card.turnFront();card.setCanMove(true);}} }5.5帮助菜单功能实现主要代码如下:publicclassAboutDialogextendsJDialog{JPaneljMainPanel=newJPanel();JTabbedPanejTabbedPane=newJTabbedPane();privateJPaneljPanel1=newJPanel();privateJTextAreajt1=newJTextArea("将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。");publicAboutDialog(){setTitle("蜘蛛牌");setSize(300,200);setResizable(false);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);Containerc=this.getContentPane();jt1.setSize(260,200);jt1.setEditable(false);jt1.setLineWrap(true);jt1.setFont(newFont("楷体_GB2312",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.setVisible(true);}}5.6退出功能的实现主要代码如下://“退出”jItemExit.addActionListener(newActionListener(){publicvoidactionPerformed(ActionEvente){main.dispose();System.exit(0);}});6蜘蛛纸牌游戏的实现过程 图6-1蜘蛛纸牌的首界面 图6-2蜘蛛纸牌菜单界面图6-3蜘蛛纸牌的帮助界面图6-4蜘蛛纸牌的游戏规则 图6-5蜘蛛纸牌的声明图6-6蜘蛛纸牌的开局界面 图6-7蜘蛛纸牌的简单单一花色界面 图6-8蜘蛛纸牌的中级双花色界面图6-9蜘蛛纸牌的高级四花色界面 图6-10蜘蛛纸牌的提示界面图6-11蜘蛛纸牌的发牌及收牌界面 图6-12蜘蛛纸牌的完成界面7设计体会及今后的改进意见 通过这次java课程设计,我发现java是一门强大的语言。以前只是在电脑上面玩玩而已,从来都没有想过自己会亲自动手写出这个游戏,当自己亲手写出之后,感觉很激动。同时,更重要的是通过蜘蛛纸牌这个小游戏,我对java有了更深层次的理解,java是一门面向对象的编程语言,它具有抽象,继承,封装,多态等特性。而对象则具有两个层次的概念,第一个是现实世界中对象指的是客观世界的实体,第二个则是程序中对象就是一组变量和相关方法的集合,其中变量表明对象的状态,方法表名对象所具有的行为。方法和属性则构成了java的类。蜘蛛纸牌游戏主要运用了多线程技术,在java中,创建线程有两种方法,一种是通过创建Thread类的子类来实现,另一中方法是通过实现Runable接口的类来实现。这两中创建线程的方法并没有本质上的区别,但是由于java不允许多继承,所以当一个类要继承另一个非Thred来而实现多线程的话,只能通过实现Runable接口的方式来实现。由于是第一次做这种比较全面的游戏,一开始我的脑中并没有很好的设计的主要思路,因此我去图书馆借了不少有关方面的书籍。并且都大致看了一遍,最后选中了一本我认为最好的也是就发现对这次课设最有帮助的书。回宿舍便开始写起,由于一开始的思路没有布置好,写着写着就发现自己写不下去了,于是我又对着参考书写,写了好久,终于写完了所有的代码,本来以为可以高兴下,没想到问题接二连三的来了,开始是页面运行不出来,图片加载不出来,或者加载出来了部分功能无法实现。无论怎么弄都弄不好,在这个时候,我打算放弃了,但又仔细想了下,都做到这个地步了在放弃,是多么不值得一件事啊。于是我调整了下心情,又重新开始做了起来,最后查了好多资料,在同学的帮助下才完成本次课程设计,在那一刹那间,心情无比的激动。通过这次课程设计我发现自己在对待一件事情的态度上还不够端正,还有许多地方都需要改正。我希望在今后的学习和生活中,自己能像这次的课程设计过程中那样戒骄戒躁,遇到困难的时候,不要轻言放弃,坚持到最后,知道成功。 参考文献[1]朱庆生,古平等编《java程序设计》北京:清华大学出版社.2011[2]王伟平等编《java编程》北京:清华大学出版社.2010.5[3]黄晓东等编《java课程设计案例精编》中国水利水电出版社 附录AboutDialogpackagegame;importjava.awt.Color;importjava.awt.Container;importjava.awt.Font;importjavax.swing.JDialog;importjavax.swing.JPanel;importjavax.swing.JTabbedPane;importjavax.swing.JTextArea;importjavax.swing.WindowConstants;publicclassAboutDialogextendsJDialog{JPaneljMainPane=newJPanel();JTabbedPanejTabbedPane=newJTabbedPane();privateJPaneljPanel1=newJPanel();privateJPaneljPanel2=newJPanel();privateJTextAreajt1=newJTextArea("将电脑多次分发给你的牌按照相同的花色由大至小排列起来。直到桌面上的牌全都消失。");privateJTextAreajt2=newJTextArea("该游戏中,纸牌的图片来自于WindowsXP的纸牌游戏,图片权属于原作者所有!");/***构造函数*/publicAboutDialog(){setTitle("蜘蛛牌");setSize(300,200);setResizable(false);setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);Containerc=this.getContentPane();jt1.setSize(260,200);jt2.setSize(260,200);jt1.setEditable(false);jt2.setEditable(false);jt1.setLineWrap(true);jt2.setLineWrap(true);jt1.setFont(newFont("楷体_GB2312",java.awt.Font.BOLD,13));jt1.setForeground(Color.blue);jt2.setFont(newFont("楷体_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("声明",null,jPanel2,null);jMainPane.add(jTabbedPane);c.add(jMainPane); pack();this.setVisible(true);}}Spiderpackagegame;importjava.awt.Color;importjava.awt.Container;importjava.awt.Point;importjava.awt.event.KeyAdapter;importjava.awt.event.KeyEvent;importjava.awt.event.MouseAdapter;importjava.awt.event.MouseEvent;importjava.util.Hashtable;importjavax.swing.JFrame;importjavax.swing.JLabel;importjavax.swing.JOptionPane;publicclassSpiderextendsJFrame{//整型变量,表示难度等级为:简单publicstaticfinalintEASY=1;//整型变量,表示难度等级为:普通publicstaticfinalintNATURAL=2;//整型变量,表示难度等级为:难publicstaticfinalintHARD=3;//设定初始难度等级为简单privateintgrade=Spider.EASY;privateContainerpane=null;//生成纸牌数组privatePKCardcards[]=newPKCard[104];privateJLabelclickLabel=null;privateintc=0;privateintn=0;privateinta=0;privateintfinish=0;Hashtabletable=null;privateJLabelgroundLabel[]=null;publicstaticvoidmain(String[]args){Spiderspider=newSpider();spider.setVisible(true);}publicSpider(){setTitle("蜘蛛牌"); setDefaultCloseOperation(javax.swing.JFrame.EXIT_ON_CLOSE);//设置框架的大小setSize(1024,742);//生成SpiderMenuBar对象,并放置在框架之上setJMenuBar(newSpiderMenuBar(this));pane=this.getContentPane();//设置背景颜色pane.setBackground(newColor(0,112,26));//将布局管理器设置成为nullpane.setLayout(null);clickLabel=newJLabel();clickLabel.setBounds(883,606,121,96);pane.add(clickLabel);clickLabel.addMouseListener(newMouseAdapter(){publicvoidmouseReleased(MouseEventme){if(c<60){Spider.this.deal();}}});this.initCards();this.randomCards();this.setCardsLocation();groundLabel=newJLabel[10];intx=20;for(inti=0;i<10;i++){groundLabel[i]=newJLabel();groundLabel[i].setBorder(javax.swing.BorderFactory.createEtchedBorder(javax.swing.border.EtchedBorder.RAISED));groundLabel[i].setBounds(x,25,71,96);x+=101;this.pane.add(groundLabel[i]);this.setVisible(true);this.deal();this.addKeyListener(newKeyAdapter(){classShowextendsThread{publicvoidrun(){Spider.this.showEnableOperator(); }}publicvoidkeyPressed(KeyEvente){if(finish!=8)if(e.getKeyCode()==KeyEvent.VK_D&&c<60){Spider.this.deal();}elseif(e.getKeyCode()==KeyEvent.VK_M){newShow().start();}}});}}publicvoidnewGame(){this.randomCards();this.setCardsLocation();this.setGroundLabelZOrder();this.deal();}publicintgetC(){returnc;}publicvoidsetGrade(intgrade){this.grade=grade;}publicvoidinitCards(){//如果纸牌已被赋值,即将其从框架的面板中移去if(cards[0]!=null){for(inti=0;i<104;i++){pane.remove(cards[i]);}}intn=0;//通过难度等级,为n赋值if(this.grade==Spider.EASY){n=1;}elseif(this.grade==Spider.NATURAL){n=2;}else{n=4;}//为card赋值 for(inti=1;i<=8;i++){for(intj=1;j<=13;j++){cards[(i-1)*13+j-1]=newPKCard((i%n+1)+"-"+j,this);}}//随机纸牌初始化this.randomCards();}publicvoidrandomCards(){PKCardtemp=null;//随机生成牌号for(inti=0;i<52;i++){inta=(int)(Math.random()*104);intb=(int)(Math.random()*104);temp=cards[a];cards[a]=cards[b];cards[b]=temp;}}publicvoidsetNA(){a=0;n=0;}publicvoidsetCardsLocation(){table=newHashtable();c=0;finish=0;n=0;a=0;intx=883;inty=580;//初始化待展开的纸牌for(inti=0;i<6;i++){for(intj=0;j<10;j++){intn=i*10+j;pane.add(cards[n]);//将card转向背面cards[n].turnRear();//将card放在固定的位置上cards[n].moveto(newPoint(x,y));//将card的位置及相关信息存入table.put(newPoint(x,y),cards[n]);} x+=10;}x=20;y=45;//初始化表面显示的纸牌for(inti=10;i>5;i--){for(intj=0;j<10;j++){intn=i*10+j;if(n>=104)continue;pane.add(cards[n]);cards[n].turnRear();cards[n].moveto(newPoint(x,y));table.put(newPoint(x,y),cards[n]);x+=101;}x=20;y-=5;}}publicvoidshowEnableOperator(){intx=0;out:while(true){Pointpoint=null;PKCardcard=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)breakout;}card=(PKCard)this.table.get(point);}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){Pointp=null;PKCardc=null;do{if(p!=null){a++;}p=this.getLastCardLocation(a);intz=0;while(p==null){p=this.getLastCardLocation(++a);if(a==10)a=0;if(a==n)a++;z++;if(z==10)breakout;}c=(PKCard)this.table.get(p);}while(!c.isCardCanMove());if(c.getCardValue()==card.getCardValue()+1){card.flashCard(card);try{Thread.sleep(800);}catch(InterruptedExceptione){e.printStackTrace();}c.flashCard(c);a++;if(a==10){n++;}breakout;}}}n++;if(n==10){n=0;}x++;if(x==10){breakout;}} }/***返回值:void**方法:游戏运行*/publicvoiddeal(){this.setNA();//判断10列中是否空列for(inti=0;i<10;i++){if(this.getLastCardLocation(i)==null){JOptionPane.showMessageDialog(this,"有空位不能发牌!","提示",JOptionPane.WARNING_MESSAGE);return;}}intx=20;for(inti=0;i<10;i++){PointlastPoint=this.getLastCardLocation(i);//这张牌应“背面向上”if(c==0){lastPoint.y+=5;}//这张牌应“正面向上”else{lastPoint.y+=20;}table.remove(cards[c+i].getLocation());cards[c+i].moveto(lastPoint);table.put(newPoint(lastPoint),cards[c+i]);cards[c+i].turnFront();cards[c+i].setCanMove(true);//将组件card移动到容器中指定的顺序索引。this.pane.setComponentZOrder(cards[c+i],1);Pointpoint=newPoint(lastPoint);if(cards[c+i].getCardValue()==1){intn=cards[c+i].whichColumnAvailable(point);point.y-=240;PKCardcard=(PKCard)this.table.get(point);if(card!=null&&card.isCardCanMove()){ this.haveFinish(n);}}x+=101;}c+=10;}publicPKCardgetPreviousCard(PKCardcard){Pointpoint=newPoint(card.getLocation());point.y-=5;card=(PKCard)table.get(point);if(card!=null){returncard;}point.y-=15;card=(PKCard)table.get(point);returncard;}publicPKCardgetNextCard(PKCardcard){Pointpoint=newPoint(card.getLocation());point.y+=5;card=(PKCard)table.get(point);if(card!=null)returncard;point.y+=15;card=(PKCard)table.get(point);returncard;}publicPointgetLastCardLocation(intcolumn){Pointpoint=newPoint(20+column*101,25);PKCardcard=(PKCard)this.table.get(point);if(card==null)returnnull;while(card!=null){point=card.getLocation();card=this.getNextCard(card);}returnpoint;}publicPointgetGroundLabelLocation(intcolumn){returnnewPoint(groundLabel[column].getLocation());}publicvoidsetGroundLabelZOrder(){for(inti=0;i<10;i++){pane.setComponentZOrder(groundLabel[i],105+i);} }publicvoidhaveFinish(intcolumn){Pointpoint=this.getLastCardLocation(column);PKCardcard=(PKCard)this.table.get(point);do{this.table.remove(point);card.moveto(newPoint(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;elsecard=(PKCard)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);}}}PKCardpackagegame;importjava.awt.Container;importjava.awt.Point;importjava.awt.event.MouseEvent;importjava.awt.event.MouseListener;importjava.awt.event.MouseMotionListener;importjavax.swing.ImageIcon;importjavax.swing.JLabel;publicclassPKCardextendsJLabelimplementsMouseListener,MouseMotionListener{//纸牌的位置Pointpoint=null; PointinitPoint=null;intvalue=0;inttype=0;Stringname=null;Containerpane=null;Spidermain=null;booleancanMove=false;booleanisFront=false;PKCardpreviousCard=null;publicvoidmouseClicked(MouseEventarg0){}publicvoidflashCard(PKCardcard){//启动Flash线程newFlash(card).start();//不停的获得下一张牌,直到完成if(main.getNextCard(card)!=null){card.flashCard(main.getNextCard(card));}}classFlashextendsThread{privatePKCardcard=null;publicFlash(PKCardcard){this.card=card;}/***线程的run()方法**为纸牌的正面设置白色图片*/publicvoidrun(){booleanis=false;ImageIconicon=newImageIcon("images/white.gif");for(inti=0;i<4;i++){try{Thread.sleep(200);}catch(InterruptedExceptione){e.printStackTrace();}if(is){this.card.turnFront();is=!is;}else{this.card.setIcon(icon);is=!is;}//根据当前外观将card的UI属性重置card.updateUI();} }}/****点击鼠标*/publicvoidmousePressed(MouseEventmp){point=mp.getPoint();main.setNA();this.previousCard=main.getPreviousCard(this);}/****释放鼠标*/publicvoidmouseReleased(MouseEventmr){Pointpoint=((JLabel)mr.getSource()).getLocation();//判断可行列intn=this.whichColumnAvailable(point);if(n==-1||n==this.whichColumnAvailable(this.initPoint)){this.setNextCardLocation(null);main.table.remove(this.getLocation());this.setLocation(this.initPoint);main.table.put(this.initPoint,this);return;}point=main.getLastCardLocation(n);booleanisEmpty=false;PKCardcard=null;if(point==null){point=main.getGroundLabelLocation(n);isEmpty=true;}else{card=(PKCard)main.table.get(point);}if(isEmpty||(this.value+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.previousCard.setCanMove(true);}this.setCanMove(true);} else{this.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){point.y-=240;card=(PKCard)main.table.get(point);if(card!=null&&card.isCardCanMove()){main.haveFinish(n);}}}/***方法:放置纸牌*/@SuppressWarnings("unchecked")publicvoidsetNextCardLocation(Pointpoint){PKCardcard=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);}else{point=newPoint(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.getLocation();}}}/****返回值:int**方法:判断可用列*/publicintwhichColumnAvailable(Pointpoint){intx=point.x;inty=point.y;inta=(x-20)/101;intb=(x-20)%101; if(a!=9){if(b>30&&b<=71){a=-1;}elseif(b>71){a++;}}elseif(b>71){a=-1;}if(a!=-1){Pointp=main.getLastCardLocation(a);if(p==null)p=main.getGroundLabelLocation(a);b=y-p.y;if(b<=-96||b>=96){a=-1;}}returna;}publicvoidmouseEntered(MouseEventarg0){}publicvoidmouseExited(MouseEventarg0){}/****用鼠标拖动纸牌*/publicvoidmouseDragged(MouseEventarg0){if(canMove){intx=0;inty=0;Pointp=arg0.getPoint();x=p.x-point.x;y=p.y-point.y;this.moving(x,y);}}publicvoidmoving(intx,inty){PKCardcard=main.getNextCard(this);Pointp=this.getLocation();//将组件移动到容器中指定的顺序索引。pane.setComponentZOrder(this,1);//在Hashtable中保存新的节点信息main.table.remove(p);p.x+=x; p.y+=y;this.setLocation(p);main.table.put(p,this);if(card!=null)card.moving(x,y);}publicvoidmouseMoved(MouseEventarg0){}publicPKCard(Stringname,Spiderspider){super();this.type=newInteger(name.substring(0,1)).intValue();this.value=newInteger(name.substring(2)).intValue();this.name=name;this.main=spider;this.pane=this.main.getContentPane();this.addMouseListener(this);this.addMouseMotionListener(this);this.setIcon(newImageIcon("images/rear.gif"));this.setSize(71,96);this.setVisible(true);}publicvoidturnFront(){this.setIcon(newImageIcon("images/"+name+".gif"));this.isFront=true;}publicvoidturnRear(){this.setIcon(newImageIcon("images/rear.gif"));this.isFront=false;this.canMove=false;}publicvoidmoveto(Pointpoint){this.setLocation(point);this.initPoint=point;}publicvoidsetCanMove(booleancan){this.canMove=can;PKCardcard=main.getPreviousCard(this);if(card!=null&&card.isCardFront()){if(!can){if(!card.isCardCanMove()){return;}else{card.setCanMove(can);} }else{if(this.value+1==card.getCardValue()&&this.type==card.getCardType()){card.setCanMove(can);}else{card.setCanMove(false);}}}}publicbooleanisCardFront(){returnthis.isFront;}publicbooleanisCardCanMove(){returnthis.canMove;}publicintgetCardValue(){returnvalue;}publicintgetCardType(){returntype;}}

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。
关闭