unit U_DartScores;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls, ExtCtrls, jpeg;

type
  TForm1 = class(TForm)
    edtInvoer: TEdit;
    memScore1: TMemo;
    lblSpeler: TLabel;
    lblPijl: TLabel;
    btnBeginRonde: TButton;
    btnControleer: TButton;
    lblHuidigeScore: TLabel;
    memScore2: TMemo;
    memComment: TMemo;
    btnOpslaan: TButton;
    SaveDialog1: TSaveDialog;
    lblComment: TLabel;
    Bevel1: TBevel;
    Bevel2: TBevel;
    Bevel3: TBevel;
    btnAfsluiten: TButton;
    lblScoreLijsten: TLabel;
    lblScoreSpeler1: TLabel;
    lblScoreSpeler2: TLabel;
    imgPijl1: TImage;
    imgPijl2: TImage;
    imgPijl3: TImage;
    Image1: TImage;
    procedure btnBeginRondeClick(Sender: TObject);
    procedure btnControleerClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure btnOpslaanClick(Sender: TObject);
    procedure btnAfsluitenClick(Sender: TObject);
    procedure Image1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses u_DartBoard;

{$R *.dfm}
const
  Spaties = '   ';
  Spaties2 = ' ';

type
  TScoreMetDriePijlen = Array[0..3] of string;

var
  Beginscore : integer; //Geeft de Format aan.
  Pijl : integer; //Geeft aan welke Pijl er gegooid wordt
  Speler : integer;//Geeft aan of speler [1] of speler [2] aan de beurt is
  ScoreSpeler : Array[1..2] of integer;//Houd scores van iedere speler bij
  NaamSpeler : Array[1..2] of string[15];//Houd naam van iedere speler bij
  UitgooiMogelijkheden : Array of TScoreMetDriePijlen;//Ingelezen array
  ScoreIndex : Array of integer;//Array met alle uitgooiwaardes
  IndexLengte : Integer;//lengte uitgooi-arrays
  Winnaar : string;

//++Functies en Procedures++++++++++++++++++++++++++++++++++++++++++++++++++++++

//==============================================================================
//Inlezen UitgooiMogelijkheden  
Procedure BestandInlezen;
var//Interne variabelen
  karakter : Char;
  Uitgooi : TextFile;
  LengteLijst : integer;
  Positie : integer;
  Aantalpijlen : integer;
  Index : integer;

begin //B1
//Maakt het bestand klaar om in te lezen:
  Assignfile(Uitgooi,'Uitgooimogelijkheden.txt');
  Reset(Uitgooi);
  Readln(Uitgooi);
//Zet tellers op 0 (UitgooiMogelijkheden[Positie][AantalPijlen])
   Positie := 0;
   AantalPijlen := 0;
   LengteLijst := 0;

  While not eof(Uitgooi) do begin
   LengteLijst := Positie + 1; //Bepaald lengte Dynamische Array
   Setlength(UitgooiMogelijkheden,Lengtelijst);
   While not eoln(Uitgooi) do begin
     Read(Uitgooi,karakter);
      If karakter <> #9 then begin //Als het karakter geen tab is
        UitgooiMogelijkheden[Positie][AantalPijlen] :=
                        UitgooiMogelijkheden[Positie][AantalPijlen] + karakter;
      end
      else begin //Als het karakter wel een tab is
         Inc(AantalPijlen);
      end;
   end;
   AantalPijlen := 0;
   Inc(Positie);
   Readln(Uitgooi); //Zet Cursor op begin volgende regel
  end;
  CloseFile(Uitgooi);
  SetLength(ScoreIndex,LengteLijst);
  IndexLengte := (Lengtelijst-1);
  For index := 0 to (IndexLengte) do begin
    ScoreIndex[index] := StrToInt(UitgooiMogelijkheden[index][0]);
  end;

end;
//Einde inlezen Uitgooimogelijkheden;
//==============================================================================

//==============================================================================
//Bekijkt uitgooimogelijkheiden
Procedure ControleerUitgooiMogelijkheid(HuidigeScore : integer);
var
  Teller : integer;
  IndexNummer : integer;
  Controle : Boolean;
  DeMogelijkheid : string;
begin
  Form1.memComment.Clear;
  Controle := False;
  IndexNummer := 0;
  For Teller := 0 to IndexLengte do begin
    If ScoreIndex[Teller]= HuidigeScore then begin
      IndexNummer:= Teller;
      Controle := True;
    end;
  end;
  If Controle = True then begin
   For Teller := 1 to 3 do begin
    DeMogelijkheid := ('Pijl' + IntToStr(Teller) + ': '
                            + UitgooiMogelijkheden[IndexNummer][teller] + '.');
    Form1.memComment.Lines.Add(DeMogelijkheid);
   end;

  end
  else begin
    DeMogelijkheid := 'Geen uitgooisuggestie.';
    Form1.memComment.Lines.Add(DeMogelijkheid);
   end;
end;
//Einde Bekijkt uitgooimogelijkheiden
//==============================================================================

//==============================================================================
//Opmaak Memo
Function GetalOpmaak(GetalWaarde: Integer):String;
  Begin
    If (GetalWaarde >= 100) then begin
      Result := IntToStr(Getalwaarde)+'  ';
    end
    else if (Getalwaarde < 100) AND (Getalwaarde >=10) Then begin
      Result := ' ' + IntToStr(Getalwaarde)+ '  ';
    end
    else if (Getalwaarde < 10) then begin
      Result := '  ' + IntToStr(Getalwaarde)+ '  ';
    end;
  end;

//Einde Opmaak Memo
//==============================================================================

Procedure GeenScoreMeer;
var
  Geenscore: string;
begin
  GeenScore:='';
  While Pijl < 4 do begin
    Geenscore:=Geenscore + ' XX  ' + spaties;
    Inc(Pijl);
  end;
  Geenscore:=Geenscore;
  If speler=1 then begin
    Form1.memScore1.Lines.Text:=Form1.memScore1.Lines.Text + Geenscore;
  end
  else begin
    Form1.memScore2.Lines.Text:=Form1.memScore2.Lines.Text + Geenscore;
  end;
end;




//==============================================================================
//Begin Codes voor invoer controle
Procedure ControleerString(Invoertekst: string; var Getalteruggave : integer; var Oordeel : Boolean);
var
  Getal : integer;
  code : integer;
  boodschap : string;
begin
  Val(Invoertekst,Getal,Code);
  If Code = 0 then begin
     Getalteruggave := Getal;
     Oordeel := True;
  end
  else begin
     Getalteruggave := 0;
     Oordeel := False;
     boodschap := 'De ingevoerde waarde is geen geheel getal!';
     boodschap := boodschap + 'Controleer het getal, en vul opnieuw in';
     MessageDlg(boodschap,mtWarning,[mbOK],0);
  end;

end;

Function Controleerwaarde(GetalInvoer : Integer): Boolean;
var
  Verdubbelaar : integer;
  AlleGetallen : integer;
  Totaal : integer;
  Controle : Boolean;

begin //b1
   Controle := False;
  If (GetalInvoer = 0) OR (GetalInvoer = 25) OR (GetalInvoer = 50) then begin
    Controle:=True;
  end
  else begin
   For Verdubbelaar := 1 to 3 do begin //b2
    For AlleGetallen := 1 to 20 do begin //b3
       Totaal := Verdubbelaar * AlleGetallen;
       If (Totaal = GetalInvoer) then begin //b4
         Controle := True
       end; //e4
     end;  //e3
   end; //e2
  end;
   RESULT := Controle;
end; //e1

Procedure ControleerInvoer(Invoer : string; var Waarde : Integer; var InvoerIsGoed: Boolean);
{Gebundelde code; voert de bovenstaande 2 codes uit}
var
  InvoerIsGetal : Boolean;
  InvoerKanGegooidZijn  : Boolean;
  Boodschap : string;

begin
  InvoerIsGoed :=False;
  ControleerString(Invoer,Waarde,InvoerIsGetal);
  If InvoerIsGetal=True then begin
    InvoerKanGegooidZijn := ControleerWaarde(Waarde);
    If InvoerKanGegooidZijn = True then begin
      InvoerIsGoed := True;
    end
    else begin
      boodschap := 'De ingevoerde waarde kan nooit gegooid zijn!';
      boodschap := boodschap + ' Controleer de invoer, en vul opnieuw in';
      MessageDlg(boodschap,mtWarning,[mbOK],0);
    end;
  end;

end;

//Einde Codes voor invoer controle
//==============================================================================

//==============================================================================
//Maakt het formulier gereed voor een nieuwe speler/beurt
Procedure NieuweSpelerBeurt;
begin
  Pijl := 1;
  Form1.imgPijl1.Visible := True;
  Form1.imgPijl2.Visible := True;
  Form1.imgPijl3.Visible := True;
 If speler=1 then begin
  Form1.memScore1.Lines.Text := Form1.memScore1.Lines.Text + spaties2 + GetalOpmaak(ScoreSpeler[speler]);
  Form1.memScore1.Lines.Add('');
  speler :=2;
 end
 else begin
  Form1.memScore2.Lines.Text := Form1.memScore2.Lines.Text + spaties2 + GetalOpmaak(ScoreSpeler[speler]);
  Form1.memScore2.Lines.Add('');
  speler :=1;
 end;

 //Hermaakt het formulier
 Form1.lblHuidigeScore.Caption := 'Huidige Score: ' + IntToStr(ScoreSpeler[speler]);
 Form1.lblPijl.Caption := 'Pijl' + ' ' + IntToStr(Pijl);
 Form1.lblSpeler.Caption := 'SPELER: ' + NaamSpeler[speler];
 ControleerUitgooiMogelijkheid(ScoreSpeler[speler]);
 Form1.edtInvoer.Clear;

end;
//
//==============================================================================

//==============================================================================
//Busted!
Procedure BUSTED;
var
  boodschap : string;
begin
  boodschap := 'BUSTED!! Volgende speler!';
  MessageDlg(boodschap,mtWarning,[mbOK],0);
  GeenScoreMeer;
  NieuweSpelerBeurt;
end;
//Einde Busted!
//==============================================================================

//==============================================================================
//Controleert de laatste waarde op een double
Procedure ControleerDouble(LaatsteWaarde : Integer);
var
  AlleGetallen : integer;
  Totaal : integer;
  Controle : Boolean;
  Boodschap : string;
begin
  Controle := False;
  If LaatsteWaarde = 50 then Controle := True;
  For AlleGetallen := 1 to 20 do begin
    totaal := AlleGetallen * 2;
    If Totaal = LaatsteWaarde then begin
     Controle := True;
    end;
  end;
  If Controle = True then begin
    boodschap := 'LAST CHECK: Gegooide waarde is een Double?';
    IF MessageDlg(boodschap,mtConfirmation,[mbYes,mbNo],0)=mrNo then begin
      BUSTED;
    end
    else begin
      If (speler=1) then begin
       Form1.memScore1.Lines.Text :=  Form1.memScore1.Lines.Text
                                      + GetalOpmaak(ScoreSpeler[1]) + spaties;
      end
      else begin
        Form1.memScore2.Lines.Text :=   Form1.memScore2.Lines.Text
                                        + GetalOpmaak(ScoreSpeler[2]) + spaties;
      end;
      Inc(Pijl);
      GeenScoreMeer;
      Form1.btnControleer.Enabled:=False;
      Form1.edtInvoer.Enabled:=False;
      Winnaar:=NaamSpeler[speler];
      Form1.memComment.Clear;
      Form1.memComment.Lines.Add(Winnaar + ' heeft deze ronde gewonnen!');
      If speler=1 then begin //Voor de laatste score in!
        Form1.memScore1.Lines.Text:=  Form1.memScore1.Lines.Text + ' '
                                      + GetalOpmaak(0);
        Form1.memScore2.Lines.Add(' XX  ' + spaties + ' XX  ' + spaties
                                    + ' XX  ' + spaties2
                                    + GetalOpmaak(ScoreSpeler[2]));
       end
       else begin
        Form1.memScore2.Lines.Text:=  Form1.memScore2.Lines.Text + ' '
                                      + GetalOpmaak(0);
       end;
     end;
  end
  else begin
    BUSTED;
  end;
end;
//Einde Controleert de laatste waarde
//==============================================================================

//==============================================================================
//1 Beurt
Procedure PijlGegooid(pijlscore :integer);
var
  NieuweScore : integer;
  PijlscoreTekst : string;
begin
  NieuweScore := ScoreSpeler[speler] - Pijlscore;

   If (NieuweScore = 0) Then begin
    ControleerDouble(Pijlscore);
  end
  else if (NieuweScore = 1) OR (NieuweScore < 0) then begin
    Busted;
  end
  else if (NieuweScore >= 2) then begin
    ScoreSpeler[speler] := NieuweScore;
     PijlscoreTekst:= GetalOpmaak(Pijlscore);

     If (speler=1) then begin
       Form1.memScore1.Lines.Text :=  Form1.memScore1.Lines.Text
                                      + PijlscoreTekst + spaties;
     end
     else begin
      Form1.memScore2.Lines.Text := Form1.memScore2.Lines.Text
                                    + PijlscoreTekst + spaties;
     end;
    If (Pijl >= 3) then begin
     Form1.imgPijl1.Visible := False;
     Form1.imgPijl2.Visible := False;
     Form1.imgPijl3.Visible := False;
       NieuweSpelerBeurt;
       MessageDlg(NaamSpeler[speler] +' is aan de beurt!',
                                                     mtInformation, [mbOK], 0);
    end
    else begin
      Inc(Pijl);
      Form1.lblPijl.Caption := 'Pijl' + ' ' + IntToStr(Pijl);
      If Pijl = 2 then begin
        Form1.imgPijl1.Visible := False;
        Form1.imgPijl2.Visible := True;
        Form1.imgPijl3.Visible := True;
      end
      else if Pijl = 3 then begin
        Form1.imgPijl1.Visible := False;
        Form1.imgPijl2.Visible := False;
        Form1.imgPijl3.Visible := True;
      end;
    end;
  end;
    Form1.lblHuidigeScore.Caption := 'Huidige Score: '
                                                + IntToStr(ScoreSpeler[speler]);
End;
//Einde 1 beurt
//==============================================================================

//==============================================================================
//Opslaan van de scorelijsten
Procedure Opslaan;
var
  nummer: integer;
  regel : string;
  Opslaan : Textfile;
begin
  nummer := 0;
If Application.MessageBox('Wil je deze resultaten opslaan?',
'Opslaan scoreresultaat', mb_YesNo) =IDYes then begin
   if Form1.SaveDialog1.Execute then begin
    AssignFile(Opslaan,Form1.SaveDialog1.FileName + '.txt');
    Rewrite(Opslaan);
    while Form1.memScore1.Lines[nummer] <> '' do begin
      regel:= Form1.memScore1.Lines[nummer] + '  |  |  ' + Form1.memScore2.Lines[nummer];
     writeln(Opslaan,regel);
     Inc(nummer);
    end;
    CloseFile(Opslaan);
    MessageDlg('Succesvol opgeslagen!!', mtInformation, [mbOK], 0);
   end;
  end;
end;
//Einde Opslaan
//==============================================================================


//++PROGRAMMA+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

{Vanaf het begin}
procedure TForm1.btnBeginRondeClick(Sender: TObject);
var
  Invoerscore : string;
  Code : integer;
  Invoer : integer;
  Naam : string;
  lengte : boolean;

begin
//Stel de beginscores in:
  Code := 1;
  While Code <>0 do begin {Invoer en controle beginscore: 99-999}
    InvoerScore := InputBox('Voer de beginscore in: (van 99 tot 999)',
                                                          'Beginscore: ','501');
    Val(InvoerScore,BeginScore,Code);
    If (Beginscore < 99) OR (Beginscore > 999) then code:=1;
  end;
  ScoreSpeler[1] := BeginScore;
  ScoreSpeler[2] := BeginScore;

//Invoer vanaf het begin voor 1 speler: 1 naam, 1 beginscore:
  For invoer := 1 to 2 do begin //voor speler1 en speler2
    lengte:=False;
    While lengte=False do begin //Zolang de lengte niet goed is:
      Naam := InputBox('Voer de naam van speler' + IntToStr(invoer)
                              +  ' in','Speler' + IntToStr(invoer)
                              +  ': (MAX 15 tekens) ',NaamSpeler[invoer]);
      If Length(Naam) < 15 then begin
      NaamSpeler[invoer]:=Naam;
      lengte:=True;
      end
      else begin
        MessageDlg('De naam is te lang!',mtWarning,[mbOK],0);
      end;
    end;
  end;

//Klaarmaken formulier
  memScore1.Clear;
  memScore2.Clear;
  Pijl := 1;
  Speler := 1;
  btnControleer.Enabled := True;
  btnOpslaan.Enabled := True;
  edtInvoer.Enabled := True;
  imgPijl1.Visible := True;
  imgPijl2.Visible := True;
  imgPijl3.Visible := True;
  lblHuidigeScore.Caption :=   'Huidige Score: '
                                      + IntToStr(ScoreSpeler[speler]);
  lblPijl.Caption := 'Pijl' + ' ' + IntToStr(Pijl);
  lblSpeler.Caption := 'SPELER: ' + NaamSpeler[speler];
  ControleerUitgooiMogelijkheid(scoreSpeler[speler]);

//Begin scoreformulier
  //Dit is SPELER1:
  memScore1.Lines.Add(  NaamSpeler[1] + Spaties + 'Format:'
                                                        + IntToStr(Beginscore));
  memScore1.Lines.Add('Pijl1'+ spaties + 'Pijl2' + spaties + 'Pijl3' + spaties
                                                                    + 'Over:');
  //Dit is SPELER2:
  memScore2.Lines.Add(NaamSpeler[2] + Spaties + 'Format:'
                                                        + IntToStr(Beginscore));
  memScore2.Lines.Add('Pijl1'+ spaties + 'Pijl2' + spaties + 'Pijl3' + spaties
                                                                    + 'Over:');
end;
{Einde vanaf begin}


procedure TForm1.btnControleerClick(Sender: TObject);
var
  Gegooid : integer;
  Invoerveld : string;
  GoedeInvoer : Boolean;
begin//B1
  Invoerveld := edtInvoer.Text;
  ControleerInvoer(Invoerveld,Gegooid,GoedeInvoer);
  If GoedeInvoer = True then begin // B2
    PijlGegooid(Gegooid);
  end;//E2

end;//E1

procedure TForm1.FormCreate(Sender: TObject);
begin
BestandInlezen;

{Eerlijk toegegeven: de code hieronder is rechtstreeks overgenomen}
 with SaveDialog1 do begin
  InitialDir:=ExtractFilePath(Application.ExeName);
  {begindirectery wordt de directory waarin dit programma staat}
  Filter:='Text files (*.txt)|*.txt';
  {Er kunnen alleen *.txt files worden opgeslagen (voegt automatisch *.txt toe)}
 end;
{Maar ik denk te snappen wat er staat(commentaar van mezelf)}
end;

procedure TForm1.btnOpslaanClick(Sender: TObject);
begin
 Opslaan;
end;

procedure TForm1.btnAfsluitenClick(Sender: TObject);
begin
  If Application.MessageBox('Wil je echt afsluiten?', 'Afsluiten?',
                                      mb_YesNo) =IDYes then begin
    If Form1.btnOpslaan.Enabled=True then Opslaan;
    Application.terminate
  end;

end;

procedure TForm1.Image1Click(Sender: TObject);
begin
  If btnControleer.Enabled then Form2.Visible := True;
end;


{

Laatst bewerkt op woensdag 31 januari 19:12
Interface aangepast

woensdag 31 januari om 03:41;
BugFix bij Procedure ControleerDouble

++ Met dank aan: +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

Marjolein, Mayke, Jennifer, Caroline & Caroline;
voor de rustmomenten

Mark, Kristel, Marleen, Rolf & Carsten
voor het testen, en raporteren van bugs;

Michael & Rik
voor het onderwijs, ondersteuning en inspiratie;


++++++++++++++++++++++++++++++++++++++++++++++++++++++++++Written by: Niba86++++
++++++++++++++++++++++++++++++++++++++++++++++Contact: n.ballemans@gmail.com++++
}

end.
