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
Postar um comentário
Deixe o seu comentário.