Este projeto implementa um simulador completo do Campeonato Brasileiro utilizando Portugol WebStudio. O programa simula todas as partidas em turno e returno entre 20 equipes, contabilizando:
Pontos
Gols marcados
Gols sofridos
Saldo de gols
Ao final, uma tabela oficial formatada é exibida no console.
Simulação de um campeonato com 20 times
Partidas de ida e volta (38 rodadas simuladas)
Distribuição aleatória de resultados usando u.sorteia
Cálculo automático de:
Pontos (3 vitória, 1 empate)
Gols marcados
Gols sofridos
Saldo de gols
Impressão de uma tabela ordenada do 1º ao 20º colocado
Formatação visual da tabela, alinhando nomes e colunas
Portugol WebStudio
Biblioteca interna Util (para sorteios)
Vetores para armazenar estatísticas dos times
alinhaTexto() → alinha o nome do time para manter a tabela organizada
O programa define uma lista com 20 times brasileiros.
Inicializa os vetores de pontos, gols marcados e gols sofridos.
Para cada par de times, simula:
Vitória do time A
Vitória do time B
Empate
Para cada resultado, gols são sorteados entre 1 e 3.
Ao final, o programa identifica repetidamente o time com mais pontos, exibe sua linha na tabela e zera seus pontos para encontrar o próximo colocado.
A tabela final é impressa com:
| CLUBE | PTS | GM | GS | SG |
Vitória → +3 pontos
Empate → +1 ponto
Saldo de gols = golsMarcados - golsSofridos
Gols também são sorteados aleatoriamente usando:
u.sorteia(1,3)
🖥️ Saída esperada (exemplo simplificado)
_________________________________________________________
| CLUBE | PTS | GM | GS | SG |
|-----------------------|-------|------|-------|--------|
| 1 | Flamengo | 78 | 55 | 22 | 33 |
| 2 | Palmeiras | 74 | 48 | 19 | 29 |
...
| 20 | Sport | 18 | 21 | 60 | -39 |
---------------------------------------------------------
(Os valores mudam a cada execução, pois são sorteados.)
Responsável por padronizar o tamanho da coluna “CLUBE” usando espaços extras. Isso garante que a tabela fique alinhada visualmente.
Trecho responsável por simular ida e volta:
para (k = 0; k < 2; k++) {
para (i = 0; i < 19; i++) {
para (j = i + 1; j < 20; j++) {
vencedor = u.sorteia(1,3)
Isso garante que cada time jogue duas vezes com todos os outros.
O código encontra sempre o time com maior pontuação restante:
para (j = 0; j < 20; j++) {
auxPontos = -1
para (i = 0; i < 20; i++) {
se (pontos[i] > auxPontos) então ...
E imprime do 1º ao 20º colocado.
Abra o Portugol WebStudio
Cole todo o código do projeto
Clique em Executar
Observe a tabela completa sendo gerada no console
programa {
inclua biblioteca Util --> u
cadeia times[20]
funcao cadeia alinhaTexto(cadeia texto) {
se (texto == "Vitória") retorne "| Vitória "
se (texto == "Atlético-MG") retorne "| Atlético-MG "
se (texto == "Bahia") retorne "| Bahia "
se (texto == "Botafogo") retorne "| Botafogo "
se (texto == "Ceará") retorne "| Ceará "
se (texto == "Corinthians") retorne "| Corinthians "
se (texto == "Cruzeiro") retorne "| Cruzeiro "
se (texto == "Flamengo") retorne "| Flamengo "
se (texto == "Fluminense") retorne "| Fluminense "
se (texto == "Fortaleza") retorne "| Fortaleza "
se (texto == "Grêmio") retorne "| Grêmio "
se (texto == "Internacional") retorne "| Internacional "
se (texto == "Juventude") retorne "| Juventude "
se (texto == "Mirassol") retorne "| Mirassol "
se (texto == "Palmeiras") retorne "| Palmeiras "
se (texto == "RB Bragantino") retorne "| RB Bragantino "
se (texto == "Santos") retorne "| Santos "
se (texto == "São Paulo") retorne "| São Paulo "
se (texto == "Sport") retorne "| Sport "
se (texto == "Vasco") retorne "| Vasco "
retorne texto
}
funcao inicio() {
cadeia times[20], auxTime
inteiro pontos[20], partidas[38], vencedor = 0, auxPontos = 0, posicaoMaior, colocacao = 1, golsMarcados[20], golsSofridos[20], gols = 0, auxgm, auxgs, saldoDegols
times[0] = "Vitória"
times[1] = "Atlético-MG"
times[2] = "Bahia"
times[3] = "Botafogo"
times[4] = "Ceará"
times[5] = "Corinthians"
times[6] = "Cruzeiro"
times[7] = "Flamengo"
times[8] = "Fluminense"
times[9] = "Fortaleza"
times[10] = "Grêmio"
times[11] = "Internacional"
times[12] = "Juventude"
times[13] = "Mirassol"
times[14] = "Palmeiras"
times[15] = "RB Bragantino"
times[16] = "Santos"
times[17] = "São Paulo"
times[18] = "Sport"
times[19] = "Vasco"
para (inteiro i = 0; i<20; i++) {
pontos[i] = 0
golsMarcados[i] = 0
golsSofridos[i] = 0
}
para (inteiro k = 0; k<2; k++) {
para (inteiro i = 0; i<19; i++) {
para (inteiro j = i + 1; j<20; j++) {
vencedor = u.sorteia(1,3)
se (vencedor==1) {
pontos[i] = pontos[i] + 3
gols = u.sorteia(1,3)
golsMarcados[i] += gols
golsSofridos[j] += gols
}
se (vencedor==2) {
pontos[j] = pontos[j] + 3
gols = u.sorteia(1,3)
golsMarcados[j] += gols
golsSofridos[i] += gols
}
se (vencedor==3) {
pontos[i] = pontos[i] + 1
pontos[j] = pontos[j] + 1
gols = u.sorteia(1,3)
golsMarcados[i] += gols
golsMarcados[j] += gols
golsSofridos[j] += gols
golsSofridos[i] += gols
}
}
}
}
escreva("_________________________________________________________\n| CLUBE | PTS | GM | GS | SG |\n|-----------------------|-------|------|-------|--------|\n")
para (inteiro j = 0; j < 20; j++) {
auxPontos = -1
posicaoMaior = -1
para (inteiro i = 0; i < 20; i++) {
se (pontos[i] > auxPontos) {
auxPontos = pontos[i]
auxTime = times[i]
auxgs = golsSofridos[i]
auxgm = golsMarcados[i]
posicaoMaior = i
}
}
pontos[posicaoMaior] = 0
saldoDegols = auxgm - auxgs
auxTime = alinhaTexto(auxTime)
se (colocacao<10) {
se (saldoDegols>=0 e saldoDegols<10) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
se (saldoDegols>9) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
se (saldoDegols<0 e saldoDegols>-10) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
se (saldoDegols<=-10) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
} senao {
se (saldoDegols>=0 e saldoDegols<10) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
se (saldoDegols>9) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
se (saldoDegols<0 e saldoDegols>-10) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
se (saldoDegols<=-10) {
escreva("| ",colocacao , " ", auxTime, " | ", auxPontos, " | ",auxgm, " | ",auxgs," | ", saldoDegols, " |\n")
}
}
colocacao++
}
escreva("| | | | | | |\n‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾‾")
}
}