Mahjong - Organizar as telhas para garantir pelo menos um caminho para a vitória, independentemente do esquema

StackOverflow https://stackoverflow.com/questions/159547

  •  03-07-2019
  •  | 
  •  

Pergunta

Independentemente do esquema a ser utilizado para as telhas, há alguma boa maneira de dividir as telhas de modo que você pode garantir que o usuário que, no início do jogo, existe pelo menos um caminho para completar o quebra-cabeça e ganhar o jogo?

Obviamente, dependendo de movimentos do utilizador, podem isolar-se de ganhar. Eu só quero ser capaz de dizer sempre o usuário que o quebra-cabeça é vencível se jogar bem.

Se você aleatoriamente lugar telhas no início do jogo, é possível que o usuário poderia fazer alguns movimentos e não ser capaz de fazer mais nada. O conhecimento de que um quebra-cabeça é pelo menos solucionável deve torná-lo mais divertido de jogar.

Foi útil?

Solução

Coloque todas as peças na ordem inversa (ou seja, o layout a placa começando no meio, trabalhar fora)

Para provocar o jogador ainda mais, você poderia fazê-lo visivelmente mas em velocidade muito alta.

Outras dicas

Jogue o jogo em sentido inverso.

Aleatoriamente lay out peças par a par, em lugares onde você pode deslizar-los no heap. Você vai precisar de uma maneira de sei , onde você está autorizado a peças de lugar, a fim de acabar com uma pilha que corresponda a algum padrão predefinido, mas você precisa que de qualquer maneira.

Eu sei que isto é uma questão de idade, mas me deparei com isso quando resolver o problema sozinho. Nenhuma das respostas aqui são bastante perfeito, e vários deles têm complicado ressalvas ou vai quebrar em layouts patológicas. Aqui está a minha solução:

Resolva a bordo (para a frente, não para trás) com azulejos não marcadas. Remova duas peças livres de cada vez. Empurre cada par de remover em uma pilha "pares combinados". Muitas vezes, isso é tudo que você precisa fazer.

Se você executar em um beco sem saída (numFreeTiles == 1), apenas redefinir seu gerador :) Eu descobri que eu normalmente não bater becos sem saída, e, até agora, têm uma contagem de tentativas máximo de 3 para o 10 ou tão layouts Eu tentei. Uma vez eu bati 8 tentativas, eu desistir e apenas atribuir ao acaso o resto das telhas. Isso me permite usar o mesmo gerador tanto para criação do conselho, e o recurso shuffle, mesmo se o jogador asneira e fez um estado insolúvel 100%.

Outra solução quando você bate um beco sem saída é voltar para fora (pop da pilha, substituindo peças no tabuleiro) até que você pode tomar um caminho diferente. Tomar um caminho diferente, certificando-se combinar pares que irá remover a peça de bloqueio originais.

Infelizmente, dependendo da placa, este ciclo de Maio de sempre. Se você acabar a remoção de um par que se assemelha a um "sem saída" de estrada, onde todas as "estradas" subseqüentes são um beco sem saída, e há vários becos sem saída, o algoritmo nunca será concluída. Eu não sei se é possível projetar uma placa onde este seria o caso, mas se assim for, ainda há uma solução.

Para resolver esse problema maior, tratar cada estado pensão possível como um nó em um DAG, com cada par selecionado sendo uma vantagem sobre esse gráfico. Fazer um percurso aleatório, até encontrar um nó folha em profundidade 72. faixa de manter seu histórico de travessia de modo que você nunca repetir uma descida.

Desde becos sem saída são mais raros do que as soluções de primeira tentar no layouts que tenho usado, o que imediatamente vem à mente é uma solução híbrida. Primeiro tentar resolvê-lo com memória mínima (loja selecionada pares em sua pilha). Uma vez que você acertar o primeiro beco sem saída, degrade a fazer pleno geração marcação / edge ao visitar cada nó (avaliação preguiçosa, sempre que possível).

Eu tenho feito muito pouco estudo da teoria dos grafos, embora, por isso talvez haja uma solução melhor para o percurso aleatório DAG problema / search:)

Edit: Você realmente poderia usar qualquer uma das minhas soluções w / gerando a placa em sentido inverso, ala do pós 13 de outubro de 2008. Você ainda tem as mesmas ressalvas, porque você ainda pode acabar com becos sem saída. Gerando uma placa em regras inversa foi mais complicado, no entanto. Por exemplo, você está garantido para deixar a sua configuração, se você não começar pelo menos algumas de suas linhas w / a primeira peça no meio, como em um layout w / 1 longa fila. Escolher um completamente aleatório (legal) primeiro movimento em um gerador de frente-a solução é mais susceptível de conduzir a uma placa solucionável.

A única coisa que eu tenho sido capaz de chegar a é colocar as telhas para baixo em pares combinando como uma espécie de jogo de Mahjong Solitaire inversa. Assim, a qualquer momento durante a colocação de telha, a placa deve olhar como ele está no meio de um jogo real (ou seja, sem telhas flutuantes 3 camadas acima outras peças).

Se as telhas são lugar em pares em um jogo inverso, deve sempre resultar em pelo menos um caminho para a frente para resolver o jogo.

Eu adoraria ouvir outras ideias.

Eu acredito que a melhor resposta já foi empurrado para cima: a criação de um conjunto de resolvê-lo "em sentido inverso" - ou seja, começando com uma placa em branco, em seguida, adicionando um lugar par, adicione um outro par em uma posição solucionável, e assim por diante. ..

Se você um preferem abordagem "Big Bang" (gerando todo o conjunto aleatoriamente no início), são uma macho desenvolvedor ou apenas sentir masoquista hoje, você poderia representar todos os pares que você pode tomar para fora a partir do conjunto de dados e como eles dependem uns dos outros por meio de um grafo orientado.

De lá, você só tem que obter o fechamento transitivo desse conjunto e determinar se há pelo menos um caminho de pelo menos um dos pares legais iniciais que leva ao fim desejado (sem pares de azulejos esquerda).

A implementação desta solução é deixada como um exercício para o leitor: D

Aqui estão as regras i utilizados na minha implementação.

Quando buildingheap, para cada traste em um par separadamente, encontrar um células (lugares), que são:

  • tem todas as células em níveis mais baixos já preenchido
  • lugar para segundo traste não bloqueia primeiro, considerar se primeiro traste já colocado a bordo
  • ambos os lugares estão "em bordas" da pilha já construído:
    • ou tem pelo menos um vizinho no lado esquerdo ou direito
    • OR é primeiro traste em uma linha (todas as células à direita e esquerda são recursivamente livre)

Estas regras não garantem uma compilação será sempre bem-sucedido - que às vezes deixam últimas 2 células livres auto-bloqueio, e de construção deve ser repetida (ou, pelo menos, últimos trastes) Na prática, "tartaruga" construído em não mais de 6 tentativas.

A maioria dos jogos existiam parece restringir colocando primeiro ( "primeiro na linha") trastes em algum lugar em um meio. Esta vir para cima com mais configurações convenientes, quando não há trastes nas bordas de linhas muito longas, permanecendo até movimentos último jogador. No entanto, "meio" é diferente para diferentes configurações.

Boa sorte:)

P.S. Se você encontrou algo que construir pilha solucionável em um turno -. Por favor me avise

Você tem 144 peças no jogo, cada um dos 144 peças tem uma lista de bloqueio .. (Telhas de topo na pilha tem uma lista bloco vazio)

Todos os movimentos válidos exigem que o seu "current__vertical_Block_list" estar vazio .. isso pode ser uma matriz de 144x144 tão 20k de memória, mais uma esquerda e lista de bloqueio DIREITA, também 20 k cada.

Gerar uma tabela movimento válido a partir de (remaning_tiles) E ((esvaziar CURRENT VERTICAL DO BLOCO LIST) e ((esvaziar CURRENT ESQUERDA BLOCO LIST) OR (esvaziar CURRENT DIREITO BLOCO LIST)))

Pick 2 peças aleatórias da mesa movimento válido, gravá-las Atualize o (tabelas atuais Vert, esquerda e direita), gravar as telhas removido para uma pilha

Agora, temos uma lista de movimentos que constituem um jogo válido. Atribuir tipos de telha de correspondência para cada um dos 72 movimentos.

para desafiar jogos, controlar quando cada peça se torna disponível. encontrar conjuntos que temos são (início precoce início tardio) e (final de tarde tarde cedo) desde que é em branco, você encontra 1 EE 1 LL e 2 blocos LE .. do LE bloco 2, encontrar um início que bloqueia qualquer outro EARLY que ( exceto rightblocking um pedaço lado esquerdo)
Uma vez que você tem um jogo válido por aí com a ordenação.

Solitaire? Apenas um palpite, mas eu diria que o computador precisa para vencer o jogo (ou próximo a ela) para determinar isso.

Outra opção poderia ser a de ter vários layouts predefinidos (que permitem vencedoras, misturado com seu nível atual.

Até certo ponto você pode tentar certificar-se de que um dos 4 telhas não é mais do que as camadas X abaixo outra X.

A maioria dos jogos que eu vejo tem o comando aleatória para quando alguém fica preso.

Gostaria de tentar uma mistura de coisas e ver o que funciona melhor.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top