import tkinter as tk
import math
class Carro:
def __init__(self, canvas, cor, raio_inicial, velocidade, x_inicial, y_inicial):
self.canvas = canvas
self.cor = cor
self.raio_inicial = raio_inicial # Raio original da pista
self.raio = raio_inicial # Raio atual (pode mudar durante a ultrapassagem)
self.velocidade = velocidade
self.angulo = 0
self.voltas = 0
self.ultrapassando = False
self.carro = canvas.create_oval(x_inicial - 10, y_inicial - 10, x_inicial + 10, y_inicial + 10, fill=cor)
self.label_voltas = tk.Label(janela, text=f"Voltas ({cor}): 0", font=("Helvetica", 12))
self.label_voltas.pack()
# Função para mover o carro e contar voltas
def mover(self):
self.angulo += self.velocidade
if self.angulo >= 360:
self.angulo = 0
self.voltas += 1
self.label_voltas.config(text=f"Voltas ({self.cor}): {self.voltas}")
# Calcula a posição com base no raio e no ângulo
radianos = math.radians(self.angulo)
x = 200 + self.raio * math.cos(radianos)
y = 200 + self.raio * math.sin(radianos)
self.canvas.coords(self.carro, x - 10, y - 10, x + 10, y + 10)
# Função para iniciar a ultrapassagem
def iniciar_ultrapassagem(self):
self.raio = self.raio_inicial - 15 # Sai da linha para ultrapassar
self.ultrapassando = True
# Função para finalizar a ultrapassagem e voltar à linha original
def finalizar_ultrapassagem(self):
self.raio = self.raio_inicial # Volta para a linha original
self.ultrapassando = False
# Função que move todos os carros
def mover_carros():
for i, carro in enumerate(carros):
carro.mover()
# Verifica se precisa ultrapassar (compara distância e ângulo de outros carros)
for j, outro_carro in enumerate(carros):
if i != j: # Não comparar o carro consigo mesmo
dist = distancia(carro, outro_carro)
# Se a distância for pequena e o carro estiver atrás, faz a ultrapassagem
if dist < 30 and carro.angulo < outro_carro.angulo and not carro.ultrapassando:
carro.iniciar_ultrapassagem()
# Quando o carro estiver à frente (maior ângulo), finaliza a ultrapassagem
if carro.ultrapassando and carro.angulo > outro_carro.angulo:
carro.finalizar_ultrapassagem()
# Atualiza o movimento a cada 50ms
janela.after(50, mover_carros)
# Função para calcular a distância entre dois carros
def distancia(carro1, carro2):
x1, y1, _, _ = carro1.canvas.coords(carro1.carro)
x2, y2, _, _ = carro2.canvas.coords(carro2.carro)
return math.sqrt((x2 - x1) ** 2 + (y2 - y1) ** 2)
# Janela principal
janela = tk.Tk()
janela.title("Corrida de Carros com Ultrapassagens")
# Canvas para desenhar a pista
canvas = tk.Canvas(janela, width=400, height=400)
canvas.pack()
# Desenha a pista (círculo maior)
pista = canvas.create_oval(50, 50, 350, 350, outline="black")
# Lista de carros, cada um com cor e velocidade diferentes
carros = [
Carro(canvas, "red", 150, 2, 190, 190), # Carro vermelho na linha de fora
Carro(canvas, "blue", 150, 3, 190, 190), # Carro azul na mesma linha
Carro(canvas, "green", 150, 4, 190, 190), # Carro verde também na mesma linha
Carro(canvas, "yellow", 150, 5, 190, 190), # Carro amarelo também na mesma linha
]
mover_carros()
# Inicia a interface gráfica
janela.mainloop()