Java—更方便地解释用户输入的所有场景

Java—更方便地解释用户输入的所有场景,java,Java,我正在开发一个基于用户输入值创建第四版DnD字符的程序,我想知道在我继续之前是否有更简单的方法继续我正在做的事情。我正在处理的程序的当前部分是让用户为他们的技能指定预先选择的值。我测试此部件的代码是: import java.util.Scanner; public class testCodeThree{ public static void main(String[] args){ Scanner scan = new Scanner(System.in);

我正在开发一个基于用户输入值创建第四版DnD字符的程序,我想知道在我继续之前是否有更简单的方法继续我正在做的事情。我正在处理的程序的当前部分是让用户为他们的技能指定预先选择的值。我测试此部件的代码是:

import java.util.Scanner;

public class testCodeThree{
    public static void main(String[] args){
        Scanner scan = new Scanner(System.in);
        standardArray(scan);
    }


    public static void standardArray(Scanner scan) {
        System.out.println("----------------------------------------------------------");
        System.out.println("Assign the numbers \"16\", \"14\", \"13\", \"12\", \"11\", and \"10\" to your skills.");

        System.out.print("Enter your desired Str stat: ");
        int userStr = scan.nextInt();

        int strMod = 0;
        int conMod = 0;
        int dexMod = 0;
        int intMod = 0;
        int wisMod = 0;
        int chaMod = 0;

        if (userStr == 16 || userStr == 14 || userStr == 13 || userStr == 12 || userStr == 11 || userStr == 10) {
            switch (userStr) {
            case 16: // 16 Str, -- Con, -- Dex, -- Int, -- Wis, -- Cha
                strMod = 3;
                System.out.print("Enter your desired Con stat: ");
                int userCon = scan.nextInt();

                if (userCon == 14 || userCon == 13 || userCon == 12 || userCon == 11 || userCon == 10) {
                    switch (userCon) {
                    case 14: // 16 Str, 14 Con, -- Dex, -- Int, -- Wis, -- Cha
                        conMod = 2;
                        System.out.print("Enter your desired Dex stat: ");
                        int userDex = scan.nextInt();

                        if (userDex == 13 || userDex == 12 || userDex == 11 || userDex == 10) {
                            switch (userDex) {
                            case 13: // 16 Str, 14 Con, 13 Dex, -- Int, -- Wis, -- Cha
                                dexMod = 1;
                                System.out.print("Enter your desired Int stat: ");
                                int userInt = scan.nextInt();

                                if (userInt == 12 || userInt == 11 || userInt == 10) {
                                    switch (userInt) {
                                    case 12: // 16 Str, 14 Con, 13 Dex, 12 Int, -- Wis, -- Cha
                                        intMod = 1;
                                        System.out.print("Enter your desired Wis stat: ");
                                        int userWis = scan.nextInt();

                                        if (userWis == 11 || userWis == 10) {
                                            switch (userWis) {
                                            case 11: // 16 Str, 14 Con, 13 Dex, 12 Int, 11 Wis, 10 Cha
                                                int userCha = 10;
                                                System.out.println("Your Charisma stat is "+ userCha);
                                                break;

                                            default: // 16 Str, 14 Con, 13 Dex, 12 Int, 10 Wis, 11 Cha
                                                userCha = 11;
                                                System.out.println("Your Charisma stat is "+ userCha);
                                            break;
                                        }
                                    } else {
                                        System.out.println("----------------------------------------------------------");
                                        System.out.println("Invalid input. Please try again.");
                                        standardArray(scan);
                                    }
                                    break;
                                case 11:
                                    break;
                                default:
                                    break;
                                }
                            } else {
                                System.out.println("----------------------------------------------------------");
                                System.out.println("Invalid input. Please try again.");
                                standardArray(scan);
                            }
                            break;
                        case 12:
                            dexMod = 1;
                            break;
                        case 11:
                            // dexMod does not get updated here because the
                            // modifier is zero.
                            break;
                        default:
                            // dexMod does not get updated here because the
                            // modifier is zero.
                            break;
                        }
                    } else {
                        System.out.println("----------------------------------------------------------");
                        System.out.println("Invalid input. Please try again.");
                        standardArray(scan);
                    }
                    break;
                case 13:
                    conMod = 1;
                    break;
                case 12:
                    conMod = 1;
                    break;
                case 11:
                    // conMod does not get updated here because the modifier
                    // is zero.
                    break;
                default:
                    // conMod does not get updated here because the modifier
                    // is zero.
                    break;
                }
            } else {
                System.out.println("----------------------------------------------------------");
                System.out.println("Invalid input. Please try again.");
                standardArray(scan);
            }
            break;
        case 14:
            strMod = 2;
            break;
        case 13:
            strMod = 1;
            break;
        case 12:
            strMod = 1;
            break;
        case 11:
            // strMod does not get updated here because the modifier is
            // zero.
            break;
        default:
            // strMod does not get updated here because the modifier is
            // zero.
            break;
        }
    } else {
        System.out.println("----------------------------------------------------------");
        System.out.println("Invalid input. Please try again.");
        standardArray(scan);
    }
}
}

我最初的想法是要求用户为Str stat输入他们想要的数字,然后使用嵌套的if语句/switch语句来确定他们为以下stats输入的数字。我不想这样做的原因是因为我必须考虑输入的数字的每一个可能的顺序(16,14,13,12,11,10或16,13,14,11,10,12等等),总共有很多if和case语句。有没有一种方法可以减少行数

编辑:用户不能为多个技能输入相同的数字


如果您有问题,请随时提问。

您应该使用比较运算符,例如:

if(userStr <= 16 && userStr >= 10) {

是的,有很多方法可以做到这一点

这是一种方法,使用集合查看值是否唯一,并使用函数避免重复太多代码

private static boolean isValidStat(int userStat) {
    return userStat >= 10 && userStat <= 16 && userStat != 15;
}

private static int readStat(Scanner scan, String stat, Set<Integer> seenStats) {
    System.out.println("Enter your desired "+stat+" stat: ");
    while(true) {
        int userStat = scan.nextInt();
        if(!isValidStat(userStat))
            System.out.println("Not a valid choice - please try again:");
        else if(seenStats.contains(userStat))
            System.out.println("Already used that number - please try again:");
        else {
            seenStats.add(userStat);
            return userStat;
        }
    }
}

private static int getMod(int userStat) {
    switch(userStat) {
    case 16: return 3;
    case 14: return 2;
    case 13: return 1;
    case 12: return 1;
    case 11: return 0;
    case 10: return 0;
    default: throw new RuntimeException("invalid userStat "+userStat); // shouldn't happen
    }
}

public static void standardArray(Scanner scan) {

    System.out.println("----------------------------------------------------------");
    System.out.println("Assign the numbers \"16\", \"14\", \"13\", \"12\", \"11\", and \"10\" to your skills.");
    Set<Integer> seenStats = new HashSet<Integer>();
    int userStr = readStat(scan, "Str", seenStats);
    int userCon = readStat(scan, "Con", seenStats);
    int userDex = readStat(scan, "Dex", seenStats);
    int userInt = readStat(scan, "Int", seenStats);
    int userWis = readStat(scan, "Wis", seenStats);
    int userCha = readStat(scan, "Cha", seenStats);

    int strMod = getMod(userStr);
    int conMod = getMod(userCon);
    int dexMod = getMod(userDex);
    int intMod = getMod(userInt);
    int wisMod = getMod(userWis);
    int chaMod = getMod(userCha);

    /* do something with all these numbers, of course */
}
private静态布尔值isValidStat(int userStat){

return userStat>=10&&userStat就我个人而言,我认为使用数组作为输入会更有条理:

int[] stats = new int[6];

int current = 0;

for (;;) {
    System.out.print("Enter your desired Str stat: ");
    stats[current] = scan.nextInt();
然后,您可以在循环中相互验证它们:

    if (dndValidStarterStats(stats, current)) {
        break;

    } else {
        System.out.println(
            "Stats must be 10, 11, 12, 13, 14, or 16 and unique."
        );
    }
}

for (current++; ;) {
    System.out.print("Enter your desired Con stat: ");
    stats[current] = scan.nextInt();

    ...
}

public static boolean dndValidStarterStats(int[] stats, int current) {
    if ( stats[current] > 16 ||
         stats[current] == 15 ||
         stats[current] < 10 ) {

        return false;
    }

    /* specifically you get to do this */
    for (int eval = 0; eval < current; eval++) {
        if (stats[eval] == stats[current]) return false;
    }

    return true;
}
if(dndValidStarterStats(stats,current)){
打破
}否则{
System.out.println(
统计信息必须为10、11、12、13、14或16且唯一
);
}
}
对于(当前++;;){
System.out.print(“输入所需的Con状态:”);
stats[current]=scan.nextInt();
...
}
公共静态布尔dndValidStarterStats(int[]stats,int current){
如果(统计数据[当前]>16||
统计数据[当前]==15||
统计数据[当前]<10){
返回false;
}
/*具体来说,你可以这样做*/
对于(int eval=0;eval
如果为此创建了基本数据结构,则可以将输入逻辑缩短为单个循环:

public class Stat {
    public final String name;
    public int val = 0;

    private Stat(String name) {
        this.name = name;
    }

    public static final int STR = 0;
    public static final int CON = 1;
    public static final int DEX = 2;
    public static final int INT = 3;
    public static final int WIS = 4;
    public static final int CHA = 5;

    public static List<Stat> createStats() {
        Stat[] stats = new Stat[6];
        stats[STR] = new Stat("Strength");
        stats[CON] = new Stat("Constitution");
        stats[DEX] = new Stat("Dexterity");
        stats[INT] = new Stat("Intelligence");
        stats[WIS] = new Stat("Wisdom");
        stats[CHA] = new Stat("Charisma");

        return Collections.unmodifiableList(Arrays.asList(stats));
    }
}
公共类统计{
公共最终字符串名;
公共int val=0;
私有统计(字符串名称){
this.name=名称;
}
公共静态最终整数STR=0;
公共静态最终int CON=1;
公共静态最终整数指数=2;
公共静态最终int=3;
公共静态最终int WIS=4;
公共静态最终int CHA=5;
公共静态列表createStats(){
Stat[]stats=新Stat[6];
统计数据[STR]=新统计数据(“强度”);
统计数据[CON]=新统计数据(“宪法”);
统计数据[DEX]=新统计数据(“灵巧度”);
统计数据[INT]=新统计数据(“情报”);
统计数据[智慧]=新统计数据(“智慧”);
统计数据[CHA]=新统计数据(“魅力”);
返回集合.unmodifiableList(Arrays.asList(stats));
}
}
现在您可以执行以下操作:

List<Stat> stats = Stat.createStats();

Stat entry;
for (int current = 0; current < stats.size();) {
    entry = stats.get(current);

    System.out.print(
        "Enter your desired " + stats.get(current).name + " stat: "
    );

    stats[current].val = scan.nextInt();

    if (dndValidStarterStats(stats, current)) {
        current++;

    } else {
        System.out.println(
            "Stats must be 10, 11, 12, 13, 14, or 16 and unique."
        );
    }
}
List stats=Stat.createStats();
统计输入;
对于(int current=0;current

为每个索引定义一个常量可以让您从map中的数组访问它们,就像在
stats.get(Stat.STR).val++中的O(1)一样。我真的看不出有什么理由涉及现有的地图,因为你提前知道地图中的内容,只有6个元素,你不需要在创建后修改它们。

哇。。。这真是一团糟…所以。。。当我们输入第三个数字时,为什么输入前两个数字的顺序很重要?看来,就第三个数字而言,用户是否试图输入有效输入才重要,对吗?例如,对于第一个数字,有效输入是10-16。但对于第三个数字,有效输入可能是10-14,而不管前两个数字输入的顺序如何,对吗(假设16/15是以任何顺序第一次/第二次输入的)?对于第二个数字,有效输入将是10-14,假设16是为第一个数字输入的。我忘记了帖子中提到的用户不能为多个技能输入相同的数字(现在编辑为这样说)。如果不是为第一个数字选择第二个数字,为什么
15
作为第二个数字是无效的?虽然这是一个有效点,事实上,解决实际问题几乎没有任何进展。这也不会减少代码行数。它只需要一条线,使它更窄。(此外,15显然不是一个有效的条目。)在我这个级别,我根本没有学习过集合,但我感谢你在我去谷歌搜索的时候给我介绍了一些新的东西。简短版本:集合就像一个列表,但它会阻止你两次添加相同的东西。“包含”也是有效的。你们可以用列表替换集合,它仍然可以工作,只会更难看。
List<Stat> stats = Stat.createStats();

Stat entry;
for (int current = 0; current < stats.size();) {
    entry = stats.get(current);

    System.out.print(
        "Enter your desired " + stats.get(current).name + " stat: "
    );

    stats[current].val = scan.nextInt();

    if (dndValidStarterStats(stats, current)) {
        current++;

    } else {
        System.out.println(
            "Stats must be 10, 11, 12, 13, 14, or 16 and unique."
        );
    }
}