Section courante

A propos

Section administrative du site

Le jeu Bowling est un originaire des consoles de jeux Atari 2600. Ce fut également un jeu n'ayant pas eu de suite autre que chez les amateurs de jeux vidéo. Le jeu est fort simple, il faut viser les 4 situés à la gauche de l'écran en tapant sur un bouton de tire ou la barre d'espacement sur un ordinateur au bon moment. L'ennui c'est que la boule de quille bouge assez vite et si vous visez trop tôt ou trop tard, vous viserez à côté des quilles. Le jeu peut se jouer avec 1 joueur jusqu'à 4 joueurs.

Tout d'abord, dans la procédure InitGame, il faut initialiser quelques variables, ainsi, on doit demander à l'utilisateur le nombre de joueur et le nom de chacun des joueurs. Afin de régler les problèmes d'affichage, on conserve uniquement les 8 premières caractères des noms entrées par l'utilisateur.

Ensuite, une fois que les jeux a les informations souhaitez, on peut dessiner les éléments de base du jeu à l'aide de la procédure DrawGameScreen. On commence par dessiner le tableau des tours pour chacun des joueurs. Ensuite, on indique les pointages totales de chacun des joueurs et finalement on dessine le salle du jeu du quille.

Ensuite, lors du lancement de la première balle (FirstBall), on dessine chacun des quilles en utilisant un protocole d'affichage ANSI. Ainsi, grâce à la méthode ainsi, on déplace le curseur d'une position à la fois la position du curseur et il s'agit d'un avantage très intéressant dans le cas des cas, puisqu'ils ont une distance de 1 caractère entre chacun d'eux. Il est certain qu'on pourrait dessiner 1 à 1 chacune des quilles, mais pour la plupart des programmeurs c'est moins amusant.

Ensuite, le moteur du jeux est situés dans la procédure MainLoop. Il permet aux joueurs de lancer chacun des boules de quilles jusqu'à ce que les 10 manches (indiqué par la variable Q) et chacun des joueurs (indiqué par Z9) soient accomplit. Par chacun des tours, il propose d'abord une première boule de quille à l'aide de la procédure FirstBall et s'il ne fait pas un abat indiqué par la variable J1 par la valeur 10, alors il propose une deuxième boule de quille à l'aide de la procédure SecondBall.

Lors de déplacement de la boule de quille, on doit vérifier à l'écran où sont situés les quilles. Pour y arriver on doit connaître le contenu de l'écran de texte. Malheureusement, bien qu'on peux facilement connaître l'information en consultant la mémoire vidéo (Mem[$B800:X]), elle n'est pas dans le standard officielle du Pascal. Pour contourner le problème, lorsqu'on affiche les quilles, on écran également dans le tableau Screen afin de connaître le contenu ce qui se trouve vraiment dans l'écran. De plus, lorsqu'on enlève une quille, on doit également effacer le contenu où est situé la quille. Ainsi, grâce à cette technique, il n'est pas nécessaire de connaître le contenu de l'écran pour déplacer la boule de quille.

L'exemple de jeu Bowling suivant est développé en Turbo Pascal 7 et fonctionne également sous Free Pascal. Voici le code source en Turbo Pascal du jeu :

  1. Program BOWLING;
  2.  
  3. Uses Crt;
  4.  
  5. Var
  6.  Screen:Array[0..25,0..40]of Char;
  7.  S,T:Array[0..4]of Integer;
  8.  NA:Array[0..4]of String;
  9.  A,B1,J,PS1,J1,Q,Score,T_,X1,X2,Z9:Integer;
  10.  PS,Terminated:Boolean;
  11.  
  12. Function Left(Const Str:String;Num:Byte):String;Begin
  13.  Left:=Copy(Str,1,Num);
  14. End;
  15.  
  16. Function PadRight(S:String;Space:Byte):String;
  17. Var
  18.  I:Byte;
  19. Begin
  20.  If Length(S)<Space Then For I:=Length(S)+1 to Space do S:=S+' ';
  21.  PadRight:=S;
  22. End;
  23.  
  24. Procedure InitGame;
  25. Var
  26.  I:Byte;
  27.  K:Char;
  28.  Nom:String;
  29. Begin
  30.  FillChar(Screen,SizeOf(Screen),#0);
  31.  Terminated:=False;
  32.  A:=1;
  33.  For I:=0 to 4 do NA[I]:='';
  34.  TextMode(CO80);
  35.  TextBackground(4);
  36.  TextColor(15);
  37.  ClrScr;
  38.  GotoXY(37,8);
  39.  WriteLn('BOWLING');
  40.  GotoXY(7,13);
  41.  Write('Combien de quilleurs doivent jouer (entre 1 et 4) ? ');
  42.  Repeat
  43.   K:=ReadKey;
  44.   Case K of
  45.    #27:Halt;
  46.    '1'..'4':Begin
  47.     A:=Ord(K)-Ord('0');
  48.     Break;
  49.    End;
  50.   End;
  51.  Until False;
  52.  For I:=1 to A do Begin
  53.   GotoXY(8,15+I);
  54.   Write('Entrez le nom du quilleur #',I,' : ');
  55.   ReadLn(Nom);
  56.   NA[I-1]:=Left(Nom,8);
  57.  End;
  58. End;
  59.  
  60. Procedure DrawGameScreen;
  61. Var
  62.  I:Byte;
  63. Begin
  64.  TextMode(CO40);
  65.  TextBackground(4);
  66.  TextColor(15);
  67.  ClrScr;
  68.  GotoXY(10,1);
  69.  Write('1 2 3 4 5 6 7 8 9 10');
  70.  GotoxY(10,2);
  71.  For J:=1 to 31 do Write({$IFDEF FPC}'-'{$ELSE}Chr(196){$ENDIF});
  72.  For I:=1 to A do Begin
  73.   GotoXY(1,2*I+1);
  74.   TextColor(I+1);
  75.   Write(PadRight(NA[I-1],11));
  76.   J:=12;
  77.   While J<=36 do Begin
  78.    Write({$IFDEF FPC}'|'{$ELSE}Chr(179){$ENDIF},' ');
  79.    Inc(J,3);
  80.   End;
  81.   GotoXY(10,2*I+2);
  82.   For J:=1 to 31 do Write({$IFDEF FPC}'-'{$ELSE}Chr(196){$ENDIF});
  83.  End;
  84.  GotoXY(1,12);
  85.  For I:=0 to A-1 do Begin
  86.   If I=2 Then GotoXY(1,14);
  87.   TextColor(I+2);
  88.   Write(NA[I],' :',' ':19-Length(NA[I]));
  89.  End;
  90.  GotoXY(1,15);
  91.  For I:=1 to 39 do Write({$IFDEF FPC}'-'{$ELSE}Chr(196){$ENDIF});
  92.  GotoXY(1,25);
  93.  For I:=1 to 39 do Write({$IFDEF FPC}'-'{$ELSE}Chr(196){$ENDIF});
  94. End;
  95.  
  96. Procedure InitScore;
  97. Var
  98.  I:Byte;
  99. Begin
  100.  For I:=0 to A-1 do S[I]:=1;
  101. End;
  102.  
  103. Procedure RollBall;
  104. Var
  105.  G,H,V,D:Integer;
  106.  K:Char;
  107. Begin
  108.  H:=1;V:=24;D:=-1;
  109.  TextColor(0);
  110.  TextBackground(Z9+2);
  111.  While Not Keypressed do Begin
  112.   GotoXY(H,V);
  113.   Write(' ');
  114.   V:=V+D;
  115.   GotoXY(H,V);
  116.   Write('O');
  117.   Delay(200);
  118.   If V in[16,24]Then D:=-D;
  119.  End;
  120.  If ReadKey=#27 Then Terminated:=True;
  121.  For H:=2 to 35 do Begin
  122.   GotoXY(H-1,V);
  123.   Write(' O');
  124.   Delay(100);
  125.  End;
  126.  J:=0;
  127.  While H<40 do Begin
  128.   If Screen[V,H]=#234 Then Begin
  129.    J:=J+1;
  130.    D:=-1;
  131.    While D<=1 do Begin
  132.     X1:=V;X2:=H;
  133.     Repeat
  134.      X1:=X1+D;
  135.      X2:=X2+1;
  136.      If Screen[X1,X2]=#234 Then Begin
  137.       GotoXY(X2,X1);
  138.       Screen[X1,X2]:=#32;
  139.       Write(' ');
  140.       J:=J+1;
  141.      End
  142.       Else
  143.      Break;
  144.     Until False;
  145.     D:=D+2;
  146.    End;
  147.   End;
  148.   GotoXY(H-1,V);
  149.   Write(' O');
  150.   H:=H+1;
  151.  End;
  152.  J1:=J1+J;
  153.  GotoXY(7+3*Q+B1,2*Z9+3);
  154.  TextColor(Abs(-(2+Z9)*Byte(B1=0)));
  155.  TextBackground(Abs(-(2+Z9)*Byte(B1<>0)));
  156.  G:=J+48;
  157.  If J1=10 Then If PS Then G:=88 Else G:=47;
  158.  Write(Chr(G));
  159.  TextColor(0);
  160.  TextBackground(2+Z9);
  161.  GotoXY(H-1,V);
  162.  Write(' ');
  163. End;
  164.  
  165. Procedure FirstBall;
  166. Const
  167.  PC:Array[1..31]of Byte=(
  168.   234,31,29,29,234,31,29,29,234,28,
  169.   234,31,29,29,29,29,234,28,234,31,
  170.   29,29,234,28,234,31,29,29,234,31,234
  171.  );
  172. Var
  173.  I:Byte;
  174. Begin
  175.  GotoXY(39,17);
  176.  TextColor(0);
  177.  For I:=1 to 31 do Begin
  178.   Case PC[I]of
  179.    28:GotoXY(WhereX+1,WhereY);
  180.    29:GotoXY(WhereX-1,WhereY);
  181.    31:GotoXY(WhereX,WhereY+1);
  182.    Else Begin
  183.     Screen[WhereY,WhereX]:=Chr(PC[I]);
  184.     Write(Chr(PC[I]));
  185.    End;
  186.   End;
  187.  End;
  188.  PS1:=1;J1:=0;
  189.  RollBall;
  190.  T_:=T[Z9];Score:=S[Z9];T_:=T_+J;
  191.  Case S[Z9]of
  192.   0:Begin
  193.    If J1=10 Then If PS Then Score:=2 Else Score:=5;
  194.   End;
  195.   1:Begin
  196.    T_:=T_+J;
  197.    If J=10 Then Score:=3 Else Score:=4;
  198.   End;
  199.   2:Begin
  200.    T_:=T_+J*2;
  201.    If J<>10 Then Score:=4;
  202.   End;
  203.   3:Begin
  204.    T_:=T_+J;
  205.    If J1=10 Then Score:=5 Else Score:=1;
  206.   End;
  207.   4:Begin
  208.    T_:=T_+J;
  209.    If J=10 Then Score:=2 Else Score:=1;
  210.   End;
  211.  End;
  212.  T[Z9]:=T_;S[Z9]:=Score;
  213.  TextColor(Z9+2);
  214.  TextBackground(0);
  215.  GotoXY(31-Byte((Z9/2)=Trunc(Z9/2))*20,14-Byte(Z9<2)*2);
  216.  Write(T[Z9]);
  217.  TextColor(0);
  218.  TextBackground(Z9+2);
  219. End;
  220.  
  221. Procedure SecondBall;Begin
  222.  PS:=False;
  223.  RollBall;
  224.  T_:=T[Z9];
  225.  Score:=S[Z9];
  226.  T_:=T_+J;
  227.  Case S[Z9]of
  228.   0:Begin
  229.    If J1=10 Then If PS Then Score:=2 Else Score:=5;
  230.   End;
  231.   1:Begin
  232.    T_:=T_+J;
  233.    If J=10 Then Score:=3 Else Score:=4;
  234.   End;
  235.   2:Begin
  236.    T_:=T_+J*2;
  237.    If J<>10 Then Score:=4;
  238.   End;
  239.   3:Begin
  240.    T_:=T_+J;
  241.    If J1=10 Then Score:=5 Else Score:=1;
  242.   End;
  243.   4:Begin
  244.    T_:=T_+J;
  245.    If J=10 Then Score:=2 Else Score:=1;
  246.   End;
  247.  End;
  248.  T[Z9]:=T_;S[Z9]:=Score;
  249.  TextColor(Z9+2);
  250.  TextBackground(0);
  251.  GotoXY(31-Byte((Z9/2)=Trunc(Z9/2))*20,14-Byte(Z9<2)*2);
  252.  Write(T[Z9]);
  253.  TextColor(0);
  254.  TextBackground(Z9+2);
  255. End;
  256.  
  257. Procedure ExtraBalls;Begin
  258.  GotoXY(1,20);
  259.  Write('Jouez deux autres boules,',NA[Z9]);
  260.  Delay(1000);
  261.  GotoXY(1,WhereY);
  262.  Write(' ':29);
  263.  S[Z9]:=Score-1;
  264.  B1:=1;
  265.  FirstBall;
  266.  If J<>10 Then Begin
  267.   S[Z9]:=1;
  268.   B1:=2;
  269.   SecondBall;
  270.  End
  271.   Else
  272.  Begin
  273.   S[Z9]:=1;
  274.   B1:=2;
  275.   FirstBall;
  276.  End;
  277. End;
  278.  
  279. Procedure MainLoop;
  280. Var
  281.  I:Integer;
  282.  K:Char;
  283. Begin
  284.  For Q:=1 to 10 do For Z9:=0 to A-1 do Begin
  285.   If Terminated Then Break;
  286.   TextBackground(Z9+2);
  287.   For I:=16 to 24 do Begin
  288.    GotoXY(1,I);
  289.    Write(' ':39);
  290.   End;
  291.   B1:=0;
  292.   FirstBall;
  293.   If J1<>10 Then Begin
  294.    B1:=1;
  295.    SecondBall;
  296.   End;
  297.   If Q=10 Then Begin
  298.    Case Score of
  299.     0:;
  300.     1,2:ExtraBalls;
  301.     3:;
  302.     4:Begin
  303.      GotoXY(1,20);
  304.      Write('Jouez une autre boule, ',NA[Z9]);
  305.      Delay(1000);
  306.      GotoXY(1,WhereY);
  307.      Write(' ':28);
  308.      S[Z9]:=1;B1:=2;
  309.      FirstBall;
  310.     End;
  311.    End;
  312.   End;
  313.  End;
  314.  GotoXY(3,16);
  315.  Write('Voulez-vous encore jouer (O ou N) ?');
  316.  If UpCase(ReadKey)='O'Then Terminated:=False
  317.                        Else Terminated:=True;
  318. End;
  319.  
  320. BEGIN
  321.  InitGame;
  322.  DrawGameScreen;
  323.  InitScore;
  324.  Repeat
  325.   MainLoop;
  326.  Until Terminated;
  327. END.

Code source

Voici le code source du jeu sur GitHub :

Lien Langage de programmation Projet
https://github.com/gladir/7iles/blob/main/BOWLING.PAS Turbo Pascal, Free Pascal 7iles


Dernière mise à jour : Jeudi, le 28 juillet 2022