Jogo da memória com 18 blocos. Crie um vetor com 18 posições, numeradas de 0 a 9 e 0 a 9 novamente. Misture estas posições. Crie um vetor de 18 posições com valores boleanos setados como False. Preencha uma numeração bem formatada de 0 a 17 no topo da tela e logo abaixo dela preencha com asteriscos, um para cada posição. O jogador então escolherá duas posições, de 0 a 17. Caso os números sejam idênticos, o a posição de valores booleanos será setada para True e a posição descoberta na próxima rodada. O jogo termina quando todas as posições forem reveladas. Forneça ao usuário o número de rodadas necessárias para completar o jogo.

Passo 1

Resumo do Enunciado e Conteúdo Necessário
Estamos criando um jogo da memória com 18 blocos. Para isso, precisamos usar vetores para armazenar os números e o estado das cartas (se estão reveladas ou não). Vamos precisar:
  • Um vetor com 18 posições contendo números de 0 a 9 repetidos duas vezes.
  • Um método para misturar esses números aleatoriamente.
  • Um vetor de 18 posições com valores booleanos (True ou False) para indicar se a posição foi revelada.
  • Exibir os números de 0 a 17 na tela, abaixo dos quais estarão asteriscos representando as cartas.
  • Permitir que o jogador escolha duas posições por rodada.
  • Verificar se os números escolhidos são iguais para revelar as cartas.
  • Contar o número de rodadas necessárias para completar o jogo.

Passo 2

Criando o Vetor de Números
Primeiro, vamos criar um vetor com 18 posições onde os números de 0 a 9 aparecem duas vezes cada. Isso garante que cada número tenha um par para o jogo da memória.
numeros = [0,1,2,3,4,5,6,7,8,9,0,1,2,3,4,5,6,7]

Passo 3

Misturando os Números
Para deixar o jogo mais desafiador, precisamos misturar os números de forma aleatória no vetor. Assim, as posições não seguem uma ordem previsível.
import random
random.shuffle(numeros)

Passo 4

Criando o Vetor de Estados Booleanos
Vamos criar um vetor de 18 posições onde cada posição começa como False, indicando que nenhuma carta foi revelada no início do jogo.
estado = [False] * 18

Passo 5

Exibindo o Tabuleiro Inicial
Precisamos mostrar ao jogador as posições disponíveis (de 0 a 17) e abaixo delas, asteriscos representando as cartas não reveladas.
print("Posições: " + " ".join(map(str, range(18))))
print("Cartas:    " + " ".join(['*']*18))

Passo 6

Lógica do Jogo
Agora, vamos criar um loop que continuará rodando até que todas as cartas sejam reveladas. Em cada rodada, o jogador escolherá duas posições. Se os números nessas posições forem iguais, atualizamos o vetor de estados para True nessas posições, revelando-as.
rodadas = 0

while not all(estado):
    try:
        escolha1 = int(input("Escolha a primeira posição (0-17): "))
        escolha2 = int(input("Escolha a segunda posição (0-17): "))
        
        if numeros[escolha1] == numeros[escolha2]:
            estado[escolha1] = True
            estado[escolha2] = True
            print("Você encontrou um par!")
        else:
            print("Não é um par. Tente novamente.")
        
        rodadas += 1
    except (IndexError, ValueError):
        print("Entrada inválida. Por favor, escolha números entre 0 e 17.")

Passo 7

Encerrando o Jogo
Quando todas as posições do vetor estado forem True, o jogo termina. Então, informamos ao jogador o número de rodadas que ele precisou para completar o jogo.
print(f"Parabéns! Você completou o jogo em {rodadas} rodadas.")

Resposta

O jogo foi completado em X rodadas, onde X representa o número de tentativas realizadas pelo jogador para revelar todas as cartas.

Exercícios relacionados