Java - 更简单地考虑用户输入的所有场景

标签 java

我正在开发一个程序,该程序根据用户输入的值创建第四版 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 统计数据,然后使用嵌套的 if 语句/switch 语句来确定他们为以下统计数据输入的内容。我不想这样做的原因是因为我必须考虑输入数字的每种可能的顺序(16,14,13,12,11,10 或 16,13,14,11,10,12等等...),总共有很多 if 和 case 语句。有没有一种方法可以做到这一点,需要更少的线路?

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

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

最佳答案

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

这是一种方法,使用 Set 来查看值是否唯一,并使用函数来避免重复大量代码。

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 */
}

关于Java - 更简单地考虑用户输入的所有场景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20389508/

相关文章:

java - 如何从链表中删除节点

java - 全局使用 editText

java - 如何在 JSP/JSTL 中为类注册渲染器?

java - 在 Multi-Tenancy 架构中为每个租户在单独的文件中记录异常

java - 验证失败时 Micronaut Controller 响应错误

java - 如何为 BinaryTree<T> 类编写 left() 和 right() 方法

java - 如何在android中获取和设置简单的数学函数?

java - 如何从 Wicket 中的 Java 文件动态添加 HTML 代码?

java - 多线程 MVC 用多个独立仪表重新创建平面仪表板

java - 在 Java 中将 objC 与 RoboVM 绑定(bind)