navodith shankar Ответов: 2

Как мне исправить эту проблему с циклом?


Я пишу программу Mastermind на Java. Таким образом, пользователь должен ввести количество колышков и цветов, и код будет случайным образом сгенерирован, и программа сделает свое дело и скажет им, получили ли они код или нет. У меня есть куча операторов IF, и я попытался поместить их в цикл for, чтобы мне не нужно было создавать оператор if, когда пользователь увеличивает amt колышков, но это не работает. Есть предложения? Вот этот код:
int [] guesses = new int[10];
for(int i = 0; i<peg.length;i++) {
    peg[i]=generator.nextInt(amtpegs)+1;
    System.out.println(peg[i]);
}
      //Repeat till the player wins
      while(true){
        //Get input from user
          for(int x = 0; x<amtpegs;x++)
            {
              guesses[x]=reader.readInt("Enter your numbers: ");
            }
        //Check if peg in correct index
       for(int y = 0; y<amtpegs;y++) {
        if (peg[y]==guesses[y]){
          pegs++;
       }
        //Check if the color is correct // I want to REPLACE THIS WITH THE FOR LOOP
        if (guesses[0]==peg[0] || guesses[0]==peg[1] || guesses[0]==peg[2]){
          color++;
        }
        if (guesses[1]==peg[1] || guesses[1]==peg[0] || guesses[1]==peg[2]){
          color++;
        }
        if (guesses[2]==peg[0] || guesses[2]==peg[1] || guesses[2]==peg[2]){
          color++;
        }
        if (guesses[3]==peg[3] || guesses[3]==peg[1] || guesses[3]==peg[2]){
              color++;
        }
        System.out.println("You have "+pegs+" correct peg(s) and "+color+" correct colors");
        //Exit if player wins
        if (color==amtcolors && pegs==amtpegs){
          System.out.println("You have broken the code in "+guess+" guesses");
          break;
        }
        //Increment guess count
        guess++;
        //Reset the color and peg value
        color=0;
        pegs=0;
      }


я попытался превратить операторы if или в цикл for, заменив индексы x и j в цикле for, но проблема в том, что переменный цвет слишком сильно увеличивается. Пример: если пользователь вводит 10 колышков и 9 цветов, то вывод должен быть таким же, но здесь он говорит, что в выводе 10 колышков и 20+ цветов иногда:

Есть Вопросы? Я пытался решить эту проблему в течение последнего дня.

Ява

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

for(int x = 0; x<guesses.length;x++) { 
// System.out.println(x+"n");
                 for(int j = 0; j<peg.length-1; j++){
                  //   System.out.println(j+"N");
                   if (guesses[x]==peg[j]){
                     color++;
                   }
                   }
                 }

2 Ответов

Рейтинг:
1

OriginalGriff

Остановитесь и подумайте, как вы делаете это сами, когда играете в игру.
Игрок вводит набор цветных колышков, и вы сравниваете их с "набором решений" двумя способами.

Сначала вы ищете точные совпадения: колышек нужного цвета в нужном месте, и вы мысленно заменяете каждый из них черным колышком, удаляя их из любого дальнейшего рассмотрения:

Solution:     R G B Y Y G
Guess:        P G Y Y G P
Black:        x B x B x x
Sol remain:   R B Y G
Guess remain: P Y G P

Это просто - просто проверьте цвета в соответствующих индексах!

Затем вы проверяете, что осталось, чтобы найти "белые" совпадения: правильный цвет, неправильное место:
Sol remain:   R B Y G
Guess remain: P Y G P
White:        x W W x

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

Попробуйте сделать это на бумаге, и вы поймете, что я имею в виду.
Разберитесь со всем этим в своей голове, и это довольно легко закодировать, и это работает для любого количества цветов и любого количества колышков!


Рейтинг:
1

Patrice T

Цитата:
я попытался превратить операторы if или в цикл for, заменив индексы x и j в цикле for, но проблема в том, что переменный цвет слишком сильно увеличивается.

Попробуйте что-нибудь вроде:
for(int x = 0; x<guesses.length;x++) {
	// System.out.println(x+"n");
	for(int j = 0; j<peg.length-1; j++){
		//   System.out.println(j+"N");
		if (guesses[x]==peg[j]){
			color++;
			break; // This break out of inner loop once there is a match
		}
	}
}