Игра в кости с двумя игроками, 3 вариантами выбора и картами

Я пытаюсь написать код для игры, в которой игрок и компьютерная игральная кость выпадают, пока один или оба не достигнут 250(их можно связать). Игрок и компьютер могут выбрать один из 3 вариантов выбора. Односторонняя стяжка, двухсторонняя матрица или трехсторонняя матрица. Существует бонус для 10- и 6-ти стороннего кубика, если кубики одинаковы. Есть 2 "озера", где, если игрок приземляется в них, игрок должен вернуться к более низкому числу прямо перед началом озера, есть также грязное болото, где каждый ход, который делает игрок, в то время как в болоте врезается в половина. За каждые 10 мест (10, 20, 30, 40 и т. Д.) Игрок случайным образом берет карту. Есть 11 различных карт, которые игрок может получить случайным образом:

1-4: игрок продвигается вперед случайным образом от 1 до 6

5: игрок продвигается вперед случайным образом от 4 до 11 (случайное число 8 + 4)

6: игрок перемещается туда, где находится другой игрок (см. Ниже)

7: игрок возвращается в начало (перемещается в локацию 0)

8-9: игрок возвращается на случайную сумму от 1-6

10-11: игрок возвращается на 4-11 случайных чисел

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

Я также не могу заставить игроков умереть, чтобы они правильно обновлялись. Если игрок бросает 18 полных очков, а в следующем ходу он бросает 14, количество очков возрастет с 18 до 14.

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

Я новичок в написании кода (это моя 4-я написанная программа) и не обладаю обширными знаниями, чтобы понять, что не так. Код не должен быть сделан профессионально, я просто хотел бы, чтобы он работал правильно. Любая помощь очень ценится.

  /*This program will create a "Board" game. Each player can choose 
  from several different types of die. The computer and user will take 
  turns "rolling" a dice. There are several obstacles that can send one 
  of the players back. The goal is to get above 250*/

  import java.util.*;

  public class Project4 {

public static void main(String[] args) {
    Scanner in=new Scanner(System.in);
    //assigning variables
    int p1, p2;
    p1=p2=0;
    int spacesmoved  = 0;

    //Setting up the randomization of the 24 sided die
    int minimum1 = 1;
    int maximum1 = 24;
    Random rn1 = new Random();
    int range1 = maximum1 - minimum1 + 1;
    int die1 =  rn1.nextInt(range1) + minimum1;

    //Setting up the randomization of the 10 sided die
    int minimum2 = 1;
    int maximum2 = 10;
    Random rn2 = new Random();
    int range2 = maximum2 - minimum2+ 1;
    int die2 = rn2.nextInt(range2) + minimum2;
    int die22 = rn2.nextInt(range2) + minimum2;
    int die222 = rn2.nextInt(range2) + minimum2;

    //Setting up the randomization of the 6 sided die
    int minimum3 = 1;
    int maximum3 = 10;
    Random rn3 = new Random();
    int range3 = maximum3 - minimum3+ 1;
    int die3 = rn3.nextInt(range3) + minimum3;
    int die33 = rn3.nextInt(range3) + minimum3;
    int die333 = rn3.nextInt(range3) + minimum3;

    //Setting a loop for the players to take turns until one, or both, reach > 250
    while (p1 <= 250 && p2 <= 250) {
        {System.out.println(" Current positions.  Player: " + p1 + " Computer: " + p2);
            System.out.println("Which die would you like to roll? die1(1) = one 24-sided die, die2(2) = two 10-sided dice, die3(3) = three 6-sided dice: ");
       String diechoice = in.nextLine().toLowerCase();

       //Getting the die roll if the player chooses the 24 sided die
       if (diechoice.equals ("1")) {
           spacesmoved = (die1);
       System.out.println("Player rolled a " + die1);
       System.out.println("Player moves forward " + die1 +" spaces");
       p1+=spacesmoved;

       }

       //Getting the die roll if the player chooses the two 10 sided die
       if (diechoice.equals ("2")) { spacesmoved = (die2 + die22);
       System.out.println("First die is " + die2);//TESTTTT
       System.out.println("Second die is a " + die22);//TEST
       System.out.println(die2 + die22);//TESTTTTtttt
            if (die2 == die22); {
            spacesmoved = (die2 + die22 + die222);
            System.out.println("Player rolled doubles, player gets to roll a 3rd 10 sided die");
            System.out.println("Players 3rd dice roll is " + die222);
            System.out.println("Player moves forward a total of " + spacesmoved + " spots");
            p1 += spacesmoved;
        }
     //  player1spot = (currentspot + spacesmoved);
        }

       //Getting the die roll if the player chooses three 6 sided die
       if (diechoice.equals("3")) { spacesmoved = (die3 + die33 + die333);
       System.out.println("die 1 is " + die3);
       System.out.println("die 2 is " + die33);
       System.out.println("die 3 is " + die333);
       System.out.println("Player 1 moves forward a total of " + spacesmoved + " spots");
       { if (die3 == die33)
           if (die33 == die333)
           spacesmoved = ( spacesmoved * 2);

       p1 += spacesmoved;
       }}
       /*Setting up the lakes and muddy patch. If the player lands in a lake he goes back
       to the lower edge of the lake. If in the mud his moves are cut in half ONLY while in the mud */

       {if (spacesmoved >= (83) || spacesmoved <= (89)); spacesmoved = (82);
         System.out.println("Player landed in a lake, player goes back to space " + spacesmoved);
       if (spacesmoved >= (152) || spacesmoved <= (155)); spacesmoved = (151);
         System.out.println("Player landed in a lake, player goes back to space " + spacesmoved);
       if (spacesmoved >= (201) || spacesmoved <= (233)); spacesmoved = (spacesmoved / 2);
         System.out.println("Player landed in mud, players turns are cut in half until player gets out");
       }
       //Setting up the random cards if the player lands on a 10
       if (p1 % 10==0);
       { int minimum4 = 0;
       int maximum4 = 11;
       Random rn4 = new Random();
       int range4 = maximum4 - minimum4 + 1;
       int card =  rn4.nextInt(range4) + minimum4;

       //if player gets a card that moves them ahead a random number between 1-6
        if (card >=4);
           int minimum = 0;
           int maximum = 6;
           Random rn = new Random();
           int range = maximum - minimum + 1;
           int cardmove =  rn.nextInt(range) + minimum;
            p1 = cardmove;

       //if player gets a card that moves them ahead a random number between 4-11
        if (card == 5);
           int minimum5 = 4;
           int maximum5 = 11;
           Random rn5 = new Random();
           int range5 = maximum5 - minimum5 + 1;
           int cardmove5 =  rn5.nextInt(range5) + minimum5;
            p1 = cardmove5;
        //if player gets a card that moves them to the spot of the other player
        if (card == 6);
           p2 = p1;


        //if player gets a card that moves them back to 0 (moves location to 0)
        if (card ==7);
           p1 = 0;

        //if player gets a card that moves them back between 1-6 spaces
        if (card == (8) || card == 9);
           int minimum6 = 1;
           int maximum6 = 6;
           Random rn6 = new Random();
           int range6 = maximum6 - minimum6 + 1;
           int cardmove6 =  rn6.nextInt(range6) + minimum6;


        //if player gets a card that moves them back between 4-11 spaces
         if (card == (10) || card == 11);
           int minimum7 = 4;
           int maximum7 = 11;
           Random rn7 = new Random();
           int range7 = maximum7 - minimum7 + 1;
           int cardmove7 =  rn7.nextInt(range7) + minimum7;
       }
          //Setting up the computers turn

       System.out.println("Computers turn");
       {
         int minimum = 0;
         int maximum = 2;
         Random rn = new Random();
         int range = maximum - minimum + 1;
         int computersturn =  rn.nextInt(range) + minimum;

       //If computer randomly chooses a 24 sided die
         spacesmoved = (die1);
         System.out.println("Computer rolled a " + die1);
         System.out.println("Computer moved " + die1 +" spaces");
         p2+=spacesmoved;

       }

       //If the computer randomly chooses the two 10 sided die
         if (diechoice.equals ("die2")) { spacesmoved = (die2 + die22);
         System.out.println("First die is " + die2);//TESTTTT
         System.out.println("Second die is a " + die22);//TEST
         System.out.println(die2 + die22);//TESTTTTtttt
            if (die2 == die22); {
            spacesmoved = (die2 + die22 + die222);
            System.out.println("Computer rolled doubles, player gets to roll a 3rd 10 sided die");
            System.out.println("Computer 3rd dice roll is " + die222);
            System.out.println("Computer moves a total of " + spacesmoved + " spots");
            p2 += spacesmoved;
        }

        }

       //If the computer randomly chooses three 6 sided die
       if (diechoice.equals("die3")) { spacesmoved = (die3 + die33 + die333);
       System.out.println("die 1 is " + die3);
       System.out.println("die 2 is " + die33);
       System.out.println("die 3 is " + die333);
       System.out.println("Computer 1 moves a total of " + spacesmoved + " spots");
       { if (die3 == die33)
           if (die33 == die333)
           spacesmoved = ( spacesmoved * 2);

       p2 += spacesmoved;


       }




       //Setting the lakes and mud for the computer 

       if (spacesmoved >= (83) || spacesmoved <= (89)); spacesmoved = (82);
       System.out.println("Computer landed in a lake, player goes back to space " + spacesmoved);
       if (spacesmoved >= (152) || spacesmoved <= (155)); spacesmoved = (151);
       System.out.println("Computer landed in a lake, player goes back to space " + spacesmoved);
       if (spacesmoved >= (201) || spacesmoved <= (233)); spacesmoved = (spacesmoved / 2);
       System.out.println("Computer landed in mud, players turns are cut in half until player gets out");

       //Setting up the cards for the computer
       if (p1 % 10==0);
       { int minimum4 = 0;
       int maximum4 = 11;
       Random rn4 = new Random();
       int range4 = maximum4 - minimum4 + 1;
       int card =  rn4.nextInt(range4) + minimum4;

       //if computer gets a card that moves them ahead a random number between 1-6
        if (card >=4);
           int minimum = 0;
           int maximum = 6;
           Random rn = new Random();
           int range = maximum - minimum + 1;
           int cardmove =  rn.nextInt(range) + minimum;

       //if computer gets a card that moves them ahead a random number between 4-11
        if (card == 5);
           int minimum5 = 4;
           int maximum5 = 11;
           Random rn5 = new Random();
           int range5 = maximum5 - minimum5 + 1;
           int cardmove5 =  rn5.nextInt(range5) + minimum5;

        //if computer gets a card that moves them to the spot of the other player
        if (card == 6);
           p1 = p2;


        //if computer gets a card that moves them back to 0 (moves location to 0)
        if (card ==7);
           p1 = 0;

        //if computer gets a card that moves them back between 1-6 spaces
        if (card == (8) || card == 9);
           int minimum6 = 1;
           int maximum6 = 6;
           Random rn6 = new Random();
           int range6 = maximum6 - minimum6 + 1;
           int cardmove6 =  rn6.nextInt(range6) + minimum6;


        //if computer gets a card that moves them back between 4-11 spaces
         if (card == (10) || card == 11);
           int minimum7 = 4;
           int maximum7 = 11;
           Random rn7 = new Random();
           int range7 = maximum7 - minimum7 + 1;
           int cardmove7 =  rn7.nextInt(range7) + minimum7;
       }
       }    
      //Writing a final statment showing the winner, or if both tied.
       {     if (p1 > p2);
         System.out.println("Player 1 wins! Good job!");

       if (p2 >p1);
          System.out.println("Computer wins! Better luck next time!");

       if (p2 == p1);
          System.out.println("The game ends in a tie!");    
       }
    }

    }




}

}

1 ответ

Вот что я заметил в связи с тремя упомянутыми вами проблемами:

Задача № 1:

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

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

//Getting the die roll if the player chooses the 24 sided die
if (diechoice.equals ("1")) {
    die1 = rn1.nextInt(range1) + minimum1;
    System.out.println("Player rolled a " + die1);
    System.out.println("Player moves forward " + die1 +" spaces");
    p1+=die1;
}

Вам также необходимо изменить это в других случаях, когда бросок кубика.

Еще одним преимуществом этого является то, что вам действительно нужен только один генератор случайных чисел. Вам на самом деле не нужен один на каждый кубик. Вы можете использовать один и тот же для всех бросков кубика.

Задача № 2:

Я не уверен, что именно происходит с бросками кубика, если там действительно что-то идет не так, но я заметил несколько мест, где вы захотите изменить то, что делается для p1 и p2:

  • Когда игрок получает карту, которая перемещает его вперед, вы захотите использовать += вместо =, т.е. p1 += cardmove5 вместо p1 = cardmove5
  • Когда игрок получает карту, которая перемещает его назад, похоже, что вы забыли добавить p1 -= cardmove заявления.
  • Также убедитесь, что у вас есть p1 и p2 в нужных местах. Например, я думаю, что на очереди компьютера, если они получат карту, чтобы переместить их на место другого игрока, вы должны сделать p2 = p1, но вместо этого у вас есть p1 = p2, То же самое с компьютером, возвращающимся к 0. У вас есть p1 = 0, но кажется, что вы хотели бы p2 = 0, Так что будьте осторожны с этим. (Также будьте осторожны с копией вставки. Я думаю, именно поэтому это произошло)

Задача № 3:

Эта проблема, похоже, вызвана тем, что вы используете || оператор, где вы должны использовать &&, Когда вы используете ||Вы фактически говорите "или". Итак, это первое утверждение

if (spacesmoved >= (83) || spacesmoved <= (89))

читается как "если расстояние больше или равно 83 ИЛИ меньше или равно 89"... Подумайте об этом на секунду. Есть ли число, которое НЕ больше 83 ИЛИ меньше 89? Ответ - нет. КАЖДЫЙ номер удовлетворит это условие. Вы хотели бы использовать &&, что означает "и", как это:

if (spacesmoved >= (83) && spacesmoved <= (89))

"если расстояние больше или равно 83 И меньше или равно 89", что будет работать только для чисел от 83 до 89 включительно.

Вы также захотите удалить точки с запятой после своих операторов "if" в этом и других подобных блоках. Если вы этого не сделаете, код внутри этих условий не будет выполнен. Это на самом деле очень сложная ошибка, чтобы найти, когда это произойдет.

Еще одна вещь, которую нужно знать: если вы хотите, чтобы несколько вещей выполнялись в условии "если", вы должны заключить их в фигурные скобки. {}в противном случае в условие будет включена только первая строка, а все последующие строки будут выполнены безоговорочно. Это еще один факт, который вызывает эту третью проблему.

И последнее, что вы должны попытаться использовать операторы "else if" и "else". Это поможет вашему потоку кода иметь больше смысла. Я не собираюсь делать всю работу за вас, но этот блок кода должен выглядеть примерно так:

if (p1 >= (83) && p1 <= (89))
{
    p1 = (82);
    System.out.println("Player landed in a lake, player goes back to space " + p1);
}
else if (p1 >= (152) && p1 <= (155))
{
    p1 = (151);
    System.out.println("Player landed in a lake, player goes back to space " + p1);
}
else if (p1 >= (201) && p1 <= (233))
{
    spacesmoved = (spacesmoved / 2);
    p1 -= spacesmoved;
    System.out.println("Player landed in mud, players turns are cut in half until player gets out");
}

Бонусный совет

Вы хорошо учитесь, и кажется, что вы думаете о потоке кода довольно хорошо. Просто продолжайте работать и учиться, и вы получите это.

Посмотрите на ваше использование скобок. Использование их ничего не повредит, но вы используете их ПУТЬ больше, чем вам нужно.

Удачи! И продолжай учиться!

Другие вопросы по тегам