Code:
#include <avr/io.h> 
#include <util/delay.h>
#include <avr/interrupt.h>

volatile uint8_t a=0;											// Variablen für den Spielchipstand
volatile uint8_t b=0;
volatile uint8_t c=0;
volatile uint8_t d=0;
volatile uint8_t Eingang;										// Variable welche Lichtschranke ausgelöst hat

enum {Spieler_1,Spieler_2,Spieler_3,Spieler_4};

void set_output(void)											// Funktion für die PWM
{ 
	
	DDRB = 0x08;											// PB3 auf Ausgang
	TCCR0 |= (1<<WGM00)|(1<<WGM01) |(1<<COM01)|(1<<CS00);	// Timer Einstellungen
	 
	 }
	 
ISR(INT1_vect)												// Interrupt Routine

	if (~PINB & (1<<PB4))									// Abfrage Lichtschranke 1
	{
		Eingang=Spieler_1;
		a++;												// Chipstand aktualisieren
	}
	if (~PINB & (1<<PB5))									// Abfrage Lichtschranke 2
	{
		 Eingang=Spieler_2;
		 b++;											// Chipstand aktualisieren
	
	if (~PINB & (1<<PB6))									// Abfrage Lichtschrane 3
	{
		 Eingang=Spieler_3;
		 c++;											// Chipstand aktualisieren
	}
	if (~PINB & (1<<PB7))									// Abfrage Lichtschranke 4
	{
		 Eingang=Spieler_4;
		 d++;											// Aktueller Chipstand
	}
	switch (Eingang)
	{
		case Spieler_1:
		switch (a)
		{
			case 1:										// 1 Spielchip verloren
			PORTA = (PORTA | (1 << PA4)) & ~(1 << PA0);			// LED gruen aus und LED gelb an
			break;
			case 2:										// 2 Spielchip verloren
			PORTA &= ~(1<<PA4);							// LED gelb aus
			PORTC |= (1<<PC7);								// LED rot ein
			break;
			case 3:										// 3 Spielchip
			PORTC &= (1<<PC7);								// LED rot aus
			break;
			default:
			break;
		}
		break;
		case Spieler_2:
		switch (b)
		{
			case 1:										// 1 Spielchip verloren
			PORTA = (PORTA | (1 << PA5)) & ~(1 << PA1);			// LED gruen aus und LED gelb an
			break;
			case 2:										// 2 Spielchip verloren
			PORTA &= ~(1<<PA5);							// LED gelb aus
			PORTC |= (1<<PC6);								// LED rot ein
			break;
			case 3:										// 3 Spielchip verloren
			PORTC &= (1<<PC6);								// LED rot aus
			break;
			default:
			break;
		}
		break;
		case Spieler_3:
		switch (c)
		{
			case 1:						         			// 1 Spielchip verloren
			PORTA = (PORTA | (1 << PA6)) & ~(1 << PA2);			// LED gruen aus und LED gelb ein
			break;
			case 2:										// 2 Spielchip verloren
			PORTA &= ~(1<<PA6);							// LED gelb aus
			PORTC |= (1<<PC5);								// LED rot ein
			break;
			case 3:										// 3 Spielchip verloren
			PORTC &= (1<<PC5);								// LED rot aus
			break;		
			default:
			break;
		}
		break;
		case Spieler_4:								
		switch (d)
		{
			case 1:										// 1 Spielchip verloren
			PORTA = (PORTA | (1 << PA7)) & ~(1 << PA3);			// LED gruen aus und LED gelb ein
			break;
			case 2:										// 2 Spielchip verloren
			PORTA &= ~(1<<PA7);							// LED gelb aus
			PORTC |= (1<<PC4);								// LED rot ein
			break;
			case 3:										// 3 Spielchip verloren
			PORTC &= (1<<PC4);								// LED rot aus
			break;
			default:
			break;
		}
		break;
	}
	}

int main(void)												// Hauptprogramm
 { 
	 MCUCR |= (1<<ISC10)|(1<<ISC11);							// Steigende Flanke an INT1 erzeugt Interrupt
	 GICR |= (1<<INT1);										// INT 1 erlaube Interrupt Request
	 DDRB = 0x00;											// PortB auf Eingang
	 DDRA = 0xFF;											// PortA auf Ausgang
	 DDRC = 0xF0;											// PC4-PC7 auf Ausgang
	 PORTA = 0x0F;											// PA0-PA3 auf "high"
	 PORTC = 0x00;											// PortC auf "low"
	 int max_value=5;										// Max. Variable für rand Funktion
	 int value = 0;											// Min. Variable für rand Funktion
	 int max_value_2=5;										// Max. Variable für rand Funktion
	 int value_2 = 0;										// Min. Variable für rand Funktion
	 sei ();												// Globale Interruptfreigabe

	while(1)												// Hauptschleife
	{ 
		value = (rand()%max_value);							// Zufallsauswahl für Geschwindigkeit
		
		switch (value) 
		{ 
			
		case 1: set_output();							        	// Geschwindigkeitsstufe 1 (Langsamste)
		OCR0 = 64; 
		break; 
		
		case 2: set_output();									// Geschwindigkeitsstufe 2 
		OCR0 = 128;
		break; 
		
		case 3: set_output();									// Geschwindigkeitsstufe 3
		OCR0 = 192; 
		break; 
		
		case 4: set_output();									// Geschwindigkeitsstufe 4 (Schnellste)
		OCR0 = 255; 
		break;
		
		default: 
		break;
		 
		}
		 
		 value_2 = (rand()%max_value_2);						// Zufallsauswahl für Wartezeit
		 
		 switch (value_2)
		 {
			 case 1:										// Wartezeit zum nächsten Wechsel 1 Sekunde
			 _delay_ms(1000);
			 break;
			 
			 case 2:										// Wartezeit zum nächsten Wechsel 2 Sekunde
			 _delay_ms(2000);
			 break;
			 
			 case 3:
			 _delay_ms(3000);								// Wartezeit zum nächsten Wechsel 3 Sekunde
			 break;
			 
			 case 4:
			 _delay_ms(4000);								// Wartezeit zum nächsten Wechsel 4 Sekunde
			 break;
			 
			 default:
			 _delay_ms(2500);								// Wartezeit zum nächsten Wechsel 2,5 Sekunde
			 break;
		 }
	}
 }