Vídeo: 1.1: Code! Programming for Beginners with p5.js 2024
Isto O desafio da programação Java baseia-se nos desafios anteriores desta série Tic-Tac-Toe e testa sua capacidade de usar arrays - dois deles, de fato.
No Java Programming Challenge: Um jogo Tic-Tac-Toe simples e um desafio de programação Java: adicionando classe ao programa Tic-Tac-Toe simples, você é desafiado a escrever um programa para jogar o jogo simples de Tic-Tac-Toe.
Como um jogo, Tic-Tac-Toe grita pelo uso de uma matriz para representar o status do jogo. Sem arrays, você deve usar uma variável separada para representar cada quadrado da placa. Com uma matriz, você pode usar uma única variável para representar todos os nove quadrados.
Este desafio de programação é simples: escreva uma versão aprimorada do programa que faz uso de arrays. Você deve usar pelo menos dois arrays em sua solução:
-
Você deve usar uma matriz para representar a placa. Muito provavelmente, você quer usar uma matriz unidimensional com nove elementos, da seguinte forma:
0 | 1 | 2 --- | --- | --- 3 | 4 | 5 --- | --- | --- 6 | 7 | 8
Em outras palavras, o quadrado superior esquerdo (A1) é armazenado no elemento de matriz 0 e o quadrado inferior direito (C3) é armazenado no elemento de matriz 8.
-
Você também deve usar uma matriz para representar os oito possíveis vetores três em uma linha.
Você pode usar essa matriz para determinar se qualquer jogador ganhou o jogo. Provavelmente, você quer usar uma matriz bidimensional para esta tarefa. A matriz irá armazenar oito matrizes de três elementos, cada uma das quais representa os três índices de um determinado vetor de três em uma linha.
A matriz completa conteria os seguintes dados:
0 1 2 3 4 5 6 7 8 0 3 6 1 4 7 2 5 8 0 4 8 2 4 6
Um requisito adicional deste programa é que a classe TicTacToeBoard que você criou para esse desafio deve ser completamente compatível com a classe que você criou para o desafio anterior. Em outras palavras, ele deve implementar exatamente os mesmos métodos. Para sua conveniência, esses métodos são repetidos na tabela a seguir.
Como esses métodos se referem aos quadrados da placa tic-tac-toe usando designações de coluna de linha, como A1 ou B2, sua implementação precisará mapear essas designações para números de índice. Por exemplo, se a seqüência A1 for passada para o método playAt, o programa deve marcar a reprodução no índice 0 na matriz.
Construtor | Descrição |
---|---|
TicTacToeBoard | Cria um novo TicTacToeBoard com todos os quadrados vazios. |
Método | Descrição |
void reset () | Repor o status de cada quadrado para esvaziar. |
void playAt (String square, int player) | Marca o quadrado especificado (A1, A2, A3, B1, B2, B3, C1, C2 ou C3) para o jogador especificado (1 para X, 2 para O). Lança IllegalArgumentException se o quadrado não for um dos valores permitidos, o jogador não é 1 ou 2 ou o quadrado especificado não está vazio. |
int isGameOver () | Determina se o jogo acabou. Retorna 0 se o jogo não terminar, 1 se X ganhou o jogo, 2 se O ganhou o jogo e 3 se o jogo for um sorteio. As condições de término do jogo são as seguintes:
1: Se qualquer linha, coluna ou diagonal contém todos os X's. 2: Se qualquer linha, coluna ou diagonal contém todos os O's. 3: se não houver quadrados vazios e nem X nem O ganharam. |
int getNextMove () | Retorna um número inteiro que representa o próximo movimento para o oponente do computador. Este método deve fazer um esforço rudimentar para selecionar um bom movimento, de acordo com a seguinte estratégia:
* Se o centro (quadrado B2) estiver vazio, jogue o quadrado central. * Se o centro não estiver vazio, mas qualquer um dos quatro cantos (quadrados A1, A3, C1 ou C3) está vazio, toque um dos cantos (não importa qual). * Se o centro não estiver vazio e nenhum canto estiver vazio, toque uma das arestas (quadrados A2, B1, B3 ou C2). |
String toString () | Retorna uma string que representa o status atual da placa. A seqüência de caracteres inclui caracteres de nova linha para exibir as linhas, bem como linhas separadoras em linhas de console separadas, como neste exemplo:
O | | O - | - | - | X | - | - | - | X | |
Como um desafio adicional, para esta versão do desafio TicTacToeBoard, o jogador do computador deve usar uma estratégia mais inteligente contra o oponente humano. Determine a jogada do computador da seguinte forma:
-
Se for possível que o computador ganhe na próxima jogada, o computador deve ser jogado no quadrado vencedor.
-
Se for possível que o oponente humano ganhe em sua próxima jogada, o computador deve jogar no quadrado vencedor do adversário humano para bloquear a vitória.
-
Se o quadrado central estiver disponível, o computador deve pegar o quadrado central.
-
Se algum quadrado de canto estiver disponível, o computador deve tocar em um dos cantos disponíveis.
-
O computador deve ser reproduzido em um quadrado de borda disponível.
Note que para implementar esta estratégia, você precisará desenvolver uma rotina que pode determinar se qualquer jogador pode ganhar em seu próximo movimento. Para fazer isso, você terá que olhar para cada um dos vetores oito, três em uma linha para determinar se o vetor contém um quadrado vazio e se cada um dos outros dois quadrados contém marcas para o mesmo oponente (aquele é, dois X ou dois O's).
Você pode fazer isso usando 0 para representar um quadrado vazio, 1 para representar um X e 2 para representar um O. Mas isso exigiria uma lógica bastante complicada - algo assim seria necessário, assumindo que s1, s2, e s3 são números inteiros contendo o conteúdo dos três quadrados de um dos oito vetores de três fileiras:
se (s1 == 0 & s2 == 1 & s3 == 1) // X pode ganhe jogando em s1 se (s2 == 0 & s1 == 1 & s3 == 1) // X pode ganhar jogando em s2 se (s3 == 0 & s1 == 1 & s2 == 1) // X pode ganhar jogando em s3
Então, aqui está uma dica: Em vez de usar 0, 1 e 2 para representar um quadrado vazio, um X e um O, use os números primos 2, 3 e 5 em vez disso.Então, para determinar se um jogador pode ganhar em um determinado vetor, basta multiplicar os três valores desse vetor. Se o resultado for 18, X pode ganhar (233 = 18). Se o resultado for 50, O pode ganhar (255 = 50).
Note também que, embora esta estratégia seja uma melhoria em relação à estratégia empregada para versões anteriores do programa, ainda não é uma estratégia perfeita: você ainda pode bater o computador com a seqüência certa de peças. Se você quiser um desafio adicional, considere quais estratégias adicionais seriam necessárias para tornar o jogo inabalável e, em seguida, planejar uma maneira de implementar a nova estratégia.
Você pode encontrar a solução para este desafio na guia Downloads da página de produtos Java All-in-One For Dummies, 4th Edition.
Boa sorte!