使用JavaFX完成刽子手游戏

1.1 题目说明

1.2 分析过程

本题让我画一个小人,首先使用new Arc()命令绘制半个椭圆当基座,然后使用new Line()绘制线条,line1和line2绘制杆,line3绘制绳子,然后用new Circle()命令画圆,circle当做小人的头,用line4、line5画小人的手、line6画身子和line7、line8画脚,准备做好后,创建一个Pane面板,然后使用getChildren()方法中的add()方法将所有小组件放到面板中。

1.3系统测试

1.4代码展示

package version2;import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;/*** @Auther: paradise* @Date: 2021/6/24 - 06 - 24 - 16:33*/
public class Executioner extends Application {@Overridepublic void start(Stage primaryStage) throws Exception {Pane pane = new Pane();Arc arc = new Arc(80,280,50,25,0,180);arc.setFill(Color.WHITE);arc.setStroke(Color.BLACK);Line line1 = new Line(80,255,80,30);Line line2 = new Line(80,30,260,30);Line line3 = new Line(260,30,260,50);Circle circle = new Circle(260,80,30);circle.setStroke(Color.BLACK);circle.setFill(Color.WHITE);Line line4 = new Line(260-30*Math.cos(Math.toRadians(30)),80+30*Math.sin(Math.toRadians(30)),260-100*Math.sin(Math.toRadians(60)),160);Line line5 = new Line(260+30*Math.cos(Math.toRadians(30)),80+30*Math.sin(Math.toRadians(30)),260+100*Math.sin(Math.toRadians(60)),160);Line line6 = new Line(260,110,260,210);Line line7 = new Line(260,210,260-100*Math.sin(Math.toRadians(60)),275);Line line8 = new Line(260,210,260+100*Math.sin(Math.toRadians(60)),275);pane.getChildren().addAll(arc,line1,line2, line3,circle,line4,line5,line6,line7,line8);Scene scene = new Scene(pane,400,300);primaryStage.setTitle("HangMan Game");primaryStage.setScene(scene);primaryStage.show();}}

2.1 题目说明

​ 结合以上两个功能,实现动画方式的侩子手游戏,当用户猜错 7 次,绞刑架上的人摆动。当一个单词完成后,用户使用回车键继续猜下一个单词。

初始状态如下:


2.2 分析过程

创建一个名为missNum和guessNum,都为int类型的私有数据域,missNum为猜错的次数,guessNum为猜测的次数,同时声明一个名为missWord、wordMessage、word,类型为String的私有数据域,由于题目要求,当全部输出错误的时候,小人需要晃动,所以我在这里设置了两个Pane面板,一个名为pane的面板用于整体布局,一个用于名为laterPane的面板,当回答七次之后,在上面绘制小人,然后让这个面板转动起来。arc用于绘制基座,line1和lin2用于绘制杆,名为message和word的Label标签用于显示信息,一个名为info用于显示错误信息,一个名为textField的文本域供用户输入,这里使用setLayoutX()方法和setLayoutY()方法进行布局。

设置完界面之后,便开始进行事件处理,使用getText()方法获取用户在文本框中输入的信息,系统在这个使用已经调用了chooseWord()方法随机生成了一个单词,用户没进行一次猜测的时候,guessNum都会加1,当missedNum小于7的时候,判断用户输入的字母是否在单词中,如果在的话,使用for循环和if判断语句看单词中是否出现多次,使用一个字符串str存储输入的字符,如果不在的话,str加上*号,每一次输入完成后,都需要将str赋值给wordMessage,如果猜测的单词和系统产生的单词相同,则把画出相应的部分,当猜测的时候,猜错一个单词就会依次画出绳子、小人的头、左手、身子、右手、左脚、右脚,这里我使用了一个switch判断,当猜测错误一次的时候,向面板中添加绳子;当猜测错误为两次时,向面板中添加头;当猜测错误为三次时,向面板中添加左手;当猜测错误为四次时,向面板中添加身体;当猜测错误为五次时,向面板中添加右手;当猜测错误为六次时,向面板中添加左腿;当猜测错误为七次时,向面板中添加右腿;然后将这些组件添加到laterPane面板里,我在这里使用setRotate方法进行面板的旋转,newRotate()方法进行角度设置,然后一个double类型的数据。

由于无论猜测成功还是失败,我们都需要重新开始游戏,所以我设置了一个事件处理,但按下回车键并且猜测成功或猜错次数大于7次的时候,重置面板,初始错误次数为0,猜测次数为0,并且面板上有基座和杆。

相关函数:

paintHead():画小人的头

PaintLeftArm():画小人的左手

PaintRope():画绳子

PaintRightArm():画小人的右手

PaintBody():画小人的身子

paintLeftLeg():画小人的左腿

PaintRightLeg():画小人的右腿

2.3 系统测试

2.4 代码展示

package version3;import javafx.application.Application;
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.scene.layout.Pane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Arc;
import javafx.scene.shape.Circle;
import javafx.scene.shape.Line;
import javafx.stage.Stage;
import javafx.util.Duration;import java.util.Random;/*** @Auther: paradise* @Date: 2021/6/24 - 06 - 24 - 16:35*/
public class Game3 extends Application {private int missedNum=0;private int guessNum=0;private String missWord = "";//错误信息private String wordMessage = "";//单词信息private String word = "";//随机的单词private Line line4 = new Line(260-30*Math.cos(Math.toRadians(30)),80+30*Math.sin(Math.toRadians(30)),260-100*Math.sin(Math.toRadians(60)),160);private  Line line5 = new Line(260, 30, 260, 50);private Line line6 =  new Line(260+30*Math.cos(Math.toRadians(30)),80+30*Math.sin(Math.toRadians(30)),260+100*Math.sin(Math.toRadians(60)),160);private  Line line7 = new Line(260, 110, 260, 210);private Line line8 = new Line(260, 210, 260 - 100 * Math.sin(Math.toRadians(60)), 270);private Line line9 = new Line(260, 210, 260 + 100 * Math.sin(Math.toRadians(60)), 275);private Circle circle = new Circle(260, 80, 30);@Overridepublic void start(Stage primaryStage) throws Exception{final Pane pane = new Pane();final Arc arc = new Arc(80,280,50,25,0,180);//底座arc.setFill(Color.WHITE);arc.setStroke(Color.BLACK);final Pane laterPane = new Pane();laterPane.setPrefSize(520,60);final Line line1 = new Line(80,255,80,30);//底座竖杆final Line line2 = new Line(80,30,260,30);//底座横杆pane.getChildren().addAll(arc,line1,line2);final Label message = new Label("Guess a word:");message.setLayoutX(220);message.setLayoutY(280);pane.getChildren().add(message);final Label words = new Label("******");words.setLayoutX(320);words.setLayoutY(280);pane.getChildren().add(words);final Label info = new Label("");//显示错误信息info.setLayoutX(220);info.setLayoutY(310);pane.getChildren().add(info);final TextField textField = new TextField();textField.setLayoutX(220);textField.setLayoutY(340);pane.getChildren().add(textField);textField.setOnKeyReleased(new EventHandler<KeyEvent>() {public void handle(KeyEvent event) {if (event.getCode() == KeyCode.ENTER && (wordMessage.equals(word) || missedNum >= 7)) {pane.getChildren().clear();missedNum = 0;guessNum = 0;words.setText("******");info.setText("");textField.setText("");wordMessage = "";missWord = "";pane.getChildren().addAll(arc, line1, line2, message, words, info, textField);}String chr = textField.getText().trim();if (!chr.equals("")) {if (missedNum % 7 == 0 && guessNum == 0) {String[] words = {"write", "that", "program", "animal", "version", "world"};word = chooseWord(words);}guessNum++;if (missedNum < 7) {if (word.indexOf(chr.charAt(0)) != -1) {String str = "";words.setText("");for (int j = 0; j < word.length(); j++) {if (chr.charAt(0) == word.charAt(j)) {str += chr.charAt(0);}else {if (wordMessage.length() > j) {if (wordMessage.charAt(j) != '*'){str += wordMessage.charAt(j);}else str += '*';}else str += '*';}}words.setText(str);wordMessage = str;if (wordMessage.equals(word)) {//猜词成功info.setText("Guess successfully.To continue the game,press Enter.");pane.getChildren().clear();laterPane.getChildren().addAll(line4,line5,circle);pane.getChildren().addAll(line1,line2,arc,laterPane,message,words,info,textField);}} else {missWord += chr.charAt(chr.length()-1);switch (missedNum) {case 0:pane.getChildren().add(paintRope());break;case 1:pane.getChildren().add(paintHead());break;case 2:pane.getChildren().add(paintLeftArm());break;case 3:pane.getChildren().add(paintBody());break;case 4:pane.getChildren().add(paintRightArm());break;case 5:pane.getChildren().add(paintLeftLeg());break;case 6:pane.getChildren().add(paintRightLeg());pane.getChildren().clear();laterPane.getChildren().addAll(line4,line5,line6,line7,line8,line9,circle);pane.getChildren().addAll(line1,line2,arc,laterPane,message,words,info,textField);EventHandler<ActionEvent> eventHandler = e -> {laterPane.setRotate(newRotate());//旋转角度setRotate(角度)};Timeline rotateFan = new Timeline(new KeyFrame(Duration.millis(100), eventHandler));rotateFan.setCycleCount(Timeline.INDEFINITE);rotateFan.play();//开始动画break;}missedNum++;info.setText("Missed Letters:" + missWord);}} else {info.setText("Guess failed!To continue the game,press Enter");}}textField.setText("");}});Scene scene = new Scene(pane, 800, 600, Color.WHITE);primaryStage.setTitle("Hangman Game");primaryStage.setScene(scene);primaryStage.show();}//选择数组中一个元素的方法public static String chooseWord(String[] s){Random random = new Random();int num = random.nextInt(s.length);String word = s[num];return word;}private Circle paintHead() {//头circle.setStroke(Color.BLACK);circle.setFill(Color.WHITE);return circle;}private Line paintLeftArm() {return line4;//左胳膊}private Line paintRope() {return line5 ;//底座吊绳}private Line paintRightArm() {return line6;//右胳膊}private Line paintBody() {return line7;//躯干}private Line paintLeftLeg() {return line8;//左腿}private Line paintRightLeg() {return line9;//右腿}public static void main(String[] args) {launch(args);}boolean direction=true;int rotate=10;int speed=5;int counts=0;public double newRotate(){if(rotate/80 == 1||rotate/80 == -1) {direction = !direction;}if (direction){counts++;return rotate = (rotate + speed) % 360;}else{return rotate = (rotate - speed) % 360;}}
}
speed=5;int counts=0;public double newRotate(){if(rotate/80 == 1||rotate/80 == -1) {direction = !direction;}if (direction){counts++;return rotate = (rotate + speed) % 360;}else{return rotate = (rotate - speed) % 360;}}
}

使用JavaFX完成刽子手游戏相关推荐

  1. C++ 刽子手游戏(Hangman Judge, UVa 489)(算法竞赛入门经典例题4-2)

    题目:刽子手游戏是一个简单的猜单词游戏,每次可以猜一个字母,如果单词内有这个字母,此单词内所有该字母都会显示,如果没有该字母,则记一笔错误,若满7笔错误,则输掉()猜已经猜出的单词也算错误).本题编写 ...

  2. 蓝桥杯 真题 救济金发放、分糖果、刽子手游戏

    题目 n(n<20)个人站成一圈,逆时针编号为1-n.有两个官员,A从1开始逆时针数,B从n开始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上 ...

  3. JavaFX战旗类游戏开发 第一课 概述

    用JavaFX开发的地图编辑器已经可以正式使用了.也写了JavaFX读取地图的库,准备抽空实现U3D的地图读取,然后再进行游戏开发. 虽然在我的JavaFX游戏开发库内已经实现了TMX地图的读取,但是 ...

  4. Javafx 实现国际象棋游戏

    基本规则 棋子马设计"日"的移动方式 兵设计只能向前直走,每次只能走一格.但走第一步时,可以走一格或两格的移动方式 请为后设计横.直.斜都可以走,步数不受限制,但不能越子的移动方式 ...

  5. javafx 制作五子棋游戏——简单MVC框架

    目录 游戏描述 上手须知 源码地址 项目结构 一.实体层 二.视图层 三.控制器 四.测试 效果图 游戏描述 一个五子棋游戏,能实现双方黑白对决,当一方获胜时给出提示信息,利用Javafx实现GUI界 ...

  6. JavaFX战旗类游戏开发 第三课 创建游戏角色

    在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.Graph ...

  7. JavaFX战旗类游戏开发 第二课 游戏地图绘制

    在上一节课中,我们对即将要完成的战旗Demo有了一个大概的了解,本节课当中,我们将会学习绘制游戏地图. 自从在JavaFX 2.2中增加了Canvas相关的功能,我们就可以使用Canvas来实现游戏绘 ...

  8. 【ACM】UVa 489 刽子手游戏(自顶向下)

    [题目] Hangman Judge是一个猜英文单字的小游戏(在电子字典中常会看到),游戏规则如下: 1.答案单字写在纸上(每个字元一张纸),并且被盖起来,玩家每次猜一个英文字元(letter). 2 ...

  9. UVa 489,紫书P79,刽子手游戏

    题目链接:https://uva.onlinejudge.org/external/4/489.pdf 这个题很像之前的一个拓扑排序的题目,思路类似咯. 程序模块化: 每次判断一个字母,lose,wi ...

最新文章

  1. Nature:拟南芥微生物组功能研究3人工重组微生物群落
  2. 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
  3. jQueryEasyUI Messager基本使用
  4. flex java 上传下载_完整的Flex多文件上传实例
  5. python需要下载哪些软件-学python下载什么软件开发
  6. Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
  7. 黑马程序员——高新技术(银行业务调度系统)
  8. cpu性能测试软件 国际象棋,国际象棋测试
  9. 华硕笔记本电脑电池保修范围
  10. gitbook:node_modules\npm\node_modules\graceful-fs\polyfills.js:287
  11. 国产MCU替代STM8S003方案汇总
  12. 计算机可以调剂到资源与环境吗,资源与环境求调剂 - 考研 - 小木虫 - 学术 科研 互动社区...
  13. matlab ts模糊工具箱,通过算例熟悉MATLAB模糊控制工具箱
  14. C语言--if…if…和if…else if的区别
  15. 小诀窍:不妨尝试从交付质量上打败对手
  16. 软件测试人在深圳有哪些值得去的互联网公司【软件测试人员专供版】
  17. windows系统用微软账户登录情况下,Hyper-V下虚拟机共享
  18. Revit二次开发之CAD线的翻模--梁的翻模
  19. nLite工具集成驱动到windows安装光盘(操作简化版)
  20. R语言如何绘制PCA图(四)

热门文章

  1. 【提升coding能力】100道Python练习题11-20
  2. Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)
  3. java 图像梯度检测_opencv学习笔记(六)---图像梯度
  4. linkerd2 php 微服务,在 Linkerd2 中进行流量拆分
  5. Fabric链码常用API文档
  6. 元宇宙的驱动力是什么?
  7. python关键词对联_使用百度 AI 进行智能写诗 智能春联
  8. 虚拟机的显示屏幕修改大小
  9. ThinkPHP5.1.x 框架源码分析之框架的灵魂
  10. STL容器之数据结构图解