Jogo de cartas: War

URL

Comentários

Esse problema requer muita atenção ao enunciado. São vários desafios:

  1. Como ler a entrada do programa? Em uma única string? em um array de caracteres? caracter por caracter?
  2. Como construir a função que compara qual carta vale mais?
  3. Que estrutura de dados devemos usar para representar as cartas de cada jogador?
  4. Que estrutura de dados devemos usar para representar as cartas da mesa?

A resposta para essas questões irá lhe levar a resolver esse problema.

Vamos discutir uma por uma:

1. Leitura de dados

Uma opção seria ler a string da linha, fazendo:

std::getline (std::cin,suastring);

Porém, ao fazer isso, a gente ainda teria que fazer um parser dessa string para separar cada carta.

Alternativas similares você poderia fazer usando o gets, fgets ou getline usando um array de caracteres como parâmetro.

Já que a gente vai ter que fazer o parser de qualquer forma, pensei em ler direto caracter por caracter e já ir separando as cartas lidas para colocar nas mãos de cada um dos jogadores.

2. Como descobrir qual carta vale mais?

Para esse caso, pensei em duas alternativas. A primeira consistia de fazer um array com 255 caracteres, correspondendo a tabela ascci nos valores das letras, eu colocaria quanto ela vale no jogo. Por exemplo:

int values[255];

values['A'] = 13;

values['K'] = 12;

...

values['2'] = 1;

Outra ideia, similar a essa e que foi a que usei, foi criar um dicionário: http://www.cplusplus.com/reference/map/map/

3. Que estrutura devemos representar as cartas dos jogadores?

Essa é uma das partes mais interessantes. Embora a gente tenha uma tendência a associar uma pilha de cartas a uma estrutura de pilha. Nesse caso, veja que o comportamento é de uma FIFO. Ou seja, você descarta a carta que está em cima, e quando você ganha novas cartas, você coloca-as embaixo das cartas que já possui. Ou seja, First In First Out. Logo, podemos pensar em usar uma das estruturas de fila do C++. Que poderia ser uma list, deque, queue ou mesmo um vector. Acabei optando pelo deque, por que ele tem a função clear() que usei na solução. O deque é uma lista que pode crescer pros dois lados, ou seja, você pode usar tanto como fila tanto como pilha. Mas nesse caso, só estou usando como fila.

4. Cartas da mesa

Em relação às cartas da mesa, veja que o comportamento é assim:

primeira carta do jogador 1

primeira carta do jogador 2

segunda carta do jogador 1

segunda carta do jogador 2

terceira carta do jogador 1

terceira carta do jogador 2

Aí, quando alguém ganha as cartas da mesa, ele coloca-as na mesma ordem em que elas foram colocadas na mesa, ou seja, vai para o final da mão dele:

primeira carta do jogador 1

primeira carta do jogador 2

segunda carta do jogador 1

segunda carta do jogador 2

terceira carta do jogador 1

terceira carta do jogador 2

Ou seja, esse é um comportamento de FIFO e não de pilha. Sendo assim, também usei o deque para representar a mesa.