program Bombe;
uses crt, sysutils, dateutils;

type
	t_eleve = RECORD
		prenom : string[30];
		vie : integer;
	end;
	
	ptr_noeud = ^noeud;
	noeud = RECORD
		valeur : t_eleve;
		suivant : ptr_noeud;
	end;
	
function nvEleve(prenom : string) : t_eleve;
begin
	nvEleve.prenom := prenom;
	nvEleve.vie := 0;
end;

procedure gameRonde(lg, nbjoueurs : integer ; premier : ptr_noeud ; player : array of t_eleve ; var game : ptr_noeud);
var
	tmp : ptr_noeud;
begin
	if nbjoueurs > 0 then
	begin
		new(tmp);
		tmp^.valeur := player[lg-nbjoueurs];
		game^.suivant := tmp;
		gameRonde(lg,nbjoueurs-1,premier,player,game^.suivant);
	end
	else
		game^.suivant := premier;
end;

procedure init(nbjoueurs : integer ; var player : array of t_eleve ; var game : ptr_noeud ; var temps : integer);
// nbjoueurs compris entre 1 et 5
var
	i : integer;
begin
	// CREATION RONDE //
	for i := 0 to nbjoueurs-1 do
		player[i] := nvEleve('Joueur '+inttostr(i+1));
	// CREATION RONDE DE JEU //
	new(game);
	game^.valeur := player[0];
	gameRonde(nbjoueurs,nbjoueurs-1,game,player,game);
	// DEFINITION TEMPS EXPLOSION //
	temps := random(5)+1;
end;

function supprApres(var p : ptr_noeud) : ptr_noeud;
var
	tmp : ptr_noeud;
begin
	tmp := p^.suivant;
	if tmp <> p then
	begin
		p^.suivant := tmp^.suivant;
		dispose(tmp);
	end
	else
		p^.suivant := nil;
	supprApres := p;
end;

function explode(var game : ptr_noeud) : ptr_noeud;
begin
	if game^.suivant^.valeur.vie = 0 then
		explode := supprApres(game)
	else
	begin
		game^.suivant^.valeur.vie := game^.suivant^.valeur.vie - 1; 
		explode := game;
	end;
end;

procedure affichPawns(nbjoueurs : integer ; game : ptr_noeud);
begin
	if nbjoueurs > 0 then
	begin
		writeln(game^.valeur.prenom,', ',game^.valeur.vie,' PV');
		affichPawns(nbjoueurs-1,game^.suivant);
	end;
end;

procedure donneVie(var player : array of t_eleve ; game : ptr_noeud);
var
	i : integer;
	donne : boolean;
begin
	i := 0;
	repeat
		donne := player[i].prenom = game^.valeur.prenom;
		if donne then
			player[i].vie := player[i].vie + 1;
	until donne;
end;

procedure ordonnanceur(nbjoueurs : integer);
var
	player : array of t_eleve;
	game : ptr_noeud;
	temps, nbjjeu : integer;
	tour : ptr_noeud;
	boom,quit : boolean;
	timestart : tDateTime;
	ask : char;
begin
	setLength(player,nbjoueurs);
	nbjjeu := nbjoueurs;
	init(nbjoueurs,player,game,temps);
	affichPawns(nbjoueurs,game);
	tour := game;
	writeln('Le joueur 1 détient la bombe. Appuyez sur ENTREE pour commencer le jeu.');
	readln;
	repeat
		repeat
			timestart := NOW;
			repeat
				tour := tour^.suivant;
				writeln('Tour : ',tour^.valeur.prenom,', ',temps-secondsBetween(timestart,NOW),' secondes restantes avant explosion !');
				readln;
				boom := secondsBetween(timestart,NOW) > temps;
			until boom;
			writeln(tour^.suivant^.valeur.prenom,' va se faire démonter!');
			explode(tour);
			nbjjeu := nbjjeu-1;
		until nbjjeu = 1;
		writeln('Le Vainqueur est : ',tour^.valeur.prenom,' !');
		donneVie(player,game);
		writeln('Nouvelle partie ? (n pour quitter)');
		readln(ask);
		quit := ask = 'n';
	until quit;
end;

var
	nbjoueurs : integer;
begin
	writeln('Nombre de joueurs ?');
	readln(nbjoueurs);
	ordonnanceur(nbjoueurs);
end.
	
	
	
