题目描述:成语是中国汉字语言词汇中一部分定型的词组或短句,是中国传统文化的一大特色,有固定的结构形式和固定的说法,表示一定的意义,在语句中是作为一个整体来应用的,承担主语、宾语、定语等成分。请设计猜四字成语游戏。
功能需求:
(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;
}
}