Desafio de programação Java: Adicionando matrizes para o Tic-Tac-Toe Programa Simples

Este desafio de programação Java baseia-se nos desafios anteriores desta série Tic-Tac-Toe e testa sua capacidade de usar matrizes - dois deles, na verdade.

Dentro Java Desafio Programação: A Simple Tic-Tac-Toe Jogo e Desafio de programação Java: Adicionando classe ao Tic-Tac-Toe Programa Simples você é desafiado a escrever um programa para jogar o simples jogo de Tic-Tac-Toe.

Como um jogo, Tic-Tac-Toe clama por o uso de uma matriz para representar o estado do jogo. Sem matrizes, você deve usar uma variável separada para representar cada quadrado do tabuleiro. Com uma matriz, você pode usar uma única variável para representar todos os nove quadrados.

Este desafio de programação é simples: escrever uma versão melhorada do programa que faz uso de matrizes. Você deve usar pelo menos duas matrizes em sua solução:

  1. Você deve usar uma matriz para representar a bordo. Muito provavelmente, você vai querer usar uma matriz unidimensional com nove elementos, como segue:

     0 | 1 | 2 --- | --- | --- 3 | 4 | 5 --- | --- | --- 6 | 7 | 8

    Em outras palavras, a parte superior esquerda quadrado (A1) É armazenado no elemento de matriz 0, eo quadrado inferior direito (C3) É armazenado no elemento de matriz 8.

  2. Você também deve usar uma matriz para representar os oito possíveis vetores de três-em-um-fila.

    Você pode então usar essa matriz para determinar se um ou outro jogador ganhou o jogo. Muito provavelmente, você vai querer usar uma matriz bidimensional para esta tarefa. A matriz vai realizar oito, matrizes de três elementos, cada um dos quais representa os três índices de um determinado vector três-em-um-fila.

    A matriz completa iria conter os seguintes dados:

     4 1 23 0 56 7 80 3 61 4 72 5 80 4 82 4 6 

Um requisito adicional deste programa é que o TicTacToeBoard classe criada para este desafio deve ser totalmente compatível com a classe que você criou para o desafio anterior. Em outras palavras, ele deve implementar os exatos mesmos métodos. Para a sua conveniência, estes métodos são repetidos na tabela a seguir.

Como esses métodos referem-se às casas do tabuleiro tic-tac-toe usando designações linha-coluna, como A1 ou B2, sua implementação será necessário mapear estas designações de números de índice. Por exemplo, se a cadeia A1 é passado para o método playAt, o programa deve marcar a peça no índice 0 na matriz.

A classe TicTacToeBoard
ConstrutorDescrição
TicTacToeBoard
Cria um novo TicTacToeBoard com todos os quadrados em branco.
MétodoDescrição
void reset ()Redefine o status de cada quadrado para vazio.
anular playAt (String quadrado, jogador int)Marca o quadrado especificado (A1, A2, A3, B1, B2, B3, C1, C2, ou C3) Para o jogador especificado (1 para X, para 2 O). lança IllegalArgumentException Se quadrado não é um dos valores permitidos, jogador não é 1 ou 2, ou a praça especificado não está vazio.
int isGameOver ()Determina se o jogo acabou. Retorna 0 se o jogo não acabou, 1 se X ganhou o jogo, 2 se O ganhou o jogo, e 3 se o jogo é um empate. O jogo terminando condições são as seguintes:
1: Se alguma linha, coluna ou diagonal contém todos os Xs.
2: Se alguma linha, coluna ou diagonal contém todas Ó.
3: Se não há casas vazias e nem X nem ó ganhou.
int getNextMove ()Retorna um inteiro que representa o próximo passo para o adversário do computador. Este método deve fazer um esforço rudimentar para selecionar uma boa jogada, de acordo com a seguinte estratégia:
* Se o centro (praça B2) Está vazio, tocar o quadrado central.
* Se o centro não está vazia, mas qualquer um dos quatro cantos (quadrados A1, A3, C1, ou C3) Estão vazias, jogar um dos cantos (não importa qual).
* Se o centro não está vazia e sem cantos estão vazios, desempenham um dos bordos (quadrados A2, B1, B3, ou C2).
toString String ()Retorna uma string que representa o estado atual da placa. A seqüência de caracteres inclui caracteres de nova linha para exibir as linhas, bem como linhas de separação em linhas de console separadas, como neste exemplo:
O | | O
---| --- | ---
| X |
---| --- | ---
| X |

Como um desafio acrescido, para esta versão do desafio TicTacToeBoard, o jogador computador deve usar uma estratégia mais inteligente contra o oponente humano. Determinar o jogo do computador da seguinte forma:

  1. Se é possível que o computador para ganhar em seu próximo jogo, o computador deve desempenhar na praça vencedora.

  2. Se é possível para o adversário humano para ganhar em seu jogo seguinte, o computador deve desempenhar na praça vencedora do adversário humano para bloquear a vitória.

  3. Se o centro da praça está disponível, o computador deve ter o centro da praça.

  4. Se qualquer um quadrado de canto está disponível, o computador deve jogar em um dos cantos disponíveis.

  5. O computador deve jogar em um quadrado de ponta disponível.

Observe que, para implementar esta estratégia, você vai precisar para desenvolver uma rotina que pode determinar se um ou outro jogador pode ganhar em seu próximo movimento. Para fazer isso, você tem que olhar para cada um dos oito, vetores três-em-um-fila para determinar se o vector contém um quadrado vazio e se a cada um dos outros dois quadrados contêm marcas para o mesmo adversário (que é, dois X ou dois ó).

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 a lógica bastante complicado - algo como isto seria necessária, assumindo que s1, s2, e s3 são números inteiros que possuem o conteúdo dos três quadrados de uma das oito vectores, três-em-um-fila:

Se (S1 == 0 S2 == 1 s3 == 1) // X pode ganhar por jogar em s1if (s2 == 0 S1 1 == s3 == 1) // X pode ganhar por jogar em s2if (s3 == 0 S1 1 == s2 == 1) // X pode ganhar por jogar em s3

Então aqui vai uma dica: Em vez de usar 0, 1 e 2 para representar um quadrado vazio, um X e um O, usar os números primos 2, 3 e 5 em vez. Em seguida, para determinar se um jogador pode ganhar em um dado vector, basta multiplicar os três valores para esse vector. Se o resultado é 18, X pode ganhar (233 = 18). Se o resultado for 50, S pode ganhar (255 = 50).

Note-se também que, embora esta estratégia é uma melhoria sobre a 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 correta das peças. Se você quiser um desafio adicional, considere o que estratégia adicional seria necessário para tornar o jogo impossível de ser vencida, e em seguida, encontrar uma maneira de implementar a nova estratégia.

Você pode encontrar a solução para este desafio na guia Downloads do Java All-in-One For Dummies, 4 página do produto Edition.

Boa sorte!

menu