关于田忌赛马

大一的时候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().
这样就大致符合所要的输出。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值