自己写的一个猜数字小游戏
发表于:2017-06-24 08:10:22 分类:JAVA 阅读:1555次
代码很糟糕,前面初始化了一个0-9四位数的全组合。
不知道怎么才能优雅地实现,写了n重循环……
这段代码有两个功能,一个是玩家模式,用来随机生成,
然后玩家猜。根据猜的数字与结果比较给予提示;
另一个是解谜模式,实际上就是输入所有条件,然后穷举运算,没有技术含量……
要说特别的话,这段代码是在手机上敲的。
上代码:
import java.util.Random;
import java.util.Scanner;
public class NumGuass {
private String[] allNum=new String[5040];
private String[] in;
private String guassNum="";
Scanner scanner = new Scanner(System.in);
public NumGuass(){
int index=0;
for(int i=0;i<=9;i++){
for(int j=0;j<=9;j++){
if(j==i){
continue;
}
for(int k=0;k<=9;k++){
if(k==i||k==j){
continue;
}
for(int l=0;l<=9;l++){
if(l==i||l==j||l==k){
continue;
}
String num=i+""+j+""+k+""+l;
allNum[index]=num;
index++;
}
}
}
}
}
public void setIn(String[] in){
this.in=in;
}
public static void main(String[] args) {
NumGuass guass = new NumGuass();
//guass.autoCalculate();
guass.guassNum();
}
/*
* 根据输入的条件自动计算结果;
*/
public void autoCalculate(){
System.out.println("请输入条件,格式示例:7654 2A3B,1234 1A1B");
String line = scanner.nextLine();
in=line.split(",");
for(int i=0;i<allNum.length;i++){
if(equNum(allNum[i])){
System.out.println("答案:"+allNum[i]);
break;
}
}
}
/**
* 系统随机生成一个4位不同的数字,由用户猜 。
*/
public void guassNum(){
//生成结果数字
int index=new Random().nextInt(5040);
guassNum=allNum[index];
//System.out.println(guassNum);
boolean isGuassed=false;
int i=0;
while (!isGuassed) {
i++;
System.out.println("请输入您要猜的数字(四位数字,每一位不允许重复,第一个数可以为0):");
String sin=scanner.next();
String res = getRes(sin, guassNum);
if(res.equals("4A0B")){
System.out.println("恭喜你猜对了,答案为:"+guassNum+"。您共猜了"+i+"次!");
isGuassed=true;
}else{
char c = res.charAt(0);
char d = res.charAt(2);
String str=c+"个数字的位置和数值相同,"+d+"个数字数值相同,位置不同。";
System.out.println("请根据提示再试!提示为:"+str);
}
}
}
/**
* 匹配所有条件,是否全满足
* @param num 需要匹配的数字字符串
* @return 全满足返回true,否则false
*/
private boolean equNum(String num) {
boolean re=false;
int count=0;
for(int i=0;i<in.length;i++){
String[] ins = in[i].split(" ");
if(!ins[1].equals(getRes(num,ins[0]))){
break;
}else{
count++;
}
}
if(count==in.length){
re=true;
}
return re;
}
/**
* 比较两个数字字符串的相似情况。位数与数字全一致则A前的数字+1,
* 不同位置的数字相同则B前数字+1。
* @param num 数字字符串1
* @param str 数字字符串2
* @return 返回相似度比较结果,如3A0B表示两个数字字符串有三个位置是相同的。
*/
private String getRes(String num, String str) {
int Anum=0;
int Bnum=0;
for(int i=0;i<4;i++){
if(num.charAt(i)==str.charAt(i)){
Anum++;
}else if(str.contains(new String(new char[]{num.charAt(i)}))){
Bnum++;
}
}
return Anum+"A"+Bnum+"B";
}
}
关键词:java,猜数字,游戏
21