版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
基于javafx设计的蜘蛛纸牌游戏包含三个程序块:Spider.java;SpiderMenu.java;PKCard.java程序入口在Spider.java中1Spider.javaimportjava.util.*;importjavafx.util.Duration;importjavafx.geometry.Point2D;importjavafx.animation.PathTransition;hTransitionBuilder;importjavafx.animation.PathTransition.OrientationType;importjavafx.application.Application;importjavafx.scene.Group;importjavafx.scene.Scene;importjavafx.stage.Stage;importjavafx.scene.control.Label;importjavafx.scene.effect.Lighting;importjavafx.scene.paint.Color;importjavafx.scene.shape.CubicCurveTo;importjavafx.scene.shape.MoveTo;importjavafx.scene.shape.Path;importjavafx.scene.shape.PathBuilder;importjavafx.scene.text.Font;importjavafx.scene.text.Text;importjavafx.event.EventHandler;importjavafx.scene.image.Image;importjavafx.scene.image.ImageView;importjavafx.scene.input.MouseEvent;publicclassSpiderextendsApplication{ //整型变量,表示难度等级为:简单 publicstaticfinalintEASY=1;//整型变量,表示难度等级为:普通 publicstaticfinalintNATURAL=2;//整型变量,表示难度等级为:难 publicstaticfinalintHARD=3;//设定初始难度等级为简单 privateintgrade=Spider.EASY; privatePKCardcards[]=newPKCard[104]; privatePathTransitionpathTransition; privateintc=0;privateintn=0;privateinta=0;privateintfinish=0;Point2Dp1=null;Labellabel[]=null;Point2Dpoint[]=newPoint2D[10];Grouproot1=newGroup(); staticfinalImageICON=newImage("images/white.gif"); Hashtable<Point2D,PKCard>table=null; Colord=Color.rgb(0,100,0); publicvoidinit(StageprimaryStage){ Grouproot=newGroup(); primaryStage.setResizable(false); primaryStage.setScene(newScene(root,1024,704,d)); primaryStage.setTitle("蜘蛛纸牌"); label=newLabel[10];intx=20;for(intk=0;k<10;k++){ ImageViewimageView=newImageView(ICON); label[k]=newLabel("",imageView); label[k].resizeRelocate(x,25,71,96); label[k].setVisible(true); point[k]=newPoint2D(x,25); x+=101; root.getChildren().add(label[k]);}root1=root;newSpiderMenu(this);this.initCards();this.setCardsLocation();root=root1; } publicvoidnewGame(){ this.c=0; for(intk=0;k<=103;k++){ cards[k].setVisible(false); } this.initCards();//纸牌赋值并打乱 for(intk=0;k<=103;k++){ cards[k].setVisible(true); }this.setCardsLocation();//放置纸牌this.setOpen();//发牌开局this.setLabelZOrder();} publicvoidinitCards(){//如果纸牌已被赋值,即将其从框架的面板中移去 if(cards[0]!=null){for(inti=0;i<104;i++){ cards[i].setVisible(false);table.remove(cards[i].getLocation());}} intn=0;//通过难度等级,为n赋值 if(this.grade==Spider.EASY){n=1;}elseif(this.grade==Spider.NATURAL){n=2;}else{n=4;}//为104张扑克牌赋值 for(inti=1;i<=8;i++){for(intj=1;j<=13;j++){cards[(i-1)*13+j-1]=newPKCard((i%n+1)+"-"+j,this);}} for(intm=0;m<=103;m++){ finalPKCardpk=cards[m]; //鼠标点击监听 pk.setOnMousePressed(newEventHandler<MouseEvent>(){ publicvoidhandle(MouseEventme){ if(pk.canMove){ pk.mousePressed(me); } } }); //鼠标拖拽监听 pk.setOnMouseDragged(newEventHandler<MouseEvent>(){ publicvoidhandle(MouseEventme){ if(pk.canMove){ pk.mouseDragged(me); } } }); //鼠标释放监听 pk.setOnMouseReleased(newEventHandler<MouseEvent>(){ publicvoidhandle(MouseEventme){ pk.mouseReleased(me); } }); } //随机纸牌初始化,打乱纸牌 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; }} publicvoidsetCardsLocation(){table=newHashtable<Point2D,PKCard>();c=0;finish=0;n=0;a=0;doublex=863;doubley=580; //初始化待展开的纸牌0~49号for(inti=0;i<5;i++){for(intj=0;j<10;j++){intn=i*10+j;root1.getChildren().add(cards[n]);//将card转向背面 cards[n].turnRear();//将card放在固定的位置上 cards[n].moveto(newPoint2D(x,y));//将card的位置及相关信息存入 table.put(newPoint2D(x,y),cards[n]); finalPKCardpkc=cards[n]; pkc.setOnMouseClicked(newEventHandler<MouseEvent>(){ publicvoidhandle(MouseEventme){ if((580-(pkc.getLocation().getY())<10)&&(1024-pkc.getLocation().getX())<200){ if(c<60){ Spider.this.deal(); } } } }); }x+=10;} x=913; y=580;//初始化背面显示的纸牌50~103号 for(inti=5;i<11;i++){for(intj=0;j<10;j++){intn=i*10+j;if(n>=104)break;root1.getChildren().add(cards[n]);cards[n].moveto(newPoint2D(x,y));table.put(newPoint2D(x,y),cards[n]); }} } publicvoidsetOpen(){ c=0; for(inti=5;i<=11;i++){ for(intj=0;j<10;j++){ intn=10*i+j; if(n>=94){ if(n<104){ cards[n].turnFront(); cards[n].setCanMove(true); this.c++; } elsebreak; }else{cards[n].turnRear();}Pathpath=PathBuilder.create().elements(newMoveTo(cards[n].getLocation().getX(),cards[n].getLocation().getY()),newCubicCurveTo(55.5+101*j,48+5*i,55.5+101*j,48+5*i,55.5+101*j,48+5*i)).build();path.setStroke(Color.DODGERBLUE);path.getStrokeDashArray().setAll(0d,10000d);root1.getChildren().add(path);pathTransition=PathTransitionBuilder.create().duration(Duration.seconds(0.5)).path(path).node(cards[n]).orientation(OrientationType.NONE).cycleCount(1).autoReverse(false).build();pathTransition.play();try{Thread.sleep(1);//毫秒}catch(Exceptione){}table.remove(cards[n].getLocation());cards[n].moveto(newPoint2D(point[j].getX(),point[j].getY()+(i-5)*5));table.put((newPoint2D(point[j].getX(),point[j].getY()+(i-5)*5)),cards[n]);}} c=10;} publicvoidsetNA(){a=0;n=0;} publicPoint2DgetLastCardLocation(intcolumn){ Point2Dp1=newPoint2D(20+column*101,25);PKCardcard=(PKCard)this.table.get(p1);if(card==null)returnnull;while(card!=null){p1=card.getLocation();card=this.getNextCard(card);}returnp1;} publicPKCardgetNextCard(PKCardcard){Point2Dpoint=card.getLocation();point=newPoint2D(point.getX(),point.getY()+5);card=(PKCard)table.get(point);if(card!=null) returncard;//此牌是背面向上,故下张牌y坐标相差5point=newPoint2D(point.getX(),point.getY()+15);card=(PKCard)table.get(point);if(card!=null)returncard;//此牌是正面向上,故下张牌坐标相差20elsereturnnull;} publicPKCardgetPreviousCard(PKCardcard){Point2Dpoint=newPoint2D(card.getLocation().getX(),card.getLocation().getY()-5);card=(PKCard)table.get(point);if(card!=null){ returncard;//上面牌背面向上 }point=newPoint2D(point.getX(),point.getY()-15);card=(PKCard)table.get(point);returncard;//上面牌正面向上} publicPoint2DgetGroundLabelLocation(intcolumn){ returnpoint[column];} publicvoiddeal(){this.setNA();//判断10列中是否空列 for(inti=0;i<10;i++){if(this.getLastCardLocation(i)==null){ finalStagestage=newStage();GrouprootGroup=newGroup();Scenescene=newScene(rootGroup,350,100,Color.PURPLE);stage.setScene(scene);stage.centerOnScreen();stage.show();Texttext=newText(20,110,"提示:有空位不能发牌!");text.setX(40);text.setY(50);text.setFill(Color.DODGERBLUE);text.setEffect(newLighting());text.setFont(Font.font(Font.getDefault().getFamily(),28));rootGroup.getChildren().add(text);stage.show();return;}} System.out.println(+c);if(this.c<60){for(inti=0;i<=9;i++){ Point2DLastPoint=this.getLastCardLocation(i); LastPoint=newPoint2D(LastPoint.getX(),LastPoint.getY()+20); Pathpath=PathBuilder.create().elements(newMoveTo(cards[59-c-i].getLocation().getX(),cards[59-c-i].getLocation().getY()),newCubicCurveTo(55.5+101*i,LastPoint.getY()+48,55.5+101*i,LastPoint.getY()+48,55.5+101*i,LastPoint.getY()+48)).build();path.setStroke(Color.DODGERBLUE);path.getStrokeDashArray().setAll(0d,10000d);root1.getChildren().add(path);pathTransition=PathTransitionBuilder.create().duration(Duration.seconds(0.5)).path(path).node(cards[59-c-i]).orientation(OrientationType.NONE).cycleCount(1).autoReverse(false).build();pathTransition.play();try{Thread.sleep(1);//毫秒}catch(Exceptione){} table.remove(cards[59-c-i].getLocation()); cards[59-c-i].moveto(LastPoint); table.put(LastPoint,cards[59-c-i]); cards[59-c-i].turnFront(); cards[59-c-i].setCanMove(true); cards[59-c-i].toFront(); Point2Dpoint=newPoint2D(LastPoint.getX(),LastPoint.getY()); if(cards[59-c-i].getCardValue()==1){intn=cards[59-c-i].whichColumnAvailable(point);point=newPoint2D(point.getX(),point.getY()-240);PKCardcard=(PKCard)this.table.get(point);if(card!=null&&card.isCardCanMove()){this.haveFinish(n);}} }c+=10;System.out.println(+c);} } publicintgetC(){returnc;} publicvoidsetGrade(intgrade){this.grade=grade;} publicvoidshowEnableOperator(){intx=0;out:while(true){Point2Dpoint=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);////扑克牌1}if(a==10){ a=0; }for(;a<10;a++){if(a!=n){Point2Dp=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);//扑克牌2}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; }}} publicvoidsetLabelZOrder(){for(inti=0;i<10;i++){ label[i].toBack();} } publicvoidhaveFinish(intcolumn){Point2Dpoint=this.getLastCardLocation(column);PKCardcard=(PKCard)this.table.get(point);do{ Pathpath=PathBuilder.create().elements(newMoveTo(card.getLocation().getX(),card.getLocation().getY()),newCubicCurveTo(55.5+finish*10,628,55.5+finish*10,628,55.5+finish*10,628)).build();path.setStroke(Color.DODGERBLUE);path.getStrokeDashArray().setAll(0d,10000d);root1.getChildren().add(path);pathTransition=PathTransitionBuilder.create().duration(Duration.seconds(0.5)).path(path).node(card).orientation(OrientationType.NONE).cycleCount(1).autoReverse(false).build();pathTransition.play();try{Thread.sleep(1);//毫秒}catch(Exceptione){} this.table.remove(point);card.moveto(newPoint2D(20+finish*10,580));card.toFront();//将纸牌新的相关信息存入Hashtable this.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){ finalStagestage=newStage();GrouprootGroup=newGroup();Scenescene=newScene(rootGroup,400,150,Color.BLUE);stage.setScene(scene);stage.setTitle("通知");stage.centerOnScreen();stage.show();Texttext=newText(20,110,"恭喜你,顺利通关!");text.setFill(Color.DODGERBLUE);text.setEffect(newLighting());text.setFont(Font.font(Font.getDefault().getFamily(),40));rootGroup.getChildren().add(text);stage.show();return;}if(card!=null){card.turnFront();card.setCanMove(true);}} publicdoublegetSampleWidth(){ return1024; } publicdoublegetSampleHeight(){ return724; } @Override publicvoidstart(StageprimaryStage)throwsException{ init(primaryStage); primaryStage.show();} /** *@paramargs */ publicstaticvoidmain(String[]args){ launch(args); } }2SpiderMenu.javaimportjavafx.scene.Group;importjavafx.scene.Scene;importjavafx.scene.control.ColorPicker;importjavafx.scene.control.Label;importjavafx.scene.control.Menu;importjavafx.scene.control.MenuBar;importjavafx.scene.control.MenuBuilder;importjavafx.scene.control.MenuItem;importjavafx.scene.control.MenuItemBuilder;importjavafx.scene.control.ToolBar;importjavafx.scene.control.ToolBarBuilder;importjavafx.scene.effect.Lighting;importjavafx.scene.input.MouseEvent;importjavafx.scene.layout.VBox;importjavafx.scene.layout.VBoxBuilder;importjavafx.scene.paint.Color;importjavafx.scene.shape.Rectangle;importjavafx.scene.text.Font;importjavafx.scene.text.Text;importjavafx.stage.Stage;importjavafx.event.ActionEvent;importjavafx.event.Event;importjavafx.event.EventHandler;importjavafx.geometry.Insets;importjavafx.geometry.Pos; publicclassSpiderMenu{ Spidermain=null; VBoxvbox=newVBox();finalMenuBarmenuBar=newMenuBar();MenuItemmenuOpen=MenuItemBuilder.create().text("开局").build();MenuItemmenuRefapai=MenuItemBuilder.create().text("重新发牌").build();MenuItemmenuEnableOperator=MenuItemBuilder.create().text("显示可行操作").build();MenuItemmenuExit=MenuItemBuilder.create().text("退出").build();MenuItemmenuEasy=MenuItemBuilder.create().text("简单:单花色").build();MenuItemmenuMedium=MenuItemBuilder.create().text("中等:双花色").build();MenuItemmenuHard=MenuItemBuilder.create().text("困难:四花色").build();MenuItemmenuGameRule=MenuItemBuilder.create().text("游戏规则").build();MenuItemmenuStatement=MenuItemBuilder.create().text("声明").build();publicSpiderMenu(Spiderspider){ this.main=spider; MenumenuGrade=MenuBuilder.create().text("等级设置").items(menuEasy,menuMedium,menuHard).build(); MenumenuAbout=MenuBuilder.create().text("关于").items(menuGameRule,menuStatement).build(); MenumenuGame=MenuBuilder.create().text("游戏").items(menuOpen,menuRefapai,menuEnableOperator,menuGrade,menuExit).build(); MenumenuHelp=MenuBuilder.create().text("帮助").items(menuAbout).build();menuBar.getMenus().addAll(menuGame,menuHelp);menuBar.setPrefWidth(1024);vbox.getChildren().addAll(menuBar/*,standardToolbar,coloredObjectsVBox*/);main.root1.getChildren().addAll(vbox); //鼠标监听menuOpen.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ menuRefapai.setDisable(false); main.newGame();}});menuRefapai.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ if(main.getC()<60){main.deal(); }}});menuEnableOperator.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ newShow().start(); }});menuExit.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ System.exit(0);}});menuEasy.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ main.setGrade(Spider.EASY);main.initCards();main.newGame();}});menuMedium.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ main.setGrade(Spider.NATURAL);main.initCards();main.newGame();}});menuHard.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ main.setGrade(Spider.HARD);main.initCards();main.newGame();}});menuGameRule.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ finalStagestage=newStage();GrouprootGroup=newGroup();Scenescene=newScene(rootGroup,300,150,Color.rgb(50,10,0));stage.setScene(scene);stage.setTitle("游戏规则");stage.centerOnScreen();stage.show();Texttext=newText(20,110,"扑克牌从A到K构成一条龙"+"\n"+"请将相同类型的扑克牌集齐"+"\n"+"一共集齐八条龙即可通关。");text.setFill(Color.DODGERBLUE);text.setX(20);text.setY(50);text.setEffect(newLighting());text.setFont(Font.font(Font.getDefault().getFamily(),20));rootGroup.getChildren().add(text);stage.show();return; }});menuStatement.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ finalStagestage=newStage();GrouprootGroup=newGroup();Scenescene=newScene(rootGroup,300,150,Color.rgb(50,0,20));stage.setScene(scene);stage.setTitle("声明");stage.centerOnScreen();stage.show();Texttext=newText(20,110,"版权所有,侵权必究!"+"\n"+"开玩笑的啦,哈哈哈!!!"+"\n"+"--------Sketch");text.setFill(Color.DODGERBLUE);text.setX(20);text.setY(50);text.setEffect(newLighting());text.setFont(Font.font(Font.getDefault().getFamily(),20));rootGroup.getChildren().add(text);stage.show();return;}});menuGame.setOnAction(newEventHandler<ActionEvent>(){publicvoidhandle(ActionEventme){ if(main.getC()<60){ menuRefapai.setDisable(false);}else{ menuRefapai.setDisable(true);}}}); }classShowextendsThread{publicvoidrun(){main.showEnableOperator();}}} 3PKCard.javaimportjavafx.geometry.Point2D;importjavafx.scene.image.Image;importjavafx.scene.image.ImageView;importjavafx.scene.input.MouseEvent;//构造扑克牌PKCard publicclassPKCardextendsImageView{ Point2Dpoint=null; Point2DinitPoint=null; // Point2Dp1=null; intvalue=0; inttype=0; booleancanMove=false; booleanisFront=false; Spidermain=null; Stringname=null; PKCardpreviousCard=null; publicPKCard(Stringname,Spiderspider){ super(); this.type=newInteger(name.substring(0,1)).intValue(); this.value=newInteger(name.substring(2)).intValue(); =name; this.main=spider; this.setImage(newImage("images/rear.gif")); this.setVisible(true); } 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; Imageicon=newImage("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.setImage(icon); is=!is; } } } } publicvoidturnRear(){ this.setImage(newImage("images/rear.gif")); this.isFront=false; this.canMove=false; } publicvoidturnFront(){ this.setImage(newImage("images/"+name+".gif")); this.isFront=true; } publicvoidsetLocation(Point2Dp){ this.setX(p.getX()); this.setY(p.getY()); } publicvoidmoveto(Point2Dpoint){ this.setLocation(point); this.initPoint=point; } publicPoint2DgetLocation(){ Point2Dpoint=newPoint2D(this.getX(),this.getY());//=newPoint2D(this.getX(),this.getY()); returnpoint; }
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2026浙江教育考试服务中心招聘2人笔试模拟试题及答案详解
- 2027届山西省晋中市平遥县数学四年级第一学期期末学业质量监测模拟试题含解析
- 诸城市2027届六年级数学第一学期期末考试试题含解析
- 2026年滁州琅琊区机关事业单位公开招募就业见习人员70名笔试模拟试题及答案详解
- 中国玉米油行业供需趋势及投资风险研究报告
- 2026黑龙江佳木斯抚远县东极城市基础设施建设投资有限公司招聘3人笔试参考题库及答案详解
- 中国瓶装酸奶行业销售渠道分析与未来经营效益研究研究报告
- 2025-2026学年言语的力量教学设计
- 库房通风除湿制度
- 2026吉林池南区下半年征兵工作开始了笔试模拟试题及答案详解
- 装卸煤炭合同范本
- GB/T 46445.1-2025影像材料和印刷品耐磨性第1部分:通用摩擦试验方法
- 基于惯性传感器与正交里程计的平面定位系统:设计、实现与性能优化
- 施工安全隐患排查治理实施方案完整版
- 心理咨询热线工作人员培训手册
- 2026春夏·淘宝天猫运动户外鞋服趋势白皮书
- 护理质量指标解读2025年非计划拔管
- 辅导员调动工作申请书范文
- 海洋弧菌护理查房
- 安徽省合肥市包河区2023-2024学年七年级下学期期末语文试题(含答案)
- 房主同意办电增容协议书
评论
0/150
提交评论