PROGRAM carteblanche;

USES crt,graph;

VAR i,num,a,b,d,level,vie,score,score3: integer; (*variable des settings du jeu*)
pilote,mode,deco1,deco2,decor3,decor4,decor5,decor6:integer; (*variable de decoration*)
name,vie2,score2,level2:string;
lettre,m,s:char; (*variable de lettre genere + keypressed*)

CONST do1=131; mi1=165; sol1=196; si1=247;
do2=262; mi2=330; sol2=392; si2=494;
do3=523; mi3=659; sol3=784; si3=988;
do4=1047; mi4=1319; sol4=1568; si4=1976;
re1=147; fa1=176; la1=220; t1=140;
re2=294; fa2=349; la2=440; t2=50;
re3=587; fa3=698; la3=880; t3=110;
re4=1175; fa4=1397; la4=1720;

PROCEDURE mushroom; (*son de selection*)

BEGIN

sound(659);
delay(t3);
sound(784);
delay(t3);
sound(1319);
delay(t3);
sound(1047);
delay(t3);
sound(1175);
delay(t3);
sound(1568);
delay(t3);
nosound;
END;

PROCEDURE coin; (*2e son de selection*)

BEGIN

sound(988);
delay(T1);
sound(1319);
delay(T1);
nosound;
END;

 

PROCEDURE DEATH; (*son du GAME OVER*)

BEGIN

sound(do1);
delay(T2);
sound(re1);
delay(T2);
sound(mi1);
delay(T2);
sound(fa1);
delay(T2);
sound(sol1);
delay(T2);
sound(la1);
delay(T2);
sound(si1);
delay(T2);
sound(do2);
delay(T2);
sound(re2);
delay(T2);
sound(mi2);
delay(T2);
sound(fa2);
delay(T2);
sound(sol2);
delay(T2);
sound(la2);
delay(T2);
sound(si2);
delay(T2);
sound(do3);
delay(T2);
sound(re3);
delay(T2);
sound(fa3);
delay(T2);
sound(sol3);
delay(T2);
sound(la3);
delay(T2);
sound(si3);
delay(T2);
sound(do4);
delay(T2);
nosound;

delay(500);

sound(sol1);
delay(T1);
sound(do2);
delay(T1);
sound(mi2);
delay(T1);
sound(sol2);
delay(T1);
sound(do3);
delay(T1);
sound(mi3);
delay(T1);
sound(sol3);
delay(500);
sound(mi3);
delay(500);
nosound;

sound(207);
delay(T1);
sound(do2);
delay(T1);
sound(311);
delay(T1);
sound(415);
delay(T1);
sound(do3);
delay(T1);
sound(622);
delay(T1);
sound(830);
delay(500);
sound(622);
delay(500);
nosound;

sound(233);
delay(T1);
sound(re2);
delay(T1);
sound(fa2);
delay(T1);
sound(466);
delay(T1);
sound(re3);
delay(T1);
sound(fa3);
delay(T1);
sound(923);
delay(400);
nosound;
delay(20);
sound(923);
delay(t1);
nosound;
delay(20);
sound(923);
delay(t1);
nosound;
delay(20);
sound(923);
delay(t1);
nosound;
delay(20);
sound(do4);
delay(250);
nosound;

END;

PROCEDURE decoration1; (*Decoration pour le menu*)

BEGIN

deco1:=350;
deco2:=300;
i:=0;
REPEAT
i:=i+1;
deco1:=deco1+5;
deco2:=deco2+5;

setcolor(i);
ellipse(325,235,0,360,deco1,deco2); (*ellipses repetitifs*)

UNTIL i=14;

END;

PROCEDURE decoration2; (*Decoration durant le jeu*)

BEGIN

decor3:=50;
decor4:=50;
decor5:=600;
decor6:=450;
i:=0;

REPEAT
i:=i+1;
setcolor(i);
rectangle(decor3,decor4,decor5,decor6); (*rectangles repetees*)
decor3:=decor3-2;
decor4:=decor4-2;
decor5:=decor5+2;
decor6:=decor6+2;

UNTIL i=15;

i:=0;
REPEAT
i:=i+1;
setcolor(i);
rectangle(decor3,decor4,decor5,decor6);
decor3:=decor3-2;
decor4:=decor4-2;
decor5:=decor5+2;
decor6:=decor6+2;

UNTIL i=10;

i:=0;
decor4:=449;

REPEAT (*la ligne rouge illustrant la limite de la lettre*)
i:=i+1;
decor4:=decor4-1;
setcolor(red);
line(50,decor4,600,decor4);

UNTIL i=5;

END;

PROCEDURE lettrerandom; (*Algorithme pour generer une lettre aleatoire!*)

BEGIN

randomize;

for i:=1 to 5 do

begin

num:=random(26);
s:=chr(ord('A') +num); (*le char, lettre genere*)

END;
END;

PROCEDURE exit; (*Sortie du jeu*)

BEGIN

cleardevice;
decoration1;
mushroom;
outTextXY(150,250,'Au revoir!');
readln;

END;

PROCEDURE jeu; (*Jeu TYPING MANIAC*)

BEGIN

coin;
cleardevice;
d:=0; (*vitesse*)
vie:=3;(*vie*)
score:=0; (*score*)
level:=0; (*level*)
score3:=0;
REPEAT
cleardevice;
decoration1;
setTextStyle(1,horizdir,2);
OutTextXY(150,150,'Choisir le mode de jeu');
OutTextXY(150,200,'A-------> TRADITIONNEL');
OuTtextXY(150,250,'B-------> PRECISION');
m:=upcase(readkey);

if m=('A') then

BEIN
coin;
score3:=1;
END

else

if m=('B') then

BEGIN
coin;
score3:=2;
END

else

BEGIN (*si l'utilisateur appuie sur une autre touche*)
cleardevice;
decoration1;
outTextXY(80,250,'Erreur! Tu dois choisir parmi les options A-B');
readln;
END;

UNTIL score3>0; (*quand un choix est fait, le repeat arrete*)

 

REPEAT
cleardevice;
decoration1;
setTextStyle(1,horizdir,2);
outTextXY(150,150,'Choisis le niveau de difficulte'); (*niveau de difficulte*)
outTextXY(150,200,'A--------> EASY');
outTextXY(150,250,'B--------> MEDIUM');
outTextXY(150,300,'C--------> HARD');
outTextXY(150,350,'D--------> GODLY');
m:=upcase(readkey);

if m=('A') then (*en fonction du niveau choisi, la duree de
refresh d'une lettre diminue*)
BEGIN
mushroom;
d:=50;
END

else

if m=('B') then

BEGIN
mushroom;
d:=40;
END

else

if m=('C') then

BEGIN
mushroom;
d:=30;
END

else

if m=('D') then

BEGIN
mushroom;
d:=20;
END

else

BEGIN (*si l'utilisateur appuie sur une autre touche*)
cleardevice;
decoration1;
outTextXY(80,250,'Erreur! Tu dois choisir parmi les options A-B-C-D!');
readln;
END;

UNTIL d>0; (*quand un choix est fait, le repeat arrete*)

cleardevice; (*countdown 3,2,1 avant que le jeu commence*)
decoration1;
setTextStyle(1,horizdir,3);
outTextXY(200,200,'Le jeu va debuter...');
delay(3000);
cleardevice;
decoration1;
setTextStyle(1,horizdir,10);
outTextXY(280,150,'3');
delay(1000);
cleardevice;
decoration1;
outTextXY(280,150,'2');
delay(1000);
cleardevice;
decoration1;
outTextXY(280,150,'1');
delay(1000);
cleardevice;
decoration1;
outTextXY(260,150,'GO!');
delay(1000);
cleardevice;
decoration2; (*le nouveau decor apparait!*)
setTextStyle(1,horizdir,2);

REPEAT (*quand une lettre touche la ligne rouge ou est bien appuyee,
le repeat commence*)
lettrerandom; (*algorithme de lettre*)
randomize;
a:=random(500)+75; (*position initiale de la lettre*)
b:=70; (*la position des y est constante pour l'instant*)

setcolor(yellow); (*cadre entourant vie,score et level*)
rectangle(55,55,130,86);
rectangle(275,55,380,86);
rectangle(495,55,590,86);

setUserCharSize(1,2,1,2);
setcolor(0);
outTextXY(120,60,vie2); (*affiche le nombre de vie*)
setcolor(white);
str(vie,vie2); (*sert a afficher en OutText des INTEGER*)
outTextXY(60,60,'VIE :');
outTextXY(120,60,vie2);
setcolor(0);
outTextXY(350,60,score2); (*affiche le score*)
setcolor(white);
str(score,score2);
outTextXY(280,60,'SCORE :');
outTextXY(350,60,score2);
setcolor(0);
outTextXY(570,60,level2); (*affiche le level*)
str(level,level2);
setcolor(white);
outTextXY(500,60,'LEVEL :');
outTextXY(570,60,level2);

REPEAT (*la lettre descend graduellement*)
SetTextStyle(1,horizdir,3);
delay(d); (*le delai d depend du niveau de difficulte*)
b:=b+10; (*la lettre defile tranquillement vers le bas*)
setcolor(cyan);
outTextXY(a,b,s);
delay(20);
setcolor(0); (*texte en noir pour EFFACER le texte precedent*)
outTextXY(a,b,s);

if Keypressed then (*lorsqu'une touche est appuyee*)
BEGIN

m:=upcase(readkey);
if (m=s) then (*si la touche est la meme que la touche genere*)
BEGIN

b:=500; (*la lettre sort de l'ecran*)
score:=score+1; (*score augmente*)

if (score mod 5=0) (*level est un multiple de 5*)
then
BEGIN

if d=1 then (*empecher d'avoir 0 seconde d'ecoule*)

BEGIN
level:=level+1;
d:=d;
b:=b+1; (*le lettre descend d'un bond plus grand*)
END;

if d>1 then
BEGIN
level:=level+1; (*le level augmente quand le score est un*)
d:=d-1;
END;

END
END
else
if (score3=2) then (*si mode Precision est active*)
score:=score-1;
END;

UNTIL b>=410; (*la lettre touche la LIGNE ROUGE*)

if b=410 then (*si et seulement si elle touche la ligne rouge*)
vie:=vie+-1; (*on perd une vie*)
UNTIL (vie=0) or (score<0); (*quand on n'a plus de vie ou score<0*)

cleardevice;
decoration2;
settextstyle(1,horizdir,8);
outTextXY(120,225,'GAME OVER');
death;
delay(1000);

cleardevice; (*afficher score et le level*)
decoration2;
setcolor(white);
settextstyle(1,horizdir,2);
outTextXY(200,100,'SCORE =');
setcolor(white);
outTextXY(300,100,score2);
delay(1000);
outTextXY(200,200,'LEVEL =');
outTextXY(300,200,level2);
delay(1000);
outTextXY(150,300,'Evaluation =');

if level=0 then (*Dependant du niveau, le joueur recoit une
evaluation*)

outTextXY(300,300,'FAILURE')

else

if level<=5 then

outTextXY(300,300,'BAD')

else

if level<=10 then

outTextXY(300,300,'AVERAGE')

else

if level<=15 then

outTextXY(300,300,'GREAT')

else

if level<=20 then

outTextXY(300,300,'EXCELLENT')

else

if level<=30 then

outTextXY(300,300,'FANTASTIQUE')

else

if level>30 then

outTextXY(300,300,'DIEU');

readln;

REPEAT
cleardevice;
decoration2;
setTextStyle(1,horizdir,4);
outTextXY(230,160,'Restart? O/N');
m:=upcase(readkey);
case m of (*offre de recommencer ou de quitter le jeu*)
'O': jeu;
'N': ;
else

cleardevice;
decoration2;
setTextStyle(1,horizdir,2);
outTextXY(150,200,'Tu dois choisir parmi les options O et N!');
readln;
end;
UNTIL (m='O') or (m='N');

END;

PROCEDURE instruction;

BEGIN

cleardevice; (*regles a suivres*)
decoration1;
coin;
outTextXY(150,70,'Regles a suivre pour');
setcolor(white);
outTextXY(370,70,name);
setcolor(yellow);
outTextXY(150,150,'L''objectif du jeu est de taper les lettres');
outTextXY(150,180,'affichees sur l''ecran! Ceux-ci defilent vers');
outTextXY(150,210,'le bas donc il faut ecrire la lettre avant');
outTextXY(150,240,'qu''elle ne touche la ligne ROUGE au sol.');
outTextXY(150,270,'Vous pouvez choisir 4 modes de difficultes');
outTextXY(150,300,'dependants de votre niveau technique!');
outTextXY(150,400,'PROCHAINE PAGE');
readln;

cleardevice;
decoration1;
sound(300);
delay(100);
nosound;
setcolor(yellow);
outTextXY(90,150,'Vous choisir le 2 modes de jeu. Le mode de jeu');
outTextXY(90,180,'''precision'' fera enlever a l''utilisateur 1 point');
outTextXY(90,210,'s''il tape une autre touche que celle indiquee.');
outTextXY(90,240,'Si votre score = 0 ,alors vous perdez le jeu.');
outTextXY(90,270,'Le mode de jeu ''traditionnel'' sera identique, mais');
outTextXY(90,300,'n''aura pas cette contrainte!');
outTextXY(90,400,'PROCHAINE PAGE');
readln;

cleardevice;
sound(300);
delay(100);
nosound;
decoration1;
outTextXY(90,100,'Attention!');
setcolor(white);
outTextXY(210,100,name);
setcolor(yellow);
outTextXY(60,130,'A chaque fois que vous gagnez 5 points, le niveau');
outTextXY(60,160,'augmente ainsi que la vitesse du jeu.');
outTextXY(60,190,'Soyez donc plus vigilants a mesure que le jeu progresse.');
outTextXY(90,350,'BUZZEZ POUR REVENIR AU MENU');
readln;

END;

PROCEDURE choix;

BEGIN

cleardevice; (*menu d'accueil*)
decoration1;
setTextstyle(1,horizdir,2);
sound(300);
delay(100);
nosound;
outTextXY(150,200,'1. Jouer');
outTextXY(150,250,'2. Instructions');
outTextXY(150,300,'3. Exit');
m:=readkey;

case m of

'1': jeu;
'2': instruction;
'3': exit;

END;
END;

PROCEDURE graphisme; (*au tout debut du programme*)

BEGIN

pilote:=detect;
initgraph(pilote,mode, 'm:/bgi');

setbkcolor(black);
setTextstyle(1,horizdir,2);

outTextXY(200,150,'Quel est ton nom?');
gotoXY(30,15);
readln(name);

cleardevice; (*ecran affiche avant les choix offerts*)
setTextStyle(1,horizdir,2);
rectangle(100,80,500,200);
decoration1;
outTextXY(150,100,'Bienvenue sur TYPING MANIAC');
outTextXY(270,150,name);
outTextXY(120,300,'Programmeurs: Simon Dang Khoa Ho et');
outTextXY(190,330,'Pierre-Hugo Girard');
setcolor(green);
outTextXY(220,420,'PRESS ENTER');
write('BIENVENUE SUR TYPING MANIAC',name);
readln;
setcolor(white);
end;

BEGIN (*programme principal*)

graphisme;
repeat
choix;
until M='3' (*tant que m n'egale pas 3, les choix continuent*)

END. (*C'est chaud la, Regis*)