大一的时候C语言的期末考最后一题考了田忌赛马 那时候那个程序是不停的 你不断的输入,他不断的输出 印象中知道你回车了两次 那宣告程序结束
/*田忌赛马
* 有一等马 二等马 三等马
* 甲 挑选出战顺序 1 2 3
* 乙 挑选出战顺序 3 1 2
* 乙胜
* 程序输出
* 1 2 3
* 3 1 2
* 乙胜
* 2 3 1
* 1 2 3
* 乙胜
*
* */
这里我构建了两个模块 一个是输入构造数组的模块 一个是比较的模块
代码说明
import com.sun.jdi.Value;
import java.util.Scanner;
/*田忌赛马
* 有一等马 二等马 三等马
* 甲 挑选出战顺序 1 2 3
* 乙 挑选出战顺序 3 1 2
* 乙胜
* 程序输出
* 1 2 3
* 3 1 2
* 乙胜
* 2 3 1
* 1 2 3
* 乙胜
* * */
public class Demo01 {
public static void main(String[] args) {
while (true) {//死循环
int[] arry1 = new int[3];
int[] arry2 = new int[3];
Scanner in = new Scanner(System.in);
var player = new Demo01();
//构建两个数组
arry1=player.toArray(in);
arry2=player.toArray(in);
player.compareTwo(arry1,arry2);
}
}
public void compareTwo ( int[] a, int[] b){
int acount = 0, bcount = 0;
for (int i = 0; i < 3; i++) {
if (a[i] < b[i]) {
acount++;
} else if (a[i] > b[i]) {
bcount++;
} else {
continue;
}
}
if (acount > bcount) {
System.out.println("甲胜");
} else if (acount < bcount) {
System.out.println("乙胜");
} else {
System.out.println("平局");
}
}
public int[] toArray(Scanner in){// 将传入的三个数放入数组中构建数组模块
var array = new int[3];
for (int i = 0; i < 3; i++) {//再把后三次键盘输入的值赋给arry2
int value = in.nextInt();
array[i] = value;
}
return array;
}
}
初步满足你输入完他输出结果这个要求
那接下来就是如何跳出这个循环 结束程序
我想的是 如果连续回车两次 则跳出循环 结束程序 结束程序可以直接System.exit(0);
那是否可以给一个方法 传入Scanner in
通过这个in
来判断输入是什么 然后结束程序
- 初步想法
public void overApp(Scanner in) {
if (in.nextLine().length() == 0) {
if (in.nextLine().length() == 0) {
System.exit(0);
}
}
}
player.compareTwo(arry1, arry2);
player.overApp(in);
在比较的后面加入个判断结束模块
如果直接判断完就回车回车 是可以呈现类似输出,但是
他会多接受一行输入 这是我不想要的
那是不是可以换一下 把判断是否连续输出两个回车作为结束标志放在前面 且不进行输出 定义一个全局静态变量,再把数组变成全局静态的变量 不管输入是什么,都输入到数组对象名[0]这里面去,或者把输入判断放入构造数组中去。
这里要明确一个概念,就是Scanner的输入
next()
一定要读取到有效字符后才可以结束输入,对输入有效字符之前遇到的空格键、Tab键或Enter键等结束符,next()方法会自动将其去掉,只有在输入有效字符之后,next()方法才将其后输入的空格键、Tab键或Enter键等视为分隔符或结束符。
那我们去判断输入是不是回车 是用in.nextLine().length() == 0
来判断,这就需要输入一行nextLine()
方法返回的是Enter键之前的所有字符,也就是说 如果这个方法返回的String的length==0
意味着输入的是回车 我想要的是 不要这个一样 就是把开始的输入放到这个a[0]里面。
首先我们确保 第一次的比较都是成立的,那也就是说 在构建数组的时候 你已经放入三个值,for循环之后,判断会不会连续输出两个回车结束 但不管怎么样 我的判断一直都是in.nextLine() ,所以把构造数组改掉 ,用in.nextline()获得一个String 在从里面去抽出三个数放到我们的array里面。
代码说明
import com.sun.jdi.Value;
import java.util.Scanner;
/*田忌赛马
* 有一等马 二等马 三等马
* 甲 挑选出战顺序 1 2 3
* 乙 挑选出战顺序 3 1 2
* 乙胜
* 程序输出
* 1 2 3
* 3 1 2
* 乙胜
* 2 3 1
* 1 2 3
* 乙胜
*
* */
public class Demo01 {
public static boolean judgeArray = true;
public static void main(String[] args) {
while (true) {//死循环
int[] arry1 = new int[3];
int[] arry2 = new int[3];
Scanner in = new Scanner(System.in);
var player = new Demo01();
//构建两个数组
arry1 = player.toArray(in);
arry2 = player.toArray(in);
//比较两个数组输出结果
player.compareTwo(arry1, arry2);
}
}
public void compareTwo(int[] a, int[] b) {
int acount = 0, bcount = 0;
for (int i = 0; i < 3; i++) {
if (a[i] < b[i]) {
acount++;
} else if (a[i] > b[i]) {
bcount++;
} else {
continue;
}
}
if (acount > bcount) {
System.out.println("甲胜");
} else if (acount < bcount) {
System.out.println("乙胜");
} else {
System.out.println("平局");
}
}
public int[] toArray(Scanner in) {// 将传入的三个数放入数组中构建数组模块
var array = new int[3];
var sc = in.nextLine();
if(sc.isEmpty()){//只要不是连续两次输入回车 就都可以构件数组
if(sc.isEmpty()){
System.exit(0);
}else{
String[] value = sc.split(" ");
for (int i = 0; i < 3; i++) {//再把后三次键盘输入的值赋给arry2
array[i] = Integer.parseInt(value[i]);
}
}
}else {
String[] value = sc.split(" ");
for (int i = 0; i < 3; i++) {//再把后三次键盘输入的值赋给arry2
array[i] = Integer.parseInt(value[i]);
}
}
return array;
}
public void overApp(Scanner in) {
if (in.nextLine().length() == 0) {
if (in.nextLine().length() == 0) {
System.exit(0);
}
}
}
}
结果截图
也就是说我把结束程序的模块放到了构件数组的地方 你在构建数组的时候 如果你连续输入两次回车 则结束程序 如果只输入一次 则当你是失误 下次输入只要不是回车 还是可以构件数组 这就解决了你判断跳出循环会多一个输入行的显示这个错误,在我构建数组的时候就把他扼杀掉。
这里我们了解到 两个输入要注意的就是in.next()不能判断回车 它获得了有效输入后 才会检测你的结束符
in.nextLine则不同 他都会检测 ,如果要进行回车符的判断 ,还是要瞧in.nextLine().
这样就大致符合所要的输出。