Primeiramente, criei uma classe BackEnd que será responsável por todo o trabalho do programa. Possui campos:
private int length; //
private int[] mas; //
private int[] inputArray; //,
A ideia é a seguinte: o computador gera um número mas de comprimento, o usuário insere o número inputArray e vê quantos touros e vacas ele contém, e então ganha ou continua a jogar. Primeiro, iremos gerar a matriz mas para ver o número e depurar o código. então iremos remover esta linha. Vamos escrever a saída de uma matriz de comprimento arbitrário:
private void printMas(int[] mas) {
for (int i = 0; i < length; i++) {
System.out.print(mas[i] + " ");
}
}
Passamos um array para esse método, que produziremos por meio do loop for. Isso poderia ter sido feito por meio do campo, mas como iremos gerar mas primeiro e, em seguida, inputArray, decidi fazer isso.
Agora precisamos criar uma geração de números. você pode fazer isso com funções padrão, mas não se esqueça de que precisamos de dígitos diferentes no número. Isso significa que o número 45566 não funcionará, mas 45367 será o ideal. Vamos escrever um método para gerar tal número com a verificação dos dígitos, mas primeiro, vamos descobrir por quanto tempo o usuário deseja adivinhar o número:
private void getMas() {
Scanner scanner = new Scanner(System.in);
do {
System.out.println(" 1 10");
while (!scanner.hasNextInt()) {
System.out.println(" ");
scanner.next();
}
length = scanner.nextInt();
} while (length <= 0 || length > 10);
setMas(createMas());
}
Criamos um objeto scanner com o qual obteremos o número do console. Em seguida, usamos um loop com um do while pós-condição. Vou explicar porque isso acontece um pouco mais tarde. No corpo do loop, vemos um loop while. é usado para verificar se um número foi inserido no console, não uma fração, letras, etc. Depois de verificarmos que o número foi inserido no console, escrevemos seu valor em comprimento. E agora, usando a pós-condição do while, verificamos se ela pertence ao intervalo [0,10). Se for inserido um número que não está incluído no intervalo, pedimos novamente que você insira o comprimento. Se o número for inserido corretamente de uma vez, geramos o número usando o método createMas e alteramos o valor do campo mas:
public void setMas(int[] mas) {
this.mas = mas;
}
private int[] createMas() {
int[] arr = new int[length];
for (int i = 0; i < this.length; i++) {
arr[i] = (int) (Math.random() * 10);
}
boolean checkMas = false;
while (!checkMas) {
for (int i = 0; i < arr.length; i++) {
for (int j = 0; j < arr.length; j++) {
if (i != j) {
if (arr[i] == arr[j]) {
arr[j] = (int) (Math.random() * 10);
}
}
}
}
boolean check = false;
for (int i = 0; i < arr.length && !check; i++) {
for (int j = 0; j < arr.length && !check; j++) {
if (i != j) {
if (arr[i] == arr[j]) {
check = true;
checkMas = false;
} else checkMas = true;
}
}
}
}
return arr;
}
Deixe-me explicar como o createMas funciona. Primeiro, criamos uma matriz de comprimento e comprimento e a preenchemos com números aleatórios do intervalo [0,10). Math.random () gera um número aleatório no intervalo [0,1) e, multiplicando-o por 10, obtemos um número no intervalo [0,10). Agora temos um array arr, que consiste em dígitos aleatórios. A próxima etapa é verificar se há números repetidos. Decidi fazer isso usando variáveis booleanas. Primeiro, comparamos cada elemento com cada um e, em caso de correspondência, alteramos o elemento com o qual estamos comparando por um número aleatório. Depois de comparar todos os elementos, verificamos o array quanto à exclusividade dos dígitos. para isso, também criei a variável check. Em seguida, apenas comparamos cada elemento com cada um. Se encontrarmos 2 elementos idênticos, saia da comparação para (pois! Check retornará falso e os loops terminarão),e retorne aos loops for para alterar os mesmos números. Depois que todos os números no array forem diferentes, a variável checkMas se torna verdadeira e a verificação do array termina. Agora retornamos o array arr e fazemos o campo mas = arr.
Agora temos um número concebido por computador. Vamos implementar a suposição desse número pelo usuário. Para fazer isso, vamos escrever o método checkInput:
private void checkInput() {
Scanner scanner = new Scanner(System.in);
int[] arr = new int[length];
if (length == 1) System.out.println(" " + length + " ");
else {
if (length > 1 && length < 5) {
System.out.println(" " + length + " ");
} else {
if (length > 4 && length < 11) {
System.out.println(" " + length + " ");
}
}
}
boolean checkMas = false;
while (!checkMas) {
for (int i = 0; i < length; i++) {
do {
System.out.println(" ");
while (!scanner.hasNextInt()) {
System.out.println(" ");
scanner.next();
}
arr[i] = scanner.nextInt();
if(arr[i] < 0 || arr[i]>=10) System.out.println(" 0 9 ");
} while (arr[i] < 0 || arr[i] >= 10);
}
boolean check = checkInputArray(arr);
if (check) {
checkMas = true;
} else {
System.out.println(" ");
System.out.println(" ");
}
}
setInputArray(arr);
}
Da mesma forma, criamos um scanner e uma matriz auxiliar arr de comprimento de comprimento. Em seguida, vem um monte de ifs, que são responsáveis por não mais do que combinar um número e uma frase. Depois deles, há uma entrada direta e verificação do número do usuário. Para que não haja desacordo na lógica com o usuário, resolvi fazer com que o usuário inserisse cada número separadamente.
for (int i = 0; i < length; i++) {
do {
System.out.println(" ");
while (!scanner.hasNextInt()) {
System.out.println(" ");
scanner.next();
}
arr[i] = scanner.nextInt();
if(arr[i] < 0 || arr[i]>=10) System.out.println(" 0 9 ");
} while (arr[i] < 0 || arr[i] >= 10);
}
É nesta seção do código que o número é inserido e verificado. O trabalho é semelhante a inserir o comprimento da matriz, então não vejo razão para explicá-lo. Em seguida, a matriz do usuário é verificada quanto à presença dos mesmos números. Para fazer isso, vamos escrever o método checkInputArray:
private boolean checkInputArray(int[] arr) {
boolean checkMas = false;
boolean check = false;
for (int i = 0; i < arr.length && !check; i++) {
for (int j = 0; j < arr.length && !check; j++) {
if (i != j) {
if (arr[i] == arr[j]) {
check = true;
checkMas = false;
} else checkMas = true;
}
}
}
return checkMas;
}
Verificar é semelhante a verificar um array oculto, então não vou me alongar sobre isso. Se o número do usuário contiver números duplicados, pedimos que você insira o número inteiro novamente. E assim por diante até que seja inserido corretamente. Em seguida, alteramos o valor do campo inputArray para nosso array auxiliar arr. Por precaução, darei o código:
public void setInputArray(int[] inputArray) {
this.inputArray = inputArray;
}
Neste ponto, temos dois arrays: o array oculto e o array de entrada. É hora de descobrir quantos touros e quantas vacas o usuário encontrou.
Vamos descobrir isso usando o método checkCowAndBull:
private int[] checkCowAndBull() {
int[] arr = new int[2];
int cow = 0;
int bull = 0;
for (int i = 0; i < length; i++) {
for (int j = 0; j < length; j++) {
if (mas[i] == inputArray[j]) {
if (i == j) bull++;
else cow++;
}
}
}
arr[0] = cow;
arr[1] = bull;
return arr;
}
Criamos uma matriz auxiliar de 2 elementos. O primeiro é o número de vacas, o segundo é o número de touros. Em seguida, iteramos em ambos os arrays, comparando os elementos. Se os elementos são iguais e seus índices são iguais, aumentamos o número de touros, caso contrário, aumentamos o número de vacas. Depois disso, escrevemos os valores no array e o retornamos.
É hora de descobrir o que estava no construtor da classe BackEnd todo esse tempo.
public BackEnd() {
getMas();
//printMas(mas);
boolean win = false;
while (!win) {
checkInput();
System.out.println(" :");
printMas(inputArray);
System.out.println();
int[] arr = checkCowAndBull();
if (arr[1] == length) {
win = true;
System.out.println("! !");
} else {
System.out.println(" " + arr[0] + " , " + arr[1] + " ");
System.out.println(" ");
}
}
}
Primeiro, geramos o array pretendido. Eu imprimo para depuração, mas esta função não é necessária para o jogo. Como não sabemos por qual tentativa o usuário vai adivinhar o número, iniciamos o loop while até o momento apropriado. Em seguida, pedimos ao usuário para inserir seu número, exibir a matriz inserida, verificar o número de touros e vacas. Se o número de touros corresponder ao comprimento da matriz, o número será adivinhado e o jogo terminará. Caso contrário, o número de touros e vacas é exibido e o jogo continua.
Resta apenas adicionar a criação de uma instância da classe ao homem:
public class main {
public static void main(String[] args) {
BackEnd bk = new BackEnd();
}
}
Lançamos, conferimos, jogamos.
Obrigado pela atenção, a segunda parte estará disponível em breve.