应用JavaFX实现的填字游戏

题目来自我们老师这次布置的一个大作业,说实话,刚开始觉得难度超纲了,毕竟javaFX我们才刚开头,基本上没讲啥,全靠自学…自己看书敲代码,学习书上案例,然后书上没有的就百度,边学边做,现学现卖,题目基本的要求还是都实现了,当然什么时候的话还是可以继续完善一下的。

题目摘要
填字游戏是我们日常生活中用来锻炼脑力、考验词汇量的游戏, 本次作业请各位同学用图形用户界面或者文字界面设计一个武侠小说名字填词游戏,具体要求如下:
(1)请设计一个友好、方便的用户交互界面,如果采用图形用户界面最好;
(2)数据准备:请同学们根据个人爱好,自行创建一个 names.dat文件,文件第一行是一个整数N,表示文件中武侠小说名字的数量,此后内容每一行是一个武侠小说的名字,后面列出 5 个该小说中的主要角色名字,N≥20;
(3)程序开始自上向下 4 个单行文本框,内容为空;点击“开始”后,文本框随机填充武侠小说的名字和其中主要角色的名字,填充要求如下:
首先随机选择一个武侠小说,并根据小说名字的长度,随机去掉名字中 50%的字符(可以连续,也可以不连续);然后再次随机,从该小说列出的 5 个主要角色名字中选取 3 个,每个名字随机选择 1 个字依次显示在剩下的三个文本框中;游戏初始化完毕。
(4)用户可以通过输入的方式对小说名字和主要角色名字进行补全,输入完成后,点击“判定”按钮,程序判断该输入是否正确, 都正确弹出对话框提示用户正确并再次出题;不正确的将对应文本框中文字颜色设置为红色,三次错误后,程序显示正确结果并提示用户游戏结束,根据答对次数显示等额小星星给出分数(可以考虑制作排行榜);
(5)点击“开始”可重新开始游戏; 实验要求:
1.完成时间为 3 个小时,完成后可以找辅导老师检查;
2.要求用户界面友好,可以支持除程序作者外其他人使用, 如采用图形化 实现,有额外加分;
3.实验成绩 10 分,期中 20%受程序编写风格影响。

主要实现过程

实现过程

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.EventHandler;
import javafx.geometry.HPos;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.image.Image;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import java.io.File;
import java.util.ArrayList;
import java.util.Scanner;
import javafx.scene.layout.Background;
import javafx.scene.layout.BackgroundImage;
import javafx.scene.layout.BackgroundSize;

public class MooYiGame extends Application {
	
	File file = new File("E:\\name.txt");
	ArrayList<String> bookarrayList = new ArrayList<String>();		
	GridPane pane = new GridPane();
	static ArrayList<String> answerList = new ArrayList<String>();
	static ArrayList<String> filledList = new ArrayList<String>();
	static ArrayList<TextField> textFields = new ArrayList<TextField>();
	int JudgeTimes = 0;
	int right = 0;

	public void start(Stage primaryStage) throws Exception {
		
		Image image = new Image("file:E:\\kongfu.png");		
		BackgroundSize cover=new BackgroundSize(0, 0, false, false, true, true);
		Background bk = new Background( new BackgroundImage(image, null, null, null, cover));
		pane.setBackground(bk);
		
		Scanner input = new Scanner(file);		
		int numOfBooks = input.nextInt();
		while(input.hasNext()) 
			bookarrayList.add(input.nextLine());	
		input.close();

		Button btBegin = new Button("开始游戏");
		Button btJudge = new Button("判断正误");
		Button btAgain = new Button("再来一局"); 
		
		HBox btHBox = new HBox();
		btHBox.getChildren().addAll(btJudge,btAgain);
		btHBox.setSpacing(80);
		btHBox.setAlignment(Pos.CENTER);
			
		pane.setAlignment(Pos.CENTER);
		pane.setPadding(new Insets(15,15,15,15));
		pane.setHgap(10);
		pane.setVgap(10);	
		
		Label label = new Label("填字游戏");
		label.setFont(Font.font("华文行楷",50));
	
		pane.add(label, 0, 0);
		GridPane.setHalignment(label, HPos.CENTER);
		pane.add(btBegin, 0, 5);
		GridPane.setHalignment(btBegin, HPos.CENTER);				
		
		btBegin.setOnAction(e -> {	
			pane.getChildren().remove(btBegin);			
			InitialGame(numOfBooks);			
			pane.add(btHBox, 0, 12);					
		});
		
		btJudge.setOnAction(e ->{
			JudgeTimes++;			
			if(JudgeTimes <= 4) {
				right = 0;
				if(JudgeTimes < 4)
				for(int i = 0; i < textFields.size();i++) {
					TextField tf = textFields.get(i);
					String ans = tf.getText();
					filledList.add(i,ans);
					if(!filledList.get(i).equals(answerList.get(i))) 
						tf.setStyle("-fx-text-fill:red;-fx-border-color:red");																				
					else {
						right++;
						tf.setStyle("-fx-border-color:gray;-fx-border-color:black");
					}				
				}	
				if(right == answerList.size() || JudgeTimes == 4) {
					Label scoreLabel;
					if(right == answerList.size()) {
						JudgeTimes = 5;
						scoreLabel = new Label(" 知识就是力量\n" + "真棒,全对了!"); 
					}						
					else{
						String score = "得分:" + right + "/" + answerList.size() + "\n学海无涯~";
						scoreLabel = new Label(score);
					}					
					Stage secondStage = new Stage();
	                scoreLabel.setFont(Font.font("华文行楷",50));
	                
	                StackPane secondPane = new StackPane(scoreLabel);		                
	        		secondPane.setBackground(bk);	                
	                Scene secondScene = new Scene(secondPane, 400, 250);
	                secondStage.setScene(secondScene);
	                secondStage.show();	
				}				
			}
		});
		
		btAgain.setOnAction(e-> {	
			JudgeTimes = 0;
			if(!answerList.isEmpty())  answerList.clear();
			if(!textFields.isEmpty())   textFields.clear();
			if(!filledList.isEmpty())  filledList.clear();
			
			pane.getChildren().clear();			
			pane.add(label, 0, 0);
			InitialGame(numOfBooks);			
			pane.add(btHBox, 0, 12);		
		});
		
		//pane.setGridLinesVisible(true);
		Scene scene = new Scene(pane,500,500);
		primaryStage.setTitle("@MooYi");
		primaryStage.setScene(scene);
		primaryStage.setOnCloseRequest(new EventHandler<WindowEvent>(){
            public void handle(WindowEvent event) {
                Platform.exit();
            }
        });
		primaryStage.show();
	}
	
	void InitialGame(int numOfBooks) {
		JudgeTimes++;
		int line = (int)(Math.random()*numOfBooks + 1 );
		ArrayList<String> peopleNameList = new ArrayList<String>();
		String s = bookarrayList.get(line);			
		String s1[] = s.trim().split(" ");
		for (int i = 0; i < s1.length; i++) 
			if(i != 0)
				peopleNameList.add(s1[i]);

		Label l1 = new Label("填书名");	
		l1.setFont(Font.font("华文楷体",22));
		pane.add(l1, 0, 2);
		GridPane.setHalignment(l1, HPos.CENTER);			
		namePane(s1[0], 3, 1);
		
		Label l2 = new Label("填人名");	
		l2.setFont(Font.font("华文楷体",22));
		pane.add(l2, 0, 5);
		GridPane.setHalignment(l2, HPos.CENTER);
		
		int curline = 6;
		int nameNum = 5;
		for(int i = 0; i < 3; i++) {
			int t = (int)(Math.random()*nameNum);
			nameNum--; 
			String string1 = peopleNameList.get(t);
			peopleNameList.remove(t);
			namePane(string1, curline++,0);
		}							
	}
	
	 void namePane(String string,int i,int x){
		int len = string.length();
		int r = (int)(Math.random()*len);
		int r1 = (int)(Math.random()*len);
		while(r == r1) 
			r1 = (int)(Math.random()*len);
		
		char c = string.charAt(r);
		String s = c+"";
		Label label1 = new Label(s);
		String s2 = string.charAt(r1) + "";
		Label label2 = new Label(s2);
		
		HBox hBox = new HBox(10);
		hBox.setAlignment(Pos.CENTER);
		
		for(int t = 0; t < len; t++) {
			TextField tField = new TextField();
			tField.setPrefColumnCount(1);	
			tField.setStyle("-fx-border-color:gray");
			if(t==r)
				hBox.getChildren().add(label1);	
			else if(x!=0 && t==r1) 
				hBox.getChildren().add(label2);	
			else{
				textFields.add(tField);
				hBox.getChildren().add(tField);
				String ch = string.charAt(t) + "";
				answerList.add(ch);				
			}
		}			
		pane.add(hBox, 0, i);		
	}	 	 

	 public static void main(String args[]) {
		 launch(args);
	 }
}

我先测试的文件读取

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.Scanner;

public class ReadFromFile {

	public static void main(String[] args) throws FileNotFoundException {
		// TODO Auto-generated method stub
			
		File file = new File("E:\\name.txt");

		Scanner input = new Scanner(file);
		PrintWriter output = new PrintWriter(file);
		output.print("20\n" + 
				"飞狐外传 胡斐 程灵素 袁紫衣 苗人凤 福康安\n" + 
				"雪山飞狐 胡斐 苗人凤 田归农 宝树 胡一刀\n" + 
				"连城诀 狄云 水笙 丁典 陆天抒 花铁干\n" + 
				"天龙八部 乔峰 段誉 天山童姥 虚竹 阿紫 \n" + 
				"射雕英雄传 郭靖 黄蓉 周伯通 洪七公 杨康\n" + 
				"白马啸西风 李文秀 苏普 阿曼 马家骏 苏鲁克\n" + 
				"鹿鼎记 韦小宝 陈近南 吴三桂 鳌拜 沐剑屏\n" + 
				"笑傲江湖 令狐冲 东方不败 任盈盈 岳不群 林平之\n" + 
				"书剑恩仇录 陈家洛 霍青桐 喀丝丽 张召重 赵半山\n" + 
				"神雕侠侣 小龙女 杨过 黄蓉 郭芙 欧阳锋\n" + 
				"侠客行 石破天 白阿绣 闵柔 石清 谢烟客\n" + 
				"倚天屠龙记 张无忌 周芷若 灭绝师太 赵敏 郭襄\n" + 
				"碧血剑 袁承志 温青青 袁祟焕 夏雪宜 阿九\n" + 
				"鸳鸯刀 林玉龙 逍遥子 任飞燕 常长风 花剑影\n" + 
				"越女剑 阿青 范蠡 西施 勾践 越王\n" + 
				"白发魔女传 练霓裳 卓一航 穆九娘 岳鸣珂 铁珊瑚\n" + 
				"三国演义 曹操 关羽 赵云 诸葛亮 周瑜\n" + 
				"红楼梦 贾宝玉 林黛玉 薛宝钗 王熙凤 贾母\n" + 
				"西游记 孙悟空 唐僧 沙和尚 猪八戒 白骨精\n" + 
				"水浒传 吴勇 武松 林冲 鲁智深 李逵");
		output.close();
		ArrayList<String> bookarrayList = new ArrayList<String>();
		int numOfBooks = input.nextInt();
		System.out.println(numOfBooks);
		while(input.hasNext()) {
			bookarrayList.add(input.nextLine());
		}
		
		System.out.println(bookarrayList.get(5));

		String s = bookarrayList.get(5);
		String s1[] = s.trim().split(" ");
		for (int i = 0; i < s1.length; i++) {
		System.out.println(s1[i]);
		}	
			
		input.close();
	}
}

运行结果
在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述在这里插入图片描述

更新了一下报错显示方式

关于在Textfiled里面如何修改获得的输入字体颜色的问题,我百度搜了好多一直没找到,经某网上大佬指教,终于知道了
大概在我的代码的第88行
tf.setStyle("-fx-text-fill:red;-fx-border-color:red");
"-fx-text-fill:red"这个就是修改填入的文本颜色的
"-fx-border-color:red"这个是修改TextField边界颜色(边框)

更新了一下报错显示方式
背景图片源自网站,点击进入,若侵权删请联系删除http://www.51yuansu.com/bg/cljvcbhkky.html

在这里插入图片描述
第一次做javaFX,实际上还没学很多,并且我觉得在最后得分设计不太好,有烂尾嫌疑,哈哈哈哈,继续努力~

主要应用的方法:

  1. 背景图片的插入
  2. GridPane
  3. Hbox
  4. TextField
  5. 通过按钮事件打开一个新窗口的方法

ps:关于得分设置的话,如果判断全对,就出结果,如果有错误边框会变红,你可以修改然后继续判断,最多判定三次,然后会出现你的得分窗口。我觉得最大的败笔就是在这个得分显示这里,毕竟只有生硬的文字显示,等实力允许了的话可以做的更好一点。

  • 15
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值