编写一个猜成语的小游戏。
要求:使用一个字符串数组来保存10个四字成语,例如:
String [] idioms = {“凉拌黄瓜”, “红烧肘子”, …};
使用一个字符数组来保存20个无关字符,例如:
String [] chars = {‘吃’, ‘喝’, ‘胡’, …};
每次游戏开始时,随机选择一个成语,然后提取其中的4个汉字,再从字符数组中随机选择另外6个汉字,组成一个10个汉字的数组(汉字顺序随机)。注意!如果成语中,有重复的汉字,则只算一个,那么要从字符数组中多选出汉字。然后提示用户成语中包含这10个汉字,让用户猜测成语,用户输入汉字的编号,程序反馈汉字在成语中的位置。用户只有6次猜错机会,当6次机会用完后,游戏结束(猜对不占用次数)。当用户完全猜测出成语后,程序输出用户猜错的次数。
package GuessIdioms;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Random;
import java.util.Scanner;
/**
*
* @author 芳芳
* @usefor learn
*/
public class guessIdioms {
private static String[] idioms= {"凉拌黄瓜","开开心心","努力学习","未来可期","不由自主","一事无成","百日做梦","先入为主","青山绿水","东山再起"};
private static String[] chars = {"吃","喝","胡","朱","龙","老","居","宇","化","放"};
private static String str = "[○○○○]";
private static Map<Character, Integer> idiomNumsMap = new HashMap<Character,Integer>();//统计成语字符类型个数
public static void main(String[] args) {
int count = 6; //剩余猜测次数
int num = 0;
int tcount =0 ; //记录猜对次数
char[] t= str.toCharArray();
List<Integer> listNum = new ArrayList<Integer>();
Map<Character, Integer> cMap = new HashMap<Character,Integer>();//统计猜对词的个数
Random random = new Random();
int index = random.nextInt(10); //产生[0,10)之间的随机整数
String idiom = idioms[index];
String s = randomSort(idiom);
System.out.println("猜测的成语:"+idiom);
System.out.println("四字成语中包含的汉字如下:");
for(int i=0;i<s.length();i++) {
System.out.print(i+1+"."+s.charAt(i)+";");
}
System.out.println();
System.out.println(str);
@SuppressWarnings("resource")
Scanner in = new Scanner(System.in);
System.out.println("剩余猜测次数为"+count+"次,请输入你的猜测:");
while(true) {
num= in.nextInt();
if(num<1 ||num >10) {
count--;
if(count!=0) {
System.out.println("要求输入数字在1~10,剩余猜测次数为"+count+"次,请再次输入你的猜测");
}else {
System.out.println("要求输入数字在1~10,并且你已经Game Over了");
break;
}
continue;
}
char ss = s.charAt(num-1); //选中的字符
if(idiom.indexOf(ss)!=-1 && (cMap.get(ss)==null ||cMap.get(ss) < idiomNumsMap.get(ss))) {
//猜中其中一个词
int index2 = 0;
if(cMap.get(ss)==null|| cMap.get(ss)>1 ) {
index2 = idiom.indexOf(ss);
t[index2+1]=ss;
}else {
index2=idiom.lastIndexOf(ss);
t[index2+1]=ss;
}
System.out.println(t);
System.out.println("恭喜你,"+"“"+ss+"”"+"字在成语中的位置是:"+(index2+1));
tcount++;
if(tcount!=4) {
System.out.println("剩余猜测次数为"+count+"次,请再次输入你的猜测:");
}
if(cMap.get(ss)!=null) {//统计猜对词的个数
cMap.put(ss, cMap.get(ss)+1);
}else {
cMap.put(ss, 1);
}
}else if(idiom.indexOf(ss) == -1 && !listNum.contains(num)){
//没有猜中
count--;
if(count!=0) {
System.out.println("对不起,“"+ss+"”字不在成语中,剩余猜测次数为"+count+"次"+",请再次输入你的猜测:");
}else {
System.out.println("对不起,“"+ss+"”字不在成语中,并且你已经Game Over了");
break;
}
}else {
//重复猜测
count--;
if(count==0) {
System.out.println("对不起,“"+ss+"”字你已经猜过了,并且你已经Game Over了");
break;
}else {
System.out.println("对不起,“"+ss+"”字你已经猜过了,剩余猜测次数为"+count+"次"+",请再次输入你的猜测:");
}
}
if(tcount==4 && count!=0) {
System.out.println("太棒了!你一共猜错了"+(6-count)+"次,已经猜出了整个成语!");
break;
}
listNum.add(num);
}
}
public static String randomSort(String idiom) {
List<String> sList = new ArrayList<String >();
List<String> rList = new ArrayList<String>();
List<Integer> list = new ArrayList<Integer>();
new ArrayList<String>();
String string ="";
int randSeq = -1;
idiomNumsMap = idiomNum(idiom);
for(String str:chars) {
sList.add(str);
}
for(int i=0;i<10-idiomNumsMap.size();i++) {
Random random = new Random();
randSeq = random.nextInt(sList.size()); //产生[0,10)之间的随机整数
rList.add(sList.get(randSeq));
sList.remove(randSeq);
}
for(@SuppressWarnings("rawtypes") Map.Entry entry:idiomNumsMap.entrySet()) {
do {
Random random = new Random();
randSeq = random.nextInt(rList.size()); //产生[0,10)之间的随机整数
}while(list.contains(randSeq));
rList.add(randSeq, entry.getKey()+"");
list.add(randSeq);
}
for(int i=0;i<rList.size();i++) {
string +=rList.get(i);
}
return string;
}
public static Map<Character, Integer> idiomNum(String str){
Map<Character, Integer> result = new HashMap<Character,Integer>();
for(int i=0;i<str.length();i++) {
char ch = str.charAt(i);
if(result.get(ch)!=null) {
result.put(ch, result.get(ch)+1);
}else {
result.put(ch, 1);
}
}
return result;
}
}
运行结果如下‘