2012-07-04 3 views
1

Я начинаю программировать на Java. Теперь я делаю игру под названием «вдохновитель».Игра Mastermind

У этого есть много условий, и я использую числа вместо цветов.

Я понятия не имею, как решить эту проблему: я использую инструкцию if else для выполнения своей игры, но если решение 4444 и пользовательский ввод равен 4444, выходной ответ неверен.

В этой игре первый вход сгенерирован компьютером, но мне нужно проверить программу, поэтому я сам устанавливаю номер, а второй вход - вход игрока.

Вот код, я сделал:

import javax.swing.JOptionPane; 


public class asd { 


    public static void main (String args[]){ 
     int i,j; 
     int b=0 ,w=0; 

    String input[] = new String[4]; 
    input[0] = JOptionPane.showInputDialog("input a digit"); 
    input[1] = JOptionPane.showInputDialog("input a digit"); 
    input[2] = JOptionPane.showInputDialog("input a digit"); 
    input[3] = JOptionPane.showInputDialog("input a digit"); 

    String Uinput[] = new String[4]; 
    Uinput[0] = JOptionPane.showInputDialog("input a digit"); 
    Uinput[1] = JOptionPane.showInputDialog("input a digit"); 
    Uinput[2] = JOptionPane.showInputDialog("input a digit"); 
    Uinput[3] = JOptionPane.showInputDialog("input a digit"); 

    for(i=0;i<4;i++){ 
     for(j=0;j<4;j++){ 
      if(i<4){ 
      if(input[i].equals(Uinput[j])){ 
       if(i==j){ 
        b++; 
        i++; 
        j=0; 
       }else{ 
        w++; 


       } 
      } 
      } 
     } 
    } 
    System.out.println("black = "+b+"\nwhite = "+w); 

} 
} 
+3

Пожалуйста, дайте мне ввести все мои номера сразу. –

+0

u может ввести ваш номер – user1403675

ответ

4

Хорошо, я собираюсь дать вам несколько советов.

Сначала я хотел бы сказать, что для каждого входа (как предложил Дейв) используется одиночная строка, или используйте массив символов. Вам не нужен массив строк для 4 символов.

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

EDIT

Я хотел бы изменить алгоритм на два этапа. На первом этапе я прохожу через массив и ТОЛЬКО проверю правильное число в нужном месте - это будет ваш черный подсчет очков.

Затем, в следующем фазе, я снова прохожу через массивы, проверяя правильное число, неправильное место (количество белых). Трудность заключается в обработке дубликатов. Например, если фактическое число «1234», и я думаю, «4445», я должен получить только один белый привязку. Вы не можете наивно проверить, существует ли число в фактическом значении.

Чтобы решить эту проблему, самое легкое, что я могу придумать, это сделать булевский массив, который отслеживает, когда вы уже учли число. Так вот, что моя «черная» фаза будет выглядеть так:

char[] actual = // Read in the real value 
char[] guess = // Read in the users guess 

int blackCount = 0; 
int whiteCount = 0; 

boolean[] isFound = new boolean[4]; 

// Black phase 
for (int i = 0; i < 4; ++i) 
{ 
    if (actual[i] == guess[i]) 
    { 
    isFound[i] = true; 
    blackCount++; 
    } 
} 

Итак, теперь вы добавить белую фазу - и вы получите только белый колышек, если номер существует, и это isFound [я] значение = ложь.

Надежда, что помогает

+0

Он также хочет проверить правильный номер в неправильном месте, что, по-моему, заслужило бы белую отметку. – Keppil

+0

, но на самом деле мне нужно проверить с 4 номером, как я могу проверить номер 4 с номером ввода пользователя 4? – user1403675

+0

Моя функция предполагает, что все 4 числа находятся в одной строке. String имеет функцию chatAt (int i), поэтому вы можете получить доступ к первому, второму ... символу. Если вам удобнее использовать массив, используйте массив char. Я работаю над редактированием, хотя, b/c, как указал Кеппил, нужно учитывать правильный номер/неправильное место. Это не домашнее задание, не так ли? – jeff

1

Я не уверен, о правилах вдохновителя и вы не указали, но, возможно, это то, что вы имеете в виду:

int b = 0, w = 0; 
    for (int i = 0; i < 4; i++) 
    { 
     if(input[i].equals(Uinput[i])) ++b; 
     else ++w; 
    } 
+0

Правила [Mastermind] (http://en.wikipedia.org/wiki/Mastermind_%28board_game%29) заключаются в следующем: каждый символ, который появляется как на входе, так и на выходе, приведет к одному привязке в ответе.Если символы отображаются в соответствующих местах, привязка будет черной, в противном случае она будет белой. Таким образом, вам нужно сравнить разные местоположения. – MvG

Смежные вопросы