一、实验内容及要求
假设游戏者共有十人,且有10个不同的姓:张、王、李、赵、刘、于、许、金、钱、孙,魔术师将十个姓写在四张纸牌上,游戏者只需指出那几张纸上有自己的姓,魔术师就能准确的说出游戏者的姓,如图所示。
请编程实现:
- 分组输出姓氏,让用户选择姓氏所在的组。
- 给出你猜的姓氏。
- 在IDEA中新建“RolePlaying”项目。完成实验后,将项目导出为压缩包(“File”®“Export”®“Project to Zip File...”)。
二、涉及的主要知识点
- JAVA语言的基础知识:变量定义,选择语句,循环语句,数组。
- 计算机基础中的进制转换。
三、提示及预备知识
实际上是把这10个不同的姓依次编为1、2、3、4、5、6、7、8、9、10,再把这10个数用二进制表示为二进制1、10、11、100、110、111、1000、1001、1010,通过二制数据的规律将之后放在不同的组中,在用户指定的组后,根据相应的规律寻找到相应的姓氏。
2、简易代码
5. package cn.inast.test;
import java.util.Scanner;
public class Example01 {
public static void shuchu(char[] arr,int length){
for(int i = 0; i<length;i++)//输出方法
{
System.out.print(arr[i]+" ");
}
System.out.println();
}
public static void caiMzi() {
char [] xing1={'金','钱','孙'};//规律分组倒数第四位为1,二进制
char [] xing2={'赵','刘','于','许'};//规律分组倒数第三位为1,二进制
char [] xing3={'王','李','于','许','孙'};//规律分组倒数第二位为1,二进制
char [] xing4={'张','李','刘','许','钱'};//规律分组倒数第一位为1,二进制
System.out.print("1:");
shuchu(xing1, xing1.length);//规律分组倒数第四位为1
System.out.print("2:");
shuchu(xing2, xing2.length);//规律分组倒数第三位为1
System.out.print("3:");
shuchu(xing3, xing3.length);//规律分组倒数第二位为1
System.out.print("4:");
shuchu(xing4,xing4.length);//规律分组倒数第一位为1
}
public static void main(String[] args) {
char [] xing = {' ','张','王','李','赵','刘','于','许','金','钱','孙'};//静态初始化
int[] ej = {0,0,0,0};//定义二进制数组
caiMzi();//调用caiMzi方法
System.out.println("请输入你所想的姓氏所在的位置:(以-1表示结束)");
for(int i=0;i<10;i++) {
Scanner scanner = new Scanner(System.in);
int a = scanner.nextInt();
if(a != -1)//若分组后,该卡片有其名字的记录为1
ej[a - 1] = 1;
if(a == -1)//定义结束函数
break;
}
for(int j=0;j<4;j++)//输出对应的二进制数,转换成十进制数即为该玩家的姓
{
System.out.print(ej[j]);
}
System.out.println(" ");//换行
System.out.println("你的姓氏为:");
System.out.println(xing[2*2*2*ej[0]+2*2*ej[1]+2*ej[2]+ej[3]]);//输出该玩家的姓
}
}
3、改进代码
import java.util.Scanner;
public class GuessGame {
public static void main(String[] args) {
int quotient;
int remainder=-1;
int position;
char[] firstNames={' ','李','王','张','刘','陈','杨','赵','黄','周','吴'};
String[] groups=new String[]{"","","","",""};
for (int i = 1; i <firstNames.length ; i++) {
quotient=i;
position=groups.length-1;
while(quotient!=0)
{
remainder=quotient%2;
quotient=quotient/2;
if(remainder==1)
{
groups[position]+=firstNames[i];
}
position--;
}
}
for (int i =1;i<groups.length;i++) {
System.out.println(i+":"+groups[i]);
}
System.out.println("请输入您所想的姓氏所在位置:(以-1表示结束):");
char[] c=new char[]{'0','0','0','0'};
int i=9999999;
Scanner sc=new Scanner(System.in);
while (true){
i=sc.nextInt();
if(i==-1)
{
break;
}
c[i-1]='1';
}
System.out.println(c);
int answer=0;
for (i=0;i<c.length;i++)
{
answer+=(c[i]-'0')*Math.pow(2,4-i-1);
}
System.out.println("您的姓氏为:");
System.out.println(firstNames[answer]);
}
}
4、运行实例