-
Notifications
You must be signed in to change notification settings - Fork 0
/
JogoDaVelha.F95
103 lines (86 loc) · 2.76 KB
/
JogoDaVelha.F95
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
program jogo_da_velha
implicit none
character(len=1), dimension(3, 3) :: tabuleiro
character(len=1) :: jogador
integer :: linha, coluna, i, j
logical :: jogo_ativo
character(len=1) :: vencedor
! Inicializa o tabuleiro
tabuleiro = ' '
jogador = 'X'
jogo_ativo = .true.
print *, "Bem-vindo ao Jogo da Velha!"
do while (jogo_ativo)
call mostrar_tabuleiro(tabuleiro)
print *, "Jogador ", jogador, ", faça sua jogada (linha e coluna): "
read *, linha, coluna
! Verifica se a jogada é válida
if (linha < 1 .or. linha > 3 .or. coluna < 1 .or. coluna > 3 .or. tabuleiro(linha, coluna) /= ' ') then
print *, "Jogada inválida. Tente novamente."
else
tabuleiro(linha, coluna) = jogador
call verificar_vencedor(tabuleiro, jogador, vencedor, jogo_ativo)
if (jogo_ativo) then
if (jogador == 'X') then
jogador = 'O'
else
jogador = 'X'
endif
endif
endif
end do
call mostrar_tabuleiro(tabuleiro)
if (vencedor == ' ') then
print *, "O jogo terminou em empate!"
else
print *, "Parabéns Jogador ", vencedor, "! Você venceu!"
endif
contains
subroutine mostrar_tabuleiro(tabuleiro)
character(len=1), dimension(3, 3), intent(in) :: tabuleiro
integer :: i, j
print *, " 1 2 3"
do i = 1, 3
write(*, '(A)', advance="no") i, ' '
do j = 1, 3
if (tabuleiro(i, j) == ' ') then
write(*, '(A)', advance="no") '.'
else
write(*, '(A)', advance="no") tabuleiro(i, j)
endif
if (j < 3) write(*, '(A)', advance="no") '|'
end do
print *, ''
if (i < 3) print *, " -----"
end do
end subroutine mostrar_tabuleiro
subroutine verificar_vencedor(tabuleiro, jogador, vencedor, jogo_ativo)
character(len=1), dimension(3, 3), intent(in) :: tabuleiro
character(len=1), intent(in) :: jogador
character(len=1), intent(out) :: vencedor
logical, intent(out) :: jogo_ativo
integer :: i
vencedor = ' '
jogo_ativo = .true.
! Verifica linhas e colunas
do i = 1, 3
if (all(tabuleiro(i, :) == jogador) .or. all(tabuleiro(:, i) == jogador)) then
vencedor = jogador
jogo_ativo = .false.
return
endif
end do
! Verifica diagonais
if ((tabuleiro(1, 1) == jogador .and. tabuleiro(2, 2) == jogador .and. tabuleiro(3, 3) == jogador) .or. &
(tabuleiro(1, 3) == jogador .and. tabuleiro(2, 2) == jogador .and. tabuleiro(3, 1) == jogador)) then
vencedor = jogador
jogo_ativo = .false.
return
endif
! Verifica se o tabuleiro está cheio
if (all(tabuleiro /= ' ')) then
vencedor = ' '
jogo_ativo = .false.
endif
end subroutine verificar_vencedor
end program jogo_da_velha