20.9 C
Brasília
segunda-feira, junho 2, 2025

Unidade – Como codificar a marcação de pedras mortas no jogo de tabuleiro Go. Obtendo a entrada do usuário fora da atualização


Esta é uma pergunta de acompanhamento para Captura de codificação em Go. Eu tenho isso com sucesso trabalhando. Tenho certeza de que não estou repositando, essa é uma pergunta completamente diferente que tenho que é o mesmo projeto. O jogo está completo, exceto para contar o território no remaining. Atualmente, meu código conta parte do território, mas não tudo, por uma questão de simplicidade, codifiquei para detectar se uma coleção de espaços vazios conectados é inteiramente cercada por pedras de uma cor e se assim o marca como território. Aqui está um jogo acabado para referência.

Minha pergunta é: como permito que o jogador clique ou clique com o botão direito do mouse em parte da placa sem estar dentro do loop de atualização? Não está dentro do loop de atualização porque a atualização chama uma função chamada checkVictory, que chama uma função chamada Endgame.

Um jogo acabado de go, mostrando também as mensagens do console, destaques e scripts

O que estou tentando implementar é permitir que os jogadores marquem os territórios onde as pedras estão mortas, clicando à esquerda para adicionar um destaque .SsetActive (True) e um ponto, ou clicando com o botão direito para ocultar um destaque. O objetivo é que o Black possa marcar seu território e depois clicar em Passar a volta para permitir que o White marque seu território. Atualmente, não há destaque para alguns dos territórios de Black no canto superior direito e inferior da placa

Aqui está o meu código atual.

personal bool?(,) countExtraTerritory(bool?(,) currentTerritory)
{
    Debug.Log("It's black's flip to say territory not counted by the code. Click on Cross Flip if you end up finished. Click on to make territory, proper click on to undo clicking territory.");
    bool?(,) newTerritory = new bool?(19, 19);
    
    //Counts the territory that black claims by clicking.
    whereas (passCounter < 3)
    {
        if (Enter.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
            {
                mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
                mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
                if (currentTerritory((int)(9*mouseOver.x), (int)(9*mouseOver.y)) == null)
                {
                    newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = true;
                    TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
                }
            }
            else
            {
                mouseOver.x = -1;
                mouseOver.y = -1;
            }
        }
        if (Enter.GetMouseButtonDown(1))
        {
            RaycastHit hit;
            if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
            {
                mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
                mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
                if (currentTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) == true)
                {
                    newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = null;
                    TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
                }
            }
            else
            {
                mouseOver.x = -1;
                mouseOver.y = -1;
            }
            TerritoryHighlight.Occasion.hideHighlights(newTerritory);
        }
    }

    Debug.Log("It's white's flip to say territory not counted by the code. Click on Cross Flip if you end up finished. Click on to make territory, proper click on to undo clicking territory.");

    whereas (passCounter < 4)
    {
        if (Enter.GetMouseButtonDown(0))
        {
            RaycastHit hit;
            if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
            {
                mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
                mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
                if (currentTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) == null)
                {
                    newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = false;
                    TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
                }  
            }
            else
            {
                mouseOver.x = -1;
                mouseOver.y = -1;
            }
        }
        if (Enter.GetMouseButtonDown(1))
        {
            RaycastHit hit;
            if (Physics.Raycast(Digital camera.foremost.ScreenPointToRay(Enter.mousePosition), out hit, 25.0f, LayerMask.GetMask("BoardMask")))
            {
                // Have to Math.spherical() after which divide by 9 I feel. (As a substitute of (int) solid as in Checkers tutorial).
                mouseOver.x = ((float)Spherical(9 * (hit.level.x - goBoardOffset.x))) / 9;
                mouseOver.y = ((float)Spherical(9 * (hit.level.y - goBoardOffset.y))) / 9;
                if (currentTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) == false)
                {
                    newTerritory((int)(9 * mouseOver.x), (int)(9 * mouseOver.y)) = null;
                    TerritoryHighlight.Occasion.HighlightTerritory(newTerritory);
                }
            }
            else
            {
                mouseOver.x = -1;
                mouseOver.y = -1;
            }
            TerritoryHighlight.Occasion.hideHighlights(newTerritory);
        }
    }

    return newTerritory;
}

Algumas notas: a posição MouseOver.x é ajustada à escala das linhas na placa e, em seguida, é convertida novamente em um INT, o que deve dar um valor de 0 a 18 em qualquer lugar da placa. Não preciso de ajuda para solucionar isso, também a classe Destaques recebe uma matriz bool (19,19), se o valor dela for nulo, não haverá destaque, se o valor for verdadeiro, há um destaque preto e, se houver um valor falso, há um destaque branco.

O PassCounter incrementa sempre que o botão é clicado. O problema é o meu, enquanto os loops são loops infinitos, porque enquanto eles estão executando nem o botão Passturn funciona, nem a capacidade de clicar em um determinado ponto e gerar um objeto de destaque. Tentei ler o problema e parece que preciso ligar para a atualização novamente, usar uma declaração de rendimento ou uma declaração de invocar, mas eles não parecem exatamente o que estou procurando.

Uma declaração de rendimento atrasa o código para um limite de tempo especificado, mas o que eu quero fazer é continuar checando um clique no mouse na placa até que o botão Passar o retorno seja clicado.

Geralmente, na virada de um jogador, a função de atualização permite que eles cliquem em sua pedra colorida no lado direito da placa e arrastá -la para o lugar, mas agora não quero que eles possam fazer isso e só capaz de clicar em um espaço na placa e adicionar um objeto de destaque ou clicar no botão Passar.

Também tentei substituir as instruções do Whereas por IF, mas o jogo executa todo o código e termina o jogo sem permitir que você clique. Atualmente, termino o jogo imprimindo uma mensagem dizendo quem venceu ou se os jogadores empataram e, em seguida, usando isso.enabled = false;

Qualquer ajuda seria muito apreciada.

Related Articles

LEAVE A REPLY

Please enter your comment!
Please enter your name here

Stay Connected

0FansLike
0FollowersFollow
0SubscribersSubscribe
- Advertisement -spot_img

Latest Articles