Java题做一下猜成语游戏

题目描述:成语是中国汉字语言词汇中一部分定型的词组或短句,是中国传统文化的一大特色,有固定的结构形式和固定的说法,表示一定的意义,在语句中是作为一个整体来应用的,承担主语、宾语、定语等成分。请设计猜四字成语游戏。
功能需求:
(1) 设计一个四字成语类Idiom,包含成语内容,多级解释。
(2) 设计一个猜四字成语游戏类Game,可以随机产生成语的解释信息,显示到控制台,等待用户输入猜测到的成语。
(3) 用户作答后,系统可以判断用户输入的成语内容是否正确,如果正确,标记正确,继续一下;如果不正确,标记错误,让用户继续做答,直到猜词成功。
(4) 设计提示功能,引导用户猜成功。如果用户根据一级解释没能回到正确,继续展开第二级解释,如果用户还是回答错误,继续展开更多级别的解释,直到全部解释展开完或者用户回答正确,包括不同图标提示。
(5) 设置关卡和积分,根据使用提示的次数,错误次数计算积分。
(6) 每次游戏之后积分相关数据可以再次查询,并设置排行榜。
(7) 可以选择悔一步,认输,再来一盘。
(8) 使用外部文件存储相关数据。
进阶:增设学习模式,练习模式,扩展可以自我完善的成语库等。


import java.util.List;

/**数据*/
public class Idiom {

    private String phrase ;

    public Idiom(String phrase) {
        this.phrase = phrase;
    }

    public Idiom(String phrase, List<Explain> explains) {
        this.phrase = phrase;
        this.explains = explains;
    }

    private List<Explain> explains;

    public static class Explain {
        private String content;

        public Explain(String content) {
            this.content = content;
        }

        public String getContent() {
            return content;
        }

        public void setContent(String content) {
            this.content = content;
        }
    }

    public String getPhrase() {
        return phrase;
    }

    public void setPhrase(String phrase) {
        this.phrase = phrase;
    }

    public List<Explain> getExplains() {
        return explains;
    }

    public void setExplains(List<Explain> explains) {
        this.explains = explains;
    }
}
import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

/**
 * 猜成语游戏,费眼睛
 */
public class Game {
    private List<Idiom> idioms;
    private static final String DATA_FILE_PATH = "C:\\Users\\soft\\Desktop\\grams.txt";
    private static int score = 0;
    private static int idx = 0;

    public static void main(String[] args) {
        Game game = new Game();
        game.initData(DATA_FILE_PATH);
        System.out.println("=============猜成语游戏开始咯============");
        System.out.println("规则:");
        System.out.println("    输入【0】悔一步");
        System.out.println("    输入【1】显示下一级提示信息");
        System.out.println("    输入【2】认输");
        System.out.println("    输入【3】再来一盘");
        System.out.println("    输入【汉字】代表猜测的成语");
        Idiom idiom = game.getIdiom(idx);
        boolean flag = true;
        if (idiom == null) {
            System.out.println("您已经通关了");
            System.out.println("====游戏结束====");
            idx = 0;
            return;
        }

        List<Explain> explains = idiom.getExplains();
        int i = 0;
        while (flag) {
            if (i == 0) {
                System.out.println("本题共可提示【" + explains.size() + "】次!");
            }
            if (i >= explains.size()) {
                System.out.println("本题无可提示信息,请作答:");
            } else {
                System.out.print("第" + (i + 1) + "次提示:");
                System.out.print(game.getExplain(explains, i));
                System.out.println();
            }
            Scanner scanner = new Scanner(System.in);
            String str = scanner.next();
            if (str == null || "".equals(str)) {
                continue;
            }
            boolean as = false;
            boolean next = false;
            switch (str) {
                case "0":
                    i--;
                    break;
                case "1":
                    i++;
                    break;
                case "2":
                    flag = false;
                    break;
                case "3":
                    as = true;
                    next = true;
                    break;
                default:
                    as = str.equals(idiom.getPhrase());
                    if (as) {
                        System.out.println("回答正确,积分+1!");
                    } else {
                        System.out.println("回答错误,请继续下一题!");
                        next = true;
                    }
                    break;
            }
            if (as) {
                if (!next) {
                    score = score + 1;
                }
                idx++;
                idiom = game.getIdiom(idx);
                if (idiom != null) {
                    explains = idiom.getExplains();
                    i = 0;
                } else {
                    System.out.println("您已经通关了");
                    System.out.println("====游戏结束====");
                    flag = false;
                }
            }
        }
        System.out.println("您本次游戏获得:" + score + "分");
        System.out.println("====游戏结束====");
    }

    private String getExplain(List<Explain> explains, int index) {
        if (explains != null) {
            return explains.get(index).getContent();
        }
        return null;
    }

    /**
     * 获取成语
     *
     * @param idx 索引
     * @return 成语
     */
    private Idiom getIdiom(int idx) {
        if (idioms == null || idioms.size() == 0 || idx == idioms.size()) {
            return null;
        }
        return idioms.get(idx);
    }

    /**
     * 初始化数据
     *
     * @param filePath 数据存储地址
     */
    private void initData(String filePath) {
        if (idioms == null) {
            idioms = new ArrayList<>();
        }
        List<String> datas = readFile(filePath);
        if (datas.size() == 0) {
            System.out.println("数据文件无内容!");
            return;
        }
        for (String data : datas) {
            if (data == null || "".equals(data)) {
                continue;
            }
            String[] ds = data.split("\\|");
            List<Explain> explains = new ArrayList<>();
            for (int i = 1; i < ds.length; i++) {
                explains.add(new Explain(ds[i]));
            }
            idioms.add(new Idiom(ds[0], explains));
        }
    }

    /**
     * 读取文件
     * 内容需要按照固定格式存储
     * 四字成句|一级解释|二级解释|三级解释|四级解释...
     */
    public static List<String> readFile(String filePath) {
        List<String> list = new ArrayList<>();
        try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(filePath), "UTF-8"))) {
            String s ;
            while ((s = br.readLine()) != null) {
                list.add(s);
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
        return list;
    }
}