Member 13689608 Ответов: 2

Конечное целочисленное значение в этом коде всегда неверно - помогите!


package com.company;
import java.util.Scanner;


class PP1CourseWork2 {
    static int dieRoll() {
        int roll1 = (int) (Math.random() * 1000 % 6 + 1);
        int roll2 = (int) (Math.random() * 1000 % 6 + 1);
        int roll3 = (int) (Math.random() * 1000 % 6 + 1);
        int tot = roll1 + roll2 + roll3;
        return tot;
    }


    static void AddBonus(int myValue, int bonus, String keywordx) { //Using a method to avoid rewriting codes for each and every variable
        if (myValue == 10 || myValue == 11){
            System.out.println(keywordx + " : " + "[" + myValue + "]" + "[0]");


        } else if (myValue > 11) {
            bonus = (myValue-10)/2;
            System.out.println(keywordx + " : " + "[" + myValue + "]" + "[+" + bonus + "]");

        } else {
            bonus = (11 - myValue)/2;
            System.out.println(keywordx + " : " + "[" + myValue + "]" + "[-" + bonus + "]");
        }
    }

    public static void main(String[] args) {
        int str =0;             //Initialization of all variables...
        int dex=0;              //...where dex = Dexterity
        int cha=0;              //cha = Charisma
        int con=0;              //con = Constitution
        int wis=0;              //wis = Wisdom
        int inte=0;             //inte = Intelligence
        
        int strBonus=0;         //Initialization of bonuses corresponding to each variable
        int dexBonus=0;
        int chaBonus=0;
        int wisBonus=0;
        int inteBonus=0;
        int conBonus=0;
        
        int HP=0;               //Initialization of HP and level
        int level=0;

        String choice = null;   //Initialization of the String value - choice, where user decides to reroll or print their stats.

        Scanner sc = new Scanner(System.in);

        System.out.println("Enter Level: ");
        level = sc.nextInt();



        System.out.println("Level :" + "[" + level + "]");


        do {

            str = dieRoll();
            dex = dieRoll();
            cha = dieRoll();
            con = dieRoll();
            wis = dieRoll();
            inte = dieRoll();

            AddBonus(str, strBonus, "Str");         //calling the AddBonus method for each and every variable.
            AddBonus(dex, dexBonus, "Dex");
            AddBonus(con, conBonus, "Con");
            AddBonus(inte, inteBonus,"Int");
            AddBonus(wis, wisBonus, "Wis");
            AddBonus(cha, chaBonus, "Cha");

            HP = (int) ((Math.random() * 1000 % 6 + 1) + (conBonus * level));
            System.out.println("HP :" + "[" + HP + "]");

            System.out.println("If you wish to re-roll, type R.");
            System.out.println("If you wish to print these stats as they are, type any other character.");
            choice = sc.next();

        } while (choice.equals("r") || choice.equals("R"));

        AddBonus(str, strBonus, "Str");
        AddBonus(dex, dexBonus, "Dex");
        AddBonus(con, conBonus, "Con");
        AddBonus(inte, inteBonus, "Int");
        AddBonus(wis, wisBonus, "Wis");
        AddBonus(cha, chaBonus, "Cha");

        System.out.println("HP :" + "[" + HP + "]");


    }
}



Итак, вот он - мой собственный код для вычисления атрибутов DnD, основанный на рекомендациях моего лектора, - на самом деле задание. Однако, хотя код почти идеален с точки зрения руководящих принципов - значение хитпоинтов или HP - всегда неверно, и я не могу понять, почему это так. Предполагается, что это значение случайного числа между 1-6 + (уровень*conBonus), но даже если мой уровень равен миллиону, он всегда возвращает число между 1-6 - в основном 2 или 3. Есть какие-нибудь проблемы, которые может увидеть кто-то, кроме меня?

Что я уже пробовал:

Я пробовал отлаживать построчно, но, похоже, не могу найти ошибку.

2 Ответов

Рейтинг:
0

OriginalGriff

Компиляция не означает, что ваш код верен! :смеяться:
Подумайте о процессе разработки как о написании электронного письма: успешная компиляция означает, что вы написали письмо на правильном языке - например, на английском, а не на немецком, - а не то, что письмо содержало сообщение, которое вы хотели отправить.

Итак, теперь вы входите во вторую стадию разработки (на самом деле это четвертая или пятая, но вы перейдете к более ранним стадиям позже): тестирование и отладка.

Начните с рассмотрения того, что он делает, и как это отличается от того, что вы хотели. Это важно, потому что это дает вам информацию о том, почему он это делает. Например, если программа предназначена для того, чтобы позволить пользователю ввести число, а затем удвоить его и напечатать ответ, то если бы ввод / вывод был таким:

Input   Expected output    Actual output
  1            2                 1
  2            4                 4
  3            6                 9
  4            8                16
Тогда совершенно очевидно, что проблема заключается в бите, который удваивает его - он не прибавляет себя к себе или умножает его на 2, он умножает его на себя и возвращает квадрат входного сигнала.
Таким образом, вы можете посмотреть на код, и очевидно, что он находится где-то здесь:
private int Double(int value)
   {
   return value * value;
   }

Как только у вас появится идея, что может пойти не так, начните использовать отладчик, чтобы выяснить, почему. Поставить точку останова на строке:
str = dieRoll();
и запустите свое приложение. Подумайте о том, что должна делать каждая строка кода перед ее выполнением, и сравните это с тем, что она на самом деле делала, когда вы использовали кнопку "Step over" для выполнения каждой строки по очереди. Он сделал то, что вы ожидали? Если да, то переходите к следующей строке.
Если нет, то почему? Чем это отличается?

Это навык, и его стоит развивать, поскольку он помогает вам как в реальном мире, так и в развитии. И, как и все навыки, он только улучшается при использовании!


Рейтинг:
0

CPallini

Цитата:
Аддбонус(кон, конбонус, "Кон");

В Java, параметры метода всегда передаются по значению: любое изменение в conBonus переменная, выполняемая внутри метода, невидима вызывающему объекту (то есть остается 0 внутри дома main метод).
Я предлагаю вам изменить метод для того, чтобы вернуть бонусное измененное значение. Тогда назовите это так
conBonus = addBonus(con, "Con");