Section courante

A propos

Section administrative du site

Le jeu Frogger est jeu dont le but est faire traverser à une grenouille une rue sans se faire écraser et ensuite de traverser une rivière en sautant sur des billots sans tomber à l'eau.

Le jeu a été écrit originalement sous le GWBASIC et les dessine des feuilles, des billots et de la grenouilles utilisaient l'instruction DRAW. L'utilisation de cette instruction peut devenir un avantage, car on peut choisir une n'importe quel couleur pour afficher un objet.

Le moteur de jeu est construit à l'aide de deux fonctions, soit RunBillot et RunCar, lesquelles permet respectivement à la grenouilles de traverser les billets et de traverser la rue. La partie RunCar est beaucoup plus facile à mettre en oeuvre, car si le joueur de bouge pas, la grenouille ne bouge pas, tandis que la partie avec les billots nécessite de tenir compte que la grenouille doit bouger à intervalle régulier. Donc, dans la fonction RunCar, on se content de permettre de faire bouger la grenouille dans l'intervalle de la rue, du moment que ses coordonnées ne soit pas identiques à celle d'une voiture (indiquer parle tableau CarX). De l'autre, sur les billots, il faut faire l'inverse, si la grenouille n'est pas sur la coordonnées de l'un des billots (indiquer par le tableau BillotX), alors il perd la partie.


L'exemple de jeu Frogger suivant est développé en QuickPascal et fonctionne uniquement sous QuickPascal. Voici le code source en QuickPascal du jeu :

  1. Program Frogger;
  2.  
  3. Uses Crt,MSGraph;
  4.  
  5. Label _Break3,_Break4;
  6.  
  7. Const
  8.  {Code de touche clavier renvoy?e par ReadKey}
  9.  kbNoKey=0;{Pas de touche}
  10.  kbEsc=$001B;{Escape}
  11.  kbUp=$4800;{Up}
  12.  kbLeft=$4B00;{Fl?che de gauche (Left)}
  13.  kbRight=$4D00;{Fl?che de droite (Right)}
  14.  kbDn=$5000;{Fl?che du bas (Down)}
  15.  kbHome=$4700;{Home}
  16.  kbTab=$0F09;{Tabulation}
  17.  kbEnd=$4F00;{End}
  18.  kbEnter=$000D;{Enter}
  19.  kbF10=$4400;{F10}
  20.  
  21. Var
  22.  CarX:Array[0..3,0..9]of Integer;
  23.  CarKr:Array[0..3,0..9]of Byte;
  24.  BileauX:Array[0..3,0..9]of Integer;
  25.  WaitCar,WaitBileau,NmWait,Timer:Word;
  26.  FroggerX,FroggerY:Integer;
  27.  Traverser,Accident,Life:Byte;
  28.  K:Word;
  29.  
  30. Const
  31.  DrawS:Integer=4;
  32.  XL:Integer=160;
  33.  YL:Integer=100;
  34.  
  35. Var
  36.  I:Byte;
  37.  N:String;
  38.  Mode:(_None_,_NoTrace_,_UnMove_);
  39.  a,b:Integer;
  40.  xc,yc:(NoMove,Add,Sub);
  41.  
  42. Procedure WaitRetrace;Begin
  43.  Delay(10*12);
  44. End;
  45.  
  46. Function ExtractNm(S:String):Integer;
  47. Var
  48.  N:String;
  49.  a,b:Integer;
  50. Begin
  51.  N:='';
  52.  While(I<=Length(S))and(S[I] in ['0'..'9'])do Begin
  53.   N:=N+S[I];
  54.   Inc(I);
  55.  End;
  56.  If N=''Then a:=1
  57. Else Val(N,a,b);
  58.  ExtractNm:=a;
  59. End;
  60.  
  61. Function ExtractNmV(S:String):Integer;Begin
  62.  ExtractNmV:=ExtractNm(S)*(DrawS shr 2)
  63. End;
  64.  
  65. Procedure Line2(X,Y:Integer);Begin
  66.  If(Mode<>_NoTrace_)Then Begin
  67.   Case(xc)of
  68.    Add:Inc(X,XL);
  69.    Sub:X:=XL-X;
  70.   End;
  71.   Case(yc)of
  72.    Add:Inc(Y,YL);
  73.    Sub:Y:=YL-Y;
  74.   End;
  75.   If(YL=Y)and(X<XL)Then Begin
  76.    _MoveTo(X,YL);
  77.    _LineTo(XL,Y);
  78.   End
  79.    Else
  80.   Begin
  81.    _MoveTo(XL,YL);
  82.    _LineTo(X,Y);
  83.   End;
  84.  End;
  85. End;
  86.  
  87. Procedure SetPos(X,Y:Integer);Begin
  88.  Case(xc)of
  89.   Add:Inc(X,XL);
  90.   Sub:X:=XL-X;
  91.  End;
  92.  Case(yc)of
  93.   Add:Inc(Y,YL);
  94.   Sub:Y:=YL-Y;
  95.  End;
  96.  If(Mode<>_UnMove_)Then Begin
  97.   XL:=X;
  98.   YL:=Y;
  99.  End;
  100.  Mode:=_None_;
  101.  xc:=NoMove;
  102.  yc:=NoMove;
  103. End;
  104.  
  105.  
  106. Procedure Draw(S:String);Begin
  107.  I:=1;Mode:=_None_;
  108.  While I<=Length(S)do Begin
  109.   Inc(I);
  110.   Case S[I-1]of
  111.    'B':Mode:=_NoTrace_;
  112.    'C':_SetColor(ExtractNm(S));
  113.    'D':Begin
  114.     a:=ExtractNmV(S);
  115.     Line2(XL,YL+a);
  116.     SetPos(XL,YL+a);
  117.    End;
  118.    'E':Begin
  119.     a:=ExtractNmV(S);
  120.     Line2(XL+a,YL-a);
  121.     SetPos(XL+a,YL-a);
  122.    End;
  123.    'F':Begin
  124.     a:=ExtractNmV(S);
  125.     Line2(XL+a,YL+a);
  126.     SetPos(XL+a,YL+a);
  127.    End;
  128.    'G':Begin
  129.     a:=ExtractNmV(S);
  130.     Line2(XL-a,YL+a);
  131.     SetPos(XL-a,YL+a);
  132.    End;
  133.    'H':Begin
  134.     a:=ExtractNmV(S);
  135.     Line2(XL-a,YL-a);
  136.     SetPos(XL-a,YL-a);
  137.    End;
  138.    'L':Begin
  139.     a:=ExtractNmV(S);
  140.     Line2(XL-a,YL);
  141.     SetPos(XL-a,YL);
  142.    End;
  143.    'M':Begin
  144.     If S[I]in['+','-']Then Begin
  145.      If S[I]='+'Then xc:=Add else xc:=Sub;
  146.      Inc(I);
  147.     End;
  148.     a:=ExtractNm(S);
  149.     If S[I]=','Then Begin
  150.      Inc(I);
  151.      If S[I]in['+','-']Then Begin
  152.       If S[I]='+'Then yc:=Add else yc:=Sub;
  153.       Inc(I);
  154.      End;
  155.      b:=ExtractNm(S);
  156.     End
  157.      Else
  158.     b:=YL;
  159.     Line2(a,b);
  160.     SetPos(a,b);
  161.    End;
  162.    'N':Mode:=_UnMove_;
  163.    'R':Begin
  164.     a:=ExtractNmV(S);
  165.     Line2(XL+a,YL);
  166.     SetPos(XL+a,YL)
  167.    End;
  168.    'U':Begin
  169.     a:=ExtractNmV(S);
  170.     Line2(XL,YL-a);
  171.     SetPos(XL,YL-a)
  172.    End;
  173. ' ',';':;{C'est 2 caractSres ne change rien en soit, donc...pas d'arr^t!}
  174.    Else Exit;
  175.   End
  176.  End
  177. End;
  178.  
  179. Procedure _PutFrogger(X,Y:Integer);
  180. Begin
  181.  SetPos(X+8,Y); {Affiche la grenouille}
  182.  Draw('RFL3BL3L0BL2R0BR11R0BR2DL2BL2L5BL2L2FBR3R5BR3GL0BL2L5BL2FR7GL5R5BFBRL0BL2L5BL2DR9DBL3L3BL3DL2BR11R2');
  183. End;
  184.  
  185. Procedure PutFrogger(X,Y:Integer);Begin
  186.  _SetColor(LightGreen);
  187.  _PutFrogger(X,Y);
  188. End;
  189.  
  190. Procedure UnputFrogger(X,Y:Integer);
  191. Var
  192.  Kr:Byte;
  193. Begin
  194.  Case(Y)of
  195.   3*12..10*12-1:Kr:=Blue;
  196.   10*12..11*12-1:Kr:=Green;
  197.   11*12..15*12-1:Kr:=LightGray;
  198.   Else Kr:=Green;
  199.  End;
  200.  _SetColor(Kr);
  201.  _Rectangle(_GFillInterior,X,Y,X+15,Y+11);
  202. { _PutFrogger(X,Y);}
  203. End;
  204.  
  205. Procedure PutFeuille(X,Y:Integer);Begin
  206.  SetPos(X+8,Y); {Affiche la feuille}
  207.  Draw('C3F3DFD2GDGL2H2UE2G3HBD2D0GBU2LHU2E4RE');
  208. End;
  209.  
  210. Procedure PutBillot(X,Y:Integer);Begin
  211.  _SetViewport(0,0,239,199);
  212.  SetPos(X+48,Y); {Billot}
  213.  Draw('C6L45G2DGD2FDF2R46E2UEU2HUH2G2DGD2FDF2');
  214.  SetPos(X+40,Y+5); {Tiret b-che}
  215.  Draw('C14BU3L3BD3L1BH2L2BG1BL4L3BH3L5BD3BG2R3BG3R5BR4R3BE2BR3R2');
  216.  _SetViewport(0,0,319,199);
  217. End;
  218.  
  219. Procedure UnputBillot(X,Y:Integer);Begin
  220.  _SetViewport(0,0,239,199);
  221.  _SetColor(Blue);
  222.  _Rectangle(_GFillInterior,X,Y,X+56,Y+11);
  223.  _SetViewport(0,0,319,199);
  224. End;
  225.  
  226. Procedure PutCarRight(X,Y,Kr:Integer);Begin
  227.  SetPos(X+8,Y); {Automobile vers la droite}
  228.  _SetColor(Kr);
  229.  Draw('R5FL8GRBR5R0BR4DBL4L0BL5LGR2BR5R0BR5R2FRL17GR19FL21DR21BDBLL4BL10L4BFBR2L2BR14R2BR2BE10');
  230. End;
  231.  
  232. Procedure PutCarLeft(X,Y,Color:Integer);Begin
  233.  SetPos(X+8,Y); {Automobile vers la gauche}
  234.  _SetColor(Color);
  235.  Draw('L5GR8FLBL5L0BL4DBR4R0BR5RFL2BL5L0BL5L2GLR17FL19GR21DL21BDBRR4BR10R4BGBL2R2BL14L2BR26BE10');
  236. End;
  237.  
  238. Procedure UpdateTraverser;
  239. Var
  240.  S:String;
  241. Begin
  242.  _SetTextPosition(2,1);
  243.  _SetBkColor(LightGreen);
  244.  _SetTextColor(LightGray);
  245.  Str(Traverser,S);
  246.  _OutText('Traverser : '+S);
  247. End;
  248.  
  249. Function RunBillot:Boolean;
  250. Label _Break,_Break2;
  251. Const Largeur=56;
  252. Var
  253.  I,J,K:Byte;
  254.  BileauFound:Boolean;
  255.  SurLeBileau:Boolean;
  256.  MoveFrogger:Boolean;
  257. Begin
  258.  RunBillot:=True;
  259.  MoveFrogger:=False;
  260.  SurLeBileau:=False;
  261.  For J:=0to 1do For I:=0to 9do Begin
  262.   If BileauX[J,I]=-1Then Begin
  263.    BileauFound:=False;
  264.    For K:=0to 9do Begin
  265.     If BileauX[J,K]in[204..239]Then Begin
  266.  BileauFound:=True;
  267.  Goto _Break;
  268. End;
  269.    End;
  270. _Break:
  271.    If Not(BileauFound)Then Begin
  272.     If WaitBileau=0Then Begin
  273.      WaitBileau:=Random(NmWait);
  274.      BileauX[J,I]:=204+J*12;
  275.      PutBillot(BileauX[J,I],(6+J)*12);
  276.     End
  277.      Else
  278.     Dec(WaitBileau);
  279.    End;
  280.   End
  281.    Else
  282.   Begin
  283.    UnputBillot(BileauX[J,I],(6+J)*12);
  284.    If BileauX[J,I]<24Then BileauX[J,I]:=-1
  285.     Else
  286.    Begin
  287.     Dec(BileauX[J,I],24);
  288.     PutBillot(BileauX[J,I],(6+J)*12);
  289.    End;
  290.   End;
  291.   If(FroggerY=(6+J)*12)Then Begin
  292.    If Not(MoveFrogger)Then Begin
  293.     If(FroggerX > 0)Then Begin
  294.      Dec(FroggerX,24);
  295.  MoveFrogger:=True;
  296.     End;
  297.    End;
  298.    If((FroggerX-BileauX[J,I])in[0..Largeur-1])Then Begin
  299.     SurLeBileau:=True;
  300.     PutFrogger(FroggerX,FroggerY);
  301.    End;
  302.   End;
  303.  End;
  304.  For J:=2to 3do For I:=0to 9do Begin
  305.   If BileauX[J,I]=-1Then Begin
  306.    BileauFound:=False;
  307.    For K:=0to 9do Begin
  308.     If BileauX[J,K]in[0..Largeur-1]Then Begin
  309.  BileauFound:=True;
  310.  Goto _Break2;
  311. End;
  312.    End;
  313. _Break2:
  314.    If Not(BileauFound)Then Begin
  315.     If WaitBileau=0Then Begin
  316.      WaitBileau:=Random(NmWait);
  317.      BileauX[J,I]:=(J-2)*12;
  318.      PutBillot(BileauX[J,I],(6+J)*12);
  319.     End
  320.      Else
  321.     Dec(WaitBileau);
  322.    End;
  323.   End
  324.    Else
  325.   Begin
  326.    UnputBillot(BileauX[J,I],(6+J)*12);
  327.    Inc(BileauX[J,I],24);
  328.    If BileauX[J,I]>(240-Largeur)Then BileauX[J,I]:=-1
  329.    Else PutBillot(BileauX[J,I],(6+J)*12);
  330.   End;
  331.   If(FroggerY=(6+J)*12)Then Begin
  332.    If Not(MoveFrogger)Then Begin
  333.     If(FroggerX <= 239)Then Begin
  334.  Inc(FroggerX,24);
  335.  MoveFrogger:=True;
  336. End;
  337.    End;
  338.    If((FroggerX-BileauX[J,I])in[0..Largeur-1])Then Begin
  339.     SurLeBileau:=True;
  340.     PutFrogger(FroggerX,FroggerY);
  341.    End;
  342.   End;
  343.  End;
  344.  If(SurLeBileau)Then RunBillot:=False
  345. Else RunBillot:=FroggerY<=108;
  346. End;
  347.  
  348. Function RunCar:Boolean;
  349. Label _Break,_Break2;
  350. Var
  351.  I,J,K:Byte;
  352.  CarFound:Boolean;
  353. Begin
  354.  RunCar:=True;
  355.  For J:=0to 1do For I:=0to 9do Begin
  356.   If CarX[J,I]=-1Then Begin
  357.    CarFound:=False;
  358.    For K:=0to 9do Begin
  359.     If CarX[J,K]in[204..239]Then Begin
  360.  CarFound:=True;
  361.  Goto _Break;
  362. End;
  363.    End;
  364. _Break:
  365.    If Not(CarFound)Then Begin
  366.     If WaitCar=0Then Begin
  367.      WaitCar:=Random(NmWait);
  368.      CarX[J,I]:=204+J*12;CarKr[J,I]:=Random(15);
  369.      If(CarKr[J,I]=LightGray)Then CarKr[J,I]:=LightRed;
  370.      PutCarLeft(CarX[J,I],(11+J)*12,CarKr[I,J]);
  371.     End
  372.      Else
  373.     Dec(WaitCar);
  374.    End;
  375.   End
  376.    Else
  377.   Begin
  378.    PutCarLeft(CarX[J,I],(11+J)*12,LightGray);
  379.    If CarX[J,I]<24Then CarX[J,I]:=-1
  380.     Else
  381.    Begin
  382.     Dec(CarX[J,I],24);
  383.     PutCarLeft(CarX[J,I],(11+J)*12,CarKr[I,J]);
  384.    End;
  385.   End;
  386.   If(FroggerY=(11+J)*12)and((FroggerX-CarX[J,I])in[0..23])Then Exit;
  387.  End;
  388.  For J:=2to 3do For I:=0to 9do Begin
  389.   If CarX[J,I]=-1Then Begin
  390.    CarFound:=False;
  391.    For K:=0to 9do Begin
  392.     If CarX[J,K]in[0..23]Then Begin
  393.  CarFound:=True;
  394.  Goto _Break2;
  395. End;
  396.    End;
  397. _Break2:
  398.    If Not(CarFound)Then Begin
  399.     If WaitCar=0Then Begin
  400.      WaitCar:=Random(NmWait);
  401.      CarX[J,I]:=(J-2)*12;CarKr[J,I]:=Random(15);
  402.      If(CarKr[J,I]=LightGray)Then CarKr[J,I]:=LightRed;
  403.      PutCarRight(CarX[J,I],(11+J)*12,CarKr[I,J]);
  404.     End
  405.      Else
  406.     Dec(WaitCar);
  407.    End;
  408.   End
  409.    Else
  410.   Begin
  411.    PutCarRight(CarX[J,I],(11+J)*12,LightGray);
  412.    Inc(CarX[J,I],24);
  413.    If CarX[J,I]>(240-24)Then CarX[J,I]:=-1
  414.    Else PutCarRight(CarX[J,I],(11+J)*12,CarKr[I,J]);
  415.   End;
  416.   If(FroggerY=(11+J)*12)and((FroggerX-CarX[J,I])in[0..23])Then Exit;
  417.  End;
  418.  RunCar:=False;
  419. End;
  420.  
  421. Procedure PutTimer;
  422. Var
  423.  S:String;
  424. Begin
  425.  _SetTextPosition(23,34);
  426.  _SetTextColor(LightRed);
  427.  Str(Timer,S);
  428.  _OutText(S+'  ');
  429. End;
  430.  
  431. Procedure PutLife;
  432. Var
  433.  J:Byte;
  434. Begin
  435.  _SetColor(LightGreen);
  436.  For J:=0to 3do Begin
  437.   If(Life-1<J)Then _SetColor(Black);
  438.   _PutFrogger(272,10+40*J);
  439.  End;
  440. End;
  441.  
  442. BEGIN
  443.  Randomize;
  444.  If _SetVideoMode(_MRes256Color)=0 Then Begin
  445.   WriteLn('Mode video non supporte');
  446.   Halt;
  447.  End;
  448.  Life:=4;NmWait:=64;Traverser:=0;
  449.  Repeat
  450.   _SetColor(Green);
  451.   _Rectangle(_GFillInterior,0,0,239,35);
  452.   _SetColor(Blue);
  453.   _Rectangle(_GFillInterior,0,3*12,239,10*12-1);
  454.   _SetColor(Green);
  455.   _Rectangle(_GFillInterior,0,10*12,239,11*12-1);
  456.   _SetColor(LightGray);
  457.   _Rectangle(_GFillInterior,0,11*12,239,15*12-1);
  458.   _SetColor(Green);
  459.   _Rectangle(_GFillInterior,0,15*12,239,199);
  460.   _SetColor(LightRed);
  461.   _Rectangle(_GBorder,244,0,315,199);
  462.   _SetTextPosition(21,32);
  463.   _SetTextColor(LightRed);
  464.   _OutText('Horloge:');
  465.   PutLife;
  466.   UpdateTraverser;
  467.   FillChar(CarX,SizeOf(CarX),$FF);
  468.   FillChar(BileauX,SizeOf(Bileaux),$FF);
  469.   WaitCar:=0;WaitBileau:=0;FroggerX:=120;FroggerY:=180;Timer:=400;Accident:=0;
  470.   _SetColor(LightGreen);
  471.   _PutFrogger(FroggerX,FroggerY);
  472.   PutTimer;
  473.   Repeat
  474.    Repeat
  475.     If(RunCar)Then Begin
  476.  Accident:=1;
  477.  Goto _Break3;
  478. End;
  479. If(RunBillot)Then Begin
  480.  Accident:=3;
  481.  Goto _Break3;
  482. End;
  483.     WaitRetrace;
  484.     Dec(Timer);
  485.     PutTimer;
  486.     If Timer=0Then Begin
  487.  Accident:=2;
  488.  Goto _Break4;
  489. End;
  490.    Until KeyPressed;
  491. _Break4:
  492.    If Accident>0Then Goto _Break3;
  493.    K:=Byte(ReadKey);
  494.    If K=0Then K:=K or (Byte(ReadKey)shl 8);
  495.    Case(K)of
  496.     kbLeft:If FroggerX>0Then Begin
  497.      UnputFrogger(FroggerX,FroggerY);
  498.      Dec(FroggerX,12);
  499.      PutFrogger(FroggerX,FroggerY);
  500.     End;
  501.     kbRight:If FroggerX<239-24Then Begin
  502.      UnputFrogger(FroggerX,FroggerY);
  503.      Inc(FroggerX,12);
  504.      PutFrogger(FroggerX,FroggerY);
  505.     End;
  506.     kbUp:If FroggerY>47Then Begin
  507.      UnputFrogger(FroggerX,FroggerY);
  508.      Dec(FroggerY,12);
  509.  If FroggerY<48 Then Begin
  510.   Inc(Traverser);
  511.   If Traverser>3 Then Begin
  512.        _SetTextPosition(0,0);
  513.    _SetTextColor(LightGreen);
  514.    _SetBkColor(Green);
  515.        _OutText('Vous avez gagné, vous avez fait traversé 4 grenouilles sans qu''ils soient écrasé !');
  516.    Exit;
  517.   End
  518.    Else
  519.   Begin
  520.     Goto _Break3;
  521.   End;
  522.  End;
  523.      PutFrogger(FroggerX,FroggerY);
  524.     End;
  525.     kbDn:If FroggerY<180Then Begin
  526.      UnputFrogger(FroggerX,FroggerY);
  527.      Inc(FroggerY,12);
  528.      PutFrogger(FroggerX,FroggerY);
  529.     End;
  530.     kbEsc:Exit;
  531.    End;
  532.   Until False;
  533. _Break3:
  534.   {ClrKbd;}
  535.   Case(Accident)of
  536.    1:Begin
  537.     _SetTextPosition(0,0);
  538. _SetTextColor(LightRed);
  539. _SetBkColor(Green);
  540.     _OutText('Ecrasé par une voiture!');
  541. If (ReadKey=#0)Then;
  542.     Dec(Life);
  543.    End;
  544.    2:Begin
  545. _SetTextPosition(0,0);
  546. _SetTextColor(LightRed);
  547. _SetBkColor(Green);
  548.     _OutText('Manque de temps!');
  549. If (ReadKey=#0)Then;
  550.     Dec(Life);
  551.    End;
  552.    3:Begin
  553.     _SetTextPosition(0,0);
  554. _SetTextColor(LightRed);
  555. _SetBkColor(Green);
  556.     _OutText('A côté du billot !');
  557. If (ReadKey=#0)Then;
  558.     Dec(Life);
  559.    End;
  560.   End;
  561.  Until Life=0;
  562. END.

Code source

Voici le code source du jeu sur GitHub :

Lien Langage de programmation Projet
https://github.com/gladir/quickpascal_frogger/blob/main/FROGGER.PAS QuickPascal quickpascal_frogger


Dernière mise à jour : Jeudi, le 4 août 2022