JAVA实现猜成语小游戏(作业记录)

编写一个猜成语的小游戏。
要求:使用一个字符串数组来保存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; 
 }
}

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

发布了7 篇原创文章 · 获赞 1 · 访问量 261

猜你喜欢

转载自blog.csdn.net/akie_384/article/details/104092624