Есть ли проблема с моими операторами if в моей объектной команде? - PullRequest
0 голосов
/ 27 октября 2019

Я новичок в ООП и играю в рыбалку. Прямо сейчас у меня есть объект, называемый лодкой, который может путешествовать на определенное расстояние в зависимости от его топлива. Однако, если у него кончится топливо и он окажется посреди океана, игра должна закончиться. Моя проблема в том, что по какой-то причине вместо того, чтобы заканчивать игру, поскольку она не находится в ориентире, и топливо будет пустым, это говорит о том, что лодка прошла определенное расстояние.

public class Boat 
{
    int fuelCapacity;
    int fuelLevel;
    int fishCapacity;
    int location;

   public Boat()
   {
       fuelCapacity=10;
       fuelLevel=10;
       fishCapacity=10;
       location=0;
   }


   public int getFuelCapacity()
   {
       return this.fuelCapacity;
   }
   public int getFuelLevel()
   {
       return this.fuelLevel;
   }
    public int getLocation()
   {
       return this.location;
   }


   //start the process of travel and determine what happens
    //// 
   public int Travel(int Fuel,int Location,int FuelCapacity) throws IOException
   {
        int FuelConsumed=0;

        //Enable IO
       BufferedReader MyInput=new BufferedReader (new InputStreamReader(System.in));


        System.out.println("How many meters do you want to travel");
        System.out.println("Please enter only in increments of 10m");
        System.out.println("Enter in negative number to go west");
        System.out.println("Please in positive number to go east");
        int distance=Integer.parseInt(MyInput.readLine());


        //if they go east
        if (distance<0)
        {
            for (int x=0;x<=(distance/10);x++)
            {

                FuelConsumed++;
            }
        }
        //if they go west
        if (distance>0)
        {
                for (int x=0;x<=((distance*(-1))/10);x++)
            {

                FuelConsumed++;
            }
        }

        Location=Location+distance;
        int FuelLeft=Fuel-FuelConsumed;


        //Checks which sceanrio it falls under and gives apporpiate output
        if (FuelLeft==0 && Location!=100) //End game
        {
            System.out.println("Oh No your stuck in the middle of ocean with no fuel");
            System.out.println("Hope you can survive the middle of ocean by youself");
            System.out.println("GAME OVER");
            distance=9999;

            return distance;
        }
         else if (FuelLeft==0 && Location!=0) ///End game
        {
            System.out.println("Oh No your stuck in the middle of ocean with no fuel");
            System.out.println("Hope you can survive the middle of ocean by youself");
            System.out.println("GAME OVER");
            distance=9999;

            return distance;
        }
        else if (FuelLeft==0 && Location!=200) ///End game
        {
            System.out.println("Oh No your stuck in the middle of ocean with no fuel");
            System.out.println("Hope you can survive the middle of ocean by youself");
            System.out.println("GAME OVER");
            distance=9999;

            return distance;
        }
        else if (FuelLeft==0 && Location!=300) ///End game
        {
            System.out.println("Oh No your stuck in the middle of ocean with no fuel");
            System.out.println("Hope you can survive the middle of ocean by youself");
            System.out.println("GAME OVER");
            distance=9999;

            return distance;
        }
        else if (FuelLeft==0 && Location!=400) //stuck in ocean
        {
            System.out.println("Oh No your stuck in the middle of ocean with no fuel");
            System.out.println("Hope you can survive the middle of ocean by youself");
            System.out.println("GAME OVER");
            distance=9999;

            return distance;
        }




        else if (Location>400) //error catching (out of bounds)
        {
            System.out.println("You cant go out of bounds! Its restricted waters");
            distance=0;

           return distance;
        }
        else if (Location<0) //error catching (out of bounds)
        {
            System.out.println("You cant go out of bounds! Its restricted waters");
            distance=0;

            return distance;
        }




        else if (FuelLeft<(distance/10)) //error catching (trying togo father then the amount of fuel allows them too)
        {
            System.out.println("You dont have engough fuel to go there");
            return distance;
        }
        else if (FuelLeft<((distance*(-1))/10)) //error catching (trying togo father then the amount of fuel allows them too)
        {
            System.out.println("You dont have engough fuel to go there");
            return distance;
        }





        else 
        {
            System.out.println("You travelled " + distance + "m");
            return distance;
        }
   }
   }

Boat boat= new Boat();


        System.out.println("You have " +boat.getFuelLevel());
        System.out.println("1 fuel goes 10m ");

        System.out.println("The map");
        System.out.println("Legend:");
        System.out.println("- eligable fishing spot and is 10m each  ");
        System.out.println("# is a town");
        System.out.println("East: ->");
        System.out.println("West: <-");




        System.out.println("  1          2          3          4          5");
        System.out.println("  |----------|----------|----------|----------| ");
        System.out.println("  0m         100m       200m       300m       400m");


        boat.fuelLevel=5;
        boat.location=100;
        boat.fuelCapacity=10;
        boat.Travel(boat.getFuelLevel(), boat.getLocation(), boat.getFuelCapacity());

Ответы [ 2 ]

0 голосов
/ 27 октября 2019

Если Fuel не равен 0 (например, FuelLeft==0 && Location!=100), то это не вызовет событие окончания игры. Вы должны изменить его так, чтобы он выглядел следующим образом.

    if (FuelLeft <= 0 && Location !=100)

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

    if (distance<0) //Change to if (distance <= 0)

и

    if(distance>0) //Change to if (distance >= 0)

Это должно позволить завершить GameOver.

-EDIT-

Я еще раз посмотрел на ваш код и обнаружил, что ваша проблема заключается в ваших данных. Ваш вклад никогда не повлияет на объект вашей лодки. Вам нужно будет изменить метод ввода. Может быть, получая входные данные из основной функции вместо объекта лодки.

Вам также нужно добавить цикл, который позволит вам повторять процесс «рыбалки» или «перемещения», потому что каждый раз, когда у вас кончается топливо, ваши «средства проверки ошибок» работают, потому что он говоритчто вам не хватает топлива для этого. Поскольку он работает только один раз, вы не можете выполнить требуемые спецификации, потому что у вас не может закончиться топливо.

Наконец, вы устанавливаете топливо на 5 уже в вашем коде, поэтому ваше топливо всегда будет на 5, когда вы запускаете программу. Вот что я бы предложил сделать:

  1. сделать ввод в основной функции.

  2. изменить свой класс лодки, чтобы сделать что-то, когда вы получитеопределенное значение. (прямо сейчас это ничего не делает, если бы вы просто изменили входные данные в объект лодки, вам нужно было бы добавить аргумент или что-то еще, чтобы он мог отслеживать, как далеко вы хотите двигаться. Вы можете сделать это, сделав переменную класса, котораясохраняет значения каждого из них, и затем объект Boat возвращает значения после его перемещения.)

  3. Разбейте ваш код на несколько частей. Похоже, вы пытаетесь сделать слишком много вещей одновременно. Сделайте так, чтобы у вас были отдельные функции для каждой отдельной вещи. Например, Travel не обязательно должен быть int, потому что вы хотите, чтобы он перемещал лодку. Вам также не нужны все эти аргументы в командировке, потому что они уже хранятся в переменной лодки.

  4. Убедитесь, что вы понимаете это каждый раз, когда нажимаете кнопку запуска. все сбрасывает. Это также может быть причиной того, что у вас всегда одинаковое количество топлива. Сделайте цикл вокруг входной части (это, вероятно, будет в главной функции), а затем снова заставьте функции лодки делать вещи, основанные на этом.

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

    public void Move(int distance) throws IOException
    { 
        Travel( fuelLevel, location, fuelCapacity, distance); //distance is the distance
    }
    

Вы можете добавить это, чтобы получить вход в вашу основную функцию:

    Scanner keyboard = new Scanner(System.in);
    int distance = keyboard.nextInt();
    boat.Move(distance);

Куда двигатьсяЗатем функция (см. выше) переместит лодку и изменит значения переменных класса на правильные значения. Тогда вы могли бы сделать

    do{
        //display where the boat is with your picture

        //get user input
    }while(!gameOver);

Удачи в вашей игре! и я надеюсь, что это поможет!

0 голосов
/ 27 октября 2019

Просто, в вашем коде ... boat.fuelLevel = 5;boat.location = 100;boat.fuelCapacity = 10;Эти значения переназначаются в consrructor со значениями статики.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...