使用JavaFX完成刽子手游戏
使用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完成刽子手游戏相关推荐
- C++ 刽子手游戏(Hangman Judge, UVa 489)(算法竞赛入门经典例题4-2)
题目:刽子手游戏是一个简单的猜单词游戏,每次可以猜一个字母,如果单词内有这个字母,此单词内所有该字母都会显示,如果没有该字母,则记一笔错误,若满7笔错误,则输掉()猜已经猜出的单词也算错误).本题编写 ...
- 蓝桥杯 真题 救济金发放、分糖果、刽子手游戏
题目 n(n<20)个人站成一圈,逆时针编号为1-n.有两个官员,A从1开始逆时针数,B从n开始顺时针数.在每一轮中,官员A数k个就停下来,官员B数m个就停下来(注意有可能两个官员停在同一个人上 ...
- JavaFX战旗类游戏开发 第一课 概述
用JavaFX开发的地图编辑器已经可以正式使用了.也写了JavaFX读取地图的库,准备抽空实现U3D的地图读取,然后再进行游戏开发. 虽然在我的JavaFX游戏开发库内已经实现了TMX地图的读取,但是 ...
- Javafx 实现国际象棋游戏
基本规则 棋子马设计"日"的移动方式 兵设计只能向前直走,每次只能走一格.但走第一步时,可以走一格或两格的移动方式 请为后设计横.直.斜都可以走,步数不受限制,但不能越子的移动方式 ...
- javafx 制作五子棋游戏——简单MVC框架
目录 游戏描述 上手须知 源码地址 项目结构 一.实体层 二.视图层 三.控制器 四.测试 效果图 游戏描述 一个五子棋游戏,能实现双方黑白对决,当一方获胜时给出提示信息,利用Javafx实现GUI界 ...
- JavaFX战旗类游戏开发 第三课 创建游戏角色
在上一节课程中,我们学习了在JavaFX中绘制游戏地图.这一节课,我们将会创建我们的游戏角色. 首先,同样的,我们创建一个简单的基类. import javafx.scene.canvas.Graph ...
- JavaFX战旗类游戏开发 第二课 游戏地图绘制
在上一节课中,我们对即将要完成的战旗Demo有了一个大概的了解,本节课当中,我们将会学习绘制游戏地图. 自从在JavaFX 2.2中增加了Canvas相关的功能,我们就可以使用Canvas来实现游戏绘 ...
- 【ACM】UVa 489 刽子手游戏(自顶向下)
[题目] Hangman Judge是一个猜英文单字的小游戏(在电子字典中常会看到),游戏规则如下: 1.答案单字写在纸上(每个字元一张纸),并且被盖起来,玩家每次猜一个英文字元(letter). 2 ...
- UVa 489,紫书P79,刽子手游戏
题目链接:https://uva.onlinejudge.org/external/4/489.pdf 这个题很像之前的一个拓扑排序的题目,思路类似咯. 程序模块化: 每次判断一个字母,lose,wi ...
最新文章
- Nature:拟南芥微生物组功能研究3人工重组微生物群落
- 分布式消息总线,基于.NET Socket Tcp的发布-订阅框架之离线支持,附代码下载
- jQueryEasyUI Messager基本使用
- flex java 上传下载_完整的Flex多文件上传实例
- python需要下载哪些软件-学python下载什么软件开发
- Python编程 - 不调用相关choose库函数,“众数“挑选器、随机挑选器 的源码编程实现
- 黑马程序员——高新技术(银行业务调度系统)
- cpu性能测试软件 国际象棋,国际象棋测试
- 华硕笔记本电脑电池保修范围
- gitbook:node_modules\npm\node_modules\graceful-fs\polyfills.js:287
- 国产MCU替代STM8S003方案汇总
- 计算机可以调剂到资源与环境吗,资源与环境求调剂 - 考研 - 小木虫 - 学术 科研 互动社区...
- matlab ts模糊工具箱,通过算例熟悉MATLAB模糊控制工具箱
- C语言--if…if…和if…else if的区别
- 小诀窍:不妨尝试从交付质量上打败对手
- 软件测试人在深圳有哪些值得去的互联网公司【软件测试人员专供版】
- windows系统用微软账户登录情况下,Hyper-V下虚拟机共享
- Revit二次开发之CAD线的翻模--梁的翻模
- nLite工具集成驱动到windows安装光盘(操作简化版)
- R语言如何绘制PCA图(四)
热门文章
- 【提升coding能力】100道Python练习题11-20
- Python数据分析:异常值检验的两种方法 -- Z 分数 上下分位点(放入自写库,一行代码快速实现)
- java 图像梯度检测_opencv学习笔记(六)---图像梯度
- linkerd2 php 微服务,在 Linkerd2 中进行流量拆分
- Fabric链码常用API文档
- 元宇宙的驱动力是什么?
- python关键词对联_使用百度 AI 进行智能写诗 智能春联
- 虚拟机的显示屏幕修改大小
- ThinkPHP5.1.x 框架源码分析之框架的灵魂
- STL容器之数据结构图解