Java desafio de programação: a adição de matrizes para o programa de tic-tac-toe 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 pelo 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. 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, o canto superior esquerdo quadrado (A1) É armazenado no elemento de matriz 0, e o quadrado direito de fundo (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. Provavelmente, você vai querer usar uma matriz bidimensional para esta tarefa. A matriz irá segurar oito, matrizes de três elementos, cada um dos quais representa os três índices de um determinado vector de três-em-um-fila.

    A matriz completa iria conter os seguintes dados:

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

Video: Programação em C/C++ - Aula 47 - Jogo da Forca - Parte 1

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

Uma vez que estes métodos referem-se os quadrados da placa de tic-tac-dedo do pé utilizando designações de linha-coluna, tal como A1 ou B2, sua implementação terão de mapear essas designações de números de índice. Por exemplo, se a cadeia A1 é passado para o método playAt, o programa deve marcar o jogo no índice 0 na matriz.

A classe TicTacToeBoard
ConstrutorDescrição
TicTacToeBoardCria um novo TicTacToeBoard com todos os quadrados em branco.
MétodoDescrição
void reset ()Redefine o status de cada quadrado de 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 não é um quadrado dos valores admissíveis, 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 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 qualquer linha, coluna ou diagonal contém todos os X.
2: Se qualquer linha, coluna ou diagonal contém todos Ó.
3: Se não houver quadrados vazios e nem X nem O 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 centro da praça.
* Se o centro não está vazio 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á vazio e sem cantos estão vazios, jogar uma das bordas (quadrados A2, B1, B3, ou C2).
String toString ()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 mais um desafio, para esta versão do desafio TicTacToeBoard, o jogador do computador deve usar uma estratégia mais inteligente contra o oponente humano. Determinar jogo do computador da seguinte forma:

Video: C++ - Aula 20 - Jogo da Forca

  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 de vencer o oponente 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.

    Video: D3SAFI66 #016 - Distância entre dois pontos (programação C)

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

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

    Video: Projeto Games DUNKA - Games 01 (movimentação simples e parede)

Note-se que para implementar essa 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 isso seria necessária, assumindo que s1, s2, e s3 são números inteiros que contêm os conteúdos dos três quadrados de uma das oito vectores, três-em-um-fileira:

if (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

Assim, aqui uma ponta: Em vez de utilizar 0, 1, e 2 representar um quadrado vazio, um X, e um O, usar 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 para esse vetor. Se o resultado é 18, X pode ganhar (233 = 18). Se o resultado é de 50, O 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!


Publicações relacionadas