Pular para o conteúdo principal

Gamão em Clipper

 STATIC aTabuleiro[24]

STATIC aBarra := {"", ""}

STATIC nRemovidas := {0, 0}

STATIC nVez := 1

STATIC aDados[4], nJogadas := 0


#DEFINE BRANCA "B"

#DEFINE PRETA  "P"


PROCEDURE MAIN

   LOCAL i, resp


   DO WHILE .T.

      CLS

      ? "Jogo de Gamão - Jogador (BRANCAS) vs Computador (PRETAS)"

      ? "Pressione qualquer tecla para começar..."

      INKEY(0)


      // Inicializa o tabuleiro

      FOR i := 1 TO 24

         aTabuleiro[i] := ""

      NEXT


      aTabuleiro[1]  := REPLICATE(PRETA, 2)

      aTabuleiro[6]  := REPLICATE(BRANCA, 5)

      aTabuleiro[8]  := REPLICATE(BRANCA, 3)

      aTabuleiro[12] := REPLICATE(PRETA, 5)

      aTabuleiro[13] := REPLICATE(BRANCA, 5)

      aTabuleiro[17] := REPLICATE(PRETA, 3)

      aTabuleiro[19] := REPLICATE(PRETA, 5)

      aTabuleiro[24] := REPLICATE(BRANCA, 2)


      aBarra[1] := ""

      aBarra[2] := ""

      nRemovidas[1] := 0

      nRemovidas[2] := 0

      nVez := 1


      // Loop principal da partida

      DO WHILE .T.

         CLS

         ExibeTabuleiro()

         IF nVez == 1

            ? "Sua vez (BRANCAS)"

            JogadaJogador()

         ELSE

            ? "Vez do Computador (PRETAS)..."

            JogadaComputador()

         ENDIF

         VerificaVitoria()

         nVez := 3 - nVez

      ENDDO


      // Após fim de jogo

      @ 22, 5 SAY "Deseja jogar novamente? (S/N): "

      resp := UPPER(CHR(INKEY(0)))

      IF resp != "S"

         EXIT

      ENDIF

   ENDDO

RETURN



PROCEDURE ExibeTabuleiro()

   LOCAL i, linha := 3, coluna


   @ linha, 5 SAY "     13 14 15 16 17 18   19 20 21 22 23 24"

   @ linha+1, 5 SAY "    -------------------+-------------------"


   // Linha superior do tabuleiro (pontos 13 a 24)

   FOR i := 13 TO 24

      coluna := (i - 13) * 3 + 6

      @ linha+2, coluna SAY IIF(LEN(aTabuleiro[i]) == 0, " .", SUBSTR(aTabuleiro[i],1,1) + LTRIM(STR(LEN(aTabuleiro[i]))))

   NEXT


   @ linha+3, 5 SAY "    -------------------+-------------------"


   // Linha inferior do tabuleiro (pontos 12 a 1)

   FOR i := 12 TO 1 STEP -1

      coluna := (12 - i) * 3 + 6

      @ linha+4, coluna SAY IIF(LEN(aTabuleiro[i]) == 0, " .", SUBSTR(aTabuleiro[i],1,1) + LTRIM(STR(LEN(aTabuleiro[i]))))

   NEXT


   @ linha+5, 5 SAY "      12 11 10  9  8  7    6  5  4  3  2  1"


   // Barra

   @ linha+7, 5 SAY "Barra - Brancas (B): " + STR(LEN(aBarra[1])) + "  Pretas (P): " + STR(LEN(aBarra[2]))


   // Peças removidas

   @ linha+8, 5 SAY "Peças removidas - Brancas: " + STR(nRemovidas[1]) + "  Pretas: " + STR(nRemovidas[2])

RETURN



PROCEDURE JogadaJogador()

   LOCAL d1, d2, i, jogadasUsadas := 0, usado[4], movsRestantes

   LOCAL origem, destino


   // Rolar dados

   d1 := 1 + INT(RAND() * 6)

   d2 := 1 + INT(RAND() * 6)


   IF d1 == d2

      nJogadas := 4

      FOR i := 1 TO 4

         aDados[i] := d1

         usado[i] := .F.

      NEXT

   ELSE

      nJogadas := 2

      aDados[1] := d1

      aDados[2] := d2

      usado[1] := .F.

      usado[2] := .F.

   ENDIF


   @ 15, 5 SAY "Dados: " + STR(d1) + " e " + STR(d2)


   movsRestantes := nJogadas


   WHILE movsRestantes > 0

      ExibeTabuleiro()

      @ 17, 5 SAY "Jogadas restantes: " + STR(movsRestantes)

      @ 18, 5 SAY "Informe origem da peça (1-24): "

      INPUT origem

      IF origem < 1 .OR. origem > 24

         @ 19, 5 SAY "Origem inválida!"

         LOOP

      ENDIF

      IF SUBSTR(aTabuleiro[origem], 1, 1) != BRANCA

         @ 19, 5 SAY "Sem peça branca nessa posição!"

         LOOP

      ENDIF


      // Escolher qual dado usar para mover

      @ 20, 5 SAY "Escolha o dado para usar (valores disponíveis): "

      FOR i := 1 TO nJogadas

         IF !usado[i]

            ? "Dado ", i, ": ", aDados[i]

         ENDIF

      NEXT

      @ 21, 5 SAY "Informe índice do dado a usar: "

      INPUT i

      IF i < 1 .OR. i > nJogadas .OR. usado[i]

         @ 22, 5 SAY "Dado inválido!"

         LOOP

      ENDIF


      destino := origem + aDados[i]


      IF destino > 24

         IF PodeRetirar(BRANCA)

            aTabuleiro[origem] := SUBSTR(aTabuleiro[origem], 2)

            nRemovidas[1] += 1

            usado[i] := .T.

            movsRestantes -= 1

            @ 23, 5 SAY "Peça branca removida do tabuleiro!"

            CONTINUE

         ELSE

            @ 23, 5 SAY "Não pode remover ainda!"

            LOOP

         ENDIF

      ENDIF


      IF OponenteTemMaisDe1Peca(destino, BRANCA)

         @ 23, 5 SAY "Destino bloqueado!"

         LOOP

      ENDIF


      // Captura?

      IF SUBSTR(aTabuleiro[destino], 1, 1) == PRETA .AND. LEN(aTabuleiro[destino]) == 1

         aBarra[2] += PRETA

         aTabuleiro[destino] := ""

      ENDIF


      // Move peça

      aTabuleiro[origem] := SUBSTR(aTabuleiro[origem], 2)

      aTabuleiro[destino] := BRANCA + aTabuleiro[destino]


      usado[i] := .T.

      movsRestantes -= 1

   ENDDO

RETURN



PROCEDURE JogadaComputador()

   LOCAL d1, d2, i, usado[4], movsRestantes, origem, destino, movAchado := .F.


   // Rolar dados

   d1 := 1 + INT(RAND() * 6)

   d2 := 1 + INT(RAND() * 6)


   IF d1 == d2

      nJogadas := 4

      FOR i := 1 TO 4

         aDados[i] := d1

         usado[i] := .F.

      NEXT

   ELSE

      nJogadas := 2

      aDados[1] := d1

      aDados[2] := d2

      usado[1] := .F.

      usado[2] := .F.

   ENDIF


   movsRestantes := nJogadas


   WHILE movsRestantes > 0

      movAchado := .F.


      FOR origem := 24 TO 1 STEP -1

         IF SUBSTR(aTabuleiro[origem], 1, 1) == PRETA

            FOR i := 1 TO nJogadas

               IF !usado[i]

                  destino := origem - aDados[i]

                  IF destino < 1

                     IF PodeRetirar(PRETA)

                        aTabuleiro[origem] := SUBSTR(aTabuleiro[origem], 2)

                        nRemovidas[2] += 1

                        usado[i] := .T.

                        movsRestantes -= 1

                        movAchado := .T.

                        EXIT FOR

                     ENDIF

                  ELSEIF !OponenteTemMaisDe1Peca(destino, PRETA)

                     IF SUBSTR(aTabuleiro[destino], 1, 1) == BRANCA .AND. LEN(aTabuleiro[destino]) == 1

                        aBarra[1] += BRANCA

                        aTabuleiro[destino] := ""

                     ENDIF

                     aTabuleiro[origem] := SUBSTR(aTabuleiro[origem], 2)

                     aTabuleiro[destino] := PRETA + aTabuleiro[destino]

                     usado[i] := .T.

                     movsRestantes -= 1

                     movAchado := .T.

                     EXIT FOR

                  ENDIF

               ENDIF

               IF movAchado

                  EXIT FOR

               ENDIF

            NEXT

         ENDIF

         IF movAchado

            EXIT FOR

         ENDIF

      NEXT


      IF !movAchado

         EXIT

      ENDIF

   ENDDO

RETURN



FUNCTION OponenteTemMaisDe1Peca(pos, cor)

   LOCAL oponente := IIF(cor == BRANCA, PRETA, BRANCA)

   RETURN (SUBSTR(aTabuleiro[pos], 1, 1) == oponente .AND. LEN(aTabuleiro[pos]) > 1)

ENDFUNCTION



FUNCTION PodeRetirar(cor)

   LOCAL i

   IF cor == BRANCA

      FOR i := 1 TO 18

         IF SUBSTR(aTabuleiro[i], 1, 1) == BRANCA

            RETURN .F.

         ENDIF

      NEXT

      RETURN .T.

   ELSE

      FOR i := 7 TO 24

         IF SUBSTR(aTabuleiro[i], 1, 1) == PRETA

            RETURN .F.

         ENDIF

      NEXT

      RETURN .T.

   ENDIF

ENDFUNCTION



PROCEDURE VerificaVitoria()

   IF nRemovidas[1] >= 15

      CLS

      ? "Parabéns! Você (BRANCAS) venceu!"

      EXIT

   ELSEIF nRemovidas[2] >= 15

      CLS

      ? "O Computador (PRETAS) venceu! Tente novamente."

      EXIT

   ENDIF

RETURN

Comentários

Postagens mais visitadas deste blog

Sites de Torneios

- Backgammon Galaxy: maior comunidade online para jogos casuais e torneios sérios[4]. - MegaJogos: oferece gamão online gratuito para jogar contra pessoas ou computador[3]. - Poli: permite jogar Backgammon online gratuito, contra amigos ou computador, em desktop e dispositivos móveis[7].**: maior comunidade online para jogos casuais e torneios sérios[4]. - MegaJogos: oferece gamão online gratuito para jogar contra pessoas ou computador[3]. - Poki: permite jogar Backgammon online gratuito, contra amigos ou computador, em desktop e dispositivos móveis[7]. Fontes: 3] Como Jogar Gamão Online - Aprenda as Regras Oficiais - MegaJogos https://www.megajogos.com.br/gamao-online/regras [4] Backgammon Galaxy - Play Online for Free https://www.backgammongalaxy.com [7] BACKGAMMON ONLINE - Jogue Grátis Online! - Poki https://poki.com/br/g/backgammon-html5