Delphi-PRAXiS
Seite 3 von 13     123 45     Letzte »    

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Delphi Memory-Spiel: Ideen (https://www.delphipraxis.net/187916-memory-spiel-ideen.html)

XardasLP 27. Jan 2016 15:32

AW: Memory-Spiel: Ideen
 
Ok so sieht es jetzt schon mal gut aus... jeder neue Nutzer bekommt eine eigene Datei.

Code:
procedure TFormReg.Button_LoginClick(Sender: TObject);
begin
 if (Edit_Benutzername.Text = '') or (Edit_PW.Text = '') or (Edit_PW_1.Text = '') then
      {1}begin
          showmessage('Bitte überprüfen Sie Ihre Eingaben!');
          Edit_Benutzername.Text := '';
          Edit_PW.Text := '';
          Edit_PW_1.Text := '';
      {1}end
            else
         {2}begin
              if Edit_PW.Text <> Edit_PW_1.Text then
             {3}begin
                showmessage('Ihr gewählten Passwörter stimmen nicht überein!');
                Edit_Pw.Text := '';
                Edit_PW_1.Text := '';
               {3}end
                  else
                    if Edit_PW.Text = Edit_PW_1.Text then
                   {4}begin
                        Benutzername := Edit_Benutzername.Text;
                        Memo_Login.Lines.Add(Benutzername);
                        Memo_Login.Lines.SaveToFile(Benutzername+'.txt');
                   {4}end;
         {2}end;
      {1}end;
Ich kann natürlich später dann "append" verwenden, damit es nur eine einzige Datei ist.
Nun muss noch das Passwort angefügt werden für jeden Nutzer einzeln. Halt auch so eine Ascii Verschlüsselung. Das Programm gibt dann einen Schlüssel vor für jeden Account: z.B. 40
also wird aus A --> 51 --> + 40 = 91 (nicht nachvollziehbar ohne den Schlüssel)
der Schlüssel wird vom Benutzer selbst nicht gesehen.


Beim Login muss ich natürlich dann die entsprechende Xardas.txt Datei suchen lassen.
Code:
assignfile(tf,Benutzername + '.txt')
reset(tf)
usw.

XardasLP 27. Jan 2016 15:35

AW: Memory-Spiel: Ideen
 
Zitat:

Schau dir mal die Klasse TStringlist an. Das mach mehr Sinn als ein unsichtbares Memo.
Die Funktion FileExists(Dateiname) kann dir sagen, ob eine Datei mit dem Namen des Benutzers schon existiert.
Statt AssignFile usw. kannst du dann diese Datei in eine StringList laden und damit arbeiten, oder falls die Datei bisher nicht existierte, die entsprechenden Infos in die StringList schreiben und dann unter dem gewünschten Namen abspeichern.
Okey, das hört sich gut an :)

Nachlesen kann ich selbst. Das größte Problem ist einfach das wir kaum Klassen kennen und nur wenig gemacht haben was dem hier jetzt annähernd entpricht. Komme schon gut voran wenn mir nur mal wer sagt wie man was machen kann.

Ist wie wenn man den Datentyp "record" nicht kennt und versucht mit den anderen krampfhaft was hinzubekommen. So ungefähr ist das bei uns. Lehrer die gammeln.

Mavarik 27. Jan 2016 15:59

AW: Memory-Spiel: Ideen
 
Zitat:

Zitat von XardasLP (Beitrag 1328471)
also wird aus A --> 51 --> + 40 = 91 (nicht nachvollziehbar ohne den Schlüssel)

Wenn man dafür einen Blick hat... Erkennt man sofort den "Chiffree"... und mit in bisschen testen hat man das raus...

Dann schon lieber eine Tabelle Result := chr(Table[ord(A)])...
oder einen XOR String zur Verknüpfung...

BTW.: Was hat das mit Memory zu tun?

Abgesehen davon gibt es hier extra einen Delphi-Tag - also nicht Code verwenden...

Sir Rufo 27. Jan 2016 17:22

AW: Memory-Spiel: Ideen
 
Wenn man selber das Password validiert, dann speichert man das nicht verschlüsselt sondern als Hash mit (einer Prise) Salz.

Luckie 27. Jan 2016 18:01

AW: Memory-Spiel: Ideen
 
Um was geht es hier jetzt eigentlich? Um ein Memory Spiel oder wie man Benutzer und Passwort (sicher) in einer Datei speichert und wieder validiert? Das ein hat mit dem anderen nichts zu tun. So ein "Login" für ein Memory Spiel ist ja ganz nett. Aber hat mit dem Problem "Memory Spiel unter Nutzung von Klassen" nichts zu tun. Davon abgesehen, hätte man schon das Login in einer Klasse packen können.

In diesem Thread geht es um das Memory Spiel und nicht um das Speichern von Benutzername und Passwort.

@XardasLP: Mach bitte für ein neues Thema einen neuen Thread auf. Wobei das Thema Benutzer und Passwort abspeichern schon oft genug hier diskutiert wurde.

XardasLP 27. Jan 2016 18:01

AW: Memory-Spiel: Ideen
 
Zitat:

BTW.: Was hat das mit Memory zu tun?
Das Memory kommt ja erst noch.

Login, Registrierung (Benutzer)
Highscore-Liste
Einspieler (alleine und gegen Computer) / Mehrspieler
mehrere Schwierigkeitsgrade



Zitat:

Wenn man selber das Password validiert, dann speichert man das nicht verschlüsselt sondern als Hash mit (einer Prise) Salz.
Wenn das für uns aber als "verschlüsseln" reicht ist das doch ok. geht nur darum das niemand die Testdatei aufmacht und seine Punktzahl so mega easy einsehen und verändern kann.

XardasLP 27. Jan 2016 18:06

AW: Memory-Spiel: Ideen
 
Zitat:

In diesem Thread geht es um das Memory Spiel und nicht um das Speichern von Benutzername und Passwort.
Ich mache doch nicht mehrere Threads für ein Komplexprogramm, am Ende muss das ja alles eine Verbindung haben.


Das einzige was wir mal mit Klassen ("komplex") gemacht haben ist das hier:

Unit1:
Delphi-Quellcode:
unit Umain;

interface

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

type
  TForm1 = class(TForm)
    Label1: TLabel;
    Label2: TLabel;
    EditID: TEdit;
    ButtonND: TButton;
    Label3: TLabel;
    Label4: TLabel;
    Label5: TLabel;
    Label6: TLabel;
    RG: TRadioGroup;
    ButtonBA: TButton;
    ButtonSAVE: TButton;
    ButtonCLOSE: TButton;
    EditDS: TEdit;
    EditB: TEdit;
    EditLZ: TEdit;
    CB: TComboBox;
    EditmZ: TEdit;
    EditmR: TEdit;
    EditGz: TEdit;
    EditGza: TEdit;
    Label7: TLabel;
    Label8: TLabel;
    Label9: TLabel;
    Label10: TLabel;
    procedure ButtonBAClick(Sender: TObject);
    procedure FormCreate(Sender: TObject);
    procedure ButtonNDClick(Sender: TObject);
    procedure RGClick(Sender: TObject);
    procedure ButtonSAVEClick(Sender: TObject);
    procedure ButtonCLOSEClick(Sender: TObject);
  private
    { Private-Deklarationen }
  public
    { Public-Deklarationen }
  end;

var
  Form1: TForm1;
  liste: TStrings;
  anz: integer;

implementation

uses UDarlehen;

{$R *.dfm}

procedure TForm1.ButtonBAClick(Sender: TObject);
begin
 EditDS.Enabled := False;
  EditB.Enabled := False;
  EditLZ.Enabled := False;
  CB.Enabled := False;
  Label3.Enabled := False;
  Label4.Enabled := False;
  Label5.Enabled := False;
  Label6.Enabled := False;
  Label7.Enabled := True;
  Label8.Enabled := True;
  Label9.Enabled := True;
  Label10.Enabled := True;
  EditGZ.Enabled := True;
  EditGza.Enabled := True;
  EditmR.Enabled := True;
if (EditDS.Text = '') or (EditB.Text = '') or (EditLZ.Text = '') or (CB.Text = '')
    then begin
    EditDS.SetFocus;
         end
    else begin
        darlehen.set_DS(strtofloat(Editds.Text));
        darlehen.set_BE(strtodate(EditB.Text));
        darlehen.set_LZ(strtoint(EditLZ.Text));
        darlehen.set_JZ(strtofloat(CB.Text));
        case RG.ItemIndex of
          0: begin
                EditMR.Text := formatfloat('0.00',darlehen.get_mon_Raten);
                EditMZ.Clear;
                EditGZ.Text := formatfloat('0.00',darlehen.get_ges_zinsen);
                EditGza.Text := formatfloat('0.00',darlehen.get_ges_zahlung);
             end;
          1: begin
                EditMZ.Text := formatfloat('0.00',darlehen.get_mon_Zinsen);
                EditMR.Text := '';
             end;
    end;
     EditGz.Text := formatfloat('0.00', darlehen.get_ges_zinsen);
     EditGza.Text := formatfloat('0.00', darlehen.get_ges_zahlung);
end;
ButtonSave.Enabled := True;
ButtonClose.Enabled := True;
end;

procedure TForm1.FormCreate(Sender: TObject);
begin
  liste := TStringList.Create;
end;

procedure TForm1.ButtonNDClick(Sender: TObject);
begin
  ButtonND.Enabled := False;
  EditID.Enabled := False;
  Label2.Enabled := False;
  EditDS.Enabled := True;
  EditB.Enabled := True;
  EditLZ.Enabled := True;
  CB.Enabled := True;
  Label3.Enabled := True;
  Label4.Enabled := True;
  Label5.Enabled := True;
  Label6.Enabled := True;
  if RG.ItemIndex = -1
  then begin
          showmessage('Bitte Darlehensart auswählen! ');
       end
  else begin
          liste.LoadFromFile('darlehen.txt');
          anz := + liste.Count + 1000;
          //showmessage(inttostr(anz));
          EditID.Text := upcase(RG.Items[RG.ItemIndex][1]) + inttostr(anz);
          case RG.ItemIndex of
          0: darlehen := TAnnuitaetendarlehen.create(Editid.Text);
          1: darlehen := TEndfaelliges_Darlehen.create(Editid.Text);
          end;
          ButtonBA.Enabled := True;
       end;
end;

procedure TForm1.RGClick(Sender: TObject);
begin
ButtonND.Enabled := True;
Label2.Enabled := True;
end;

procedure TForm1.ButtonSAVEClick(Sender: TObject);
begin
  liste.Add(darlehen.speichern);
  liste.SaveToFile('darlehen.txt');
  showmessage('Daten erfolgreich gespeichert!');
  liste.Free;
  darlehen.Free;
end;

procedure TForm1.ButtonCLOSEClick(Sender: TObject);
begin
close;
end;

end.
Unit2:
Delphi-Quellcode:
unit UDarlehen;

interface

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

type
 TDarlehen = class
  protected
    Ident: string;
    Darlehensschuld: real;
    Beginn: TDateTime;
    Laufzeit: integer;
    Jahreszins: real;
    A: real;
  public
    constructor create;
    procedure set_DS (Wert: real);
    procedure set_BE (Wert: TDateTime);
    procedure set_LZ (Wert: integer);
    procedure set_JZ (Wert: real);
    function get_mon_Zinsen(): real; virtual;
    function get_mon_Raten(): real; virtual;
    function get_ges_zinsen(): real; virtual;
    function get_ges_zahlung(): real;
    function speichern(): string;
 end;

 TAnnuitaetendarlehen = class(TDarlehen)
   private
   public
    constructor create(id: string);
    function get_mon_Raten(): real; override;
    function get_ges_Zinsen(): real; override;
 end;

 TEndfaelliges_Darlehen = class(TDarlehen)
    public
      constructor create(id: string);
      function get_mon_Zinsen(): real; override;
      function get_ges_Zinsen(): real; override;
 end;

var
darlehen: TDarlehen;


implementation


//*-----*//TDarlehen//*-----*//

constructor TDarlehen.create;
begin
//
end;


procedure TDarlehen.set_DS (Wert: real);
begin
  Darlehensschuld := wert;
end;


procedure TDarlehen.set_BE (Wert: TDateTime);
begin
  Beginn := wert;
end;


procedure TDarlehen.set_LZ (Wert: integer);
begin
  Laufzeit := wert;
end;


procedure TDarlehen.set_JZ (Wert: real);
begin
  Jahreszins := wert;
end;


function TDarlehen.get_mon_Zinsen(): real;
begin
//
end;


function TDarlehen.get_mon_Raten(): real;
begin
//
end;


function TDarlehen.get_ges_zinsen(): real;
begin
//
end;


function TDarlehen.get_ges_zahlung(): real;
begin
  result := Darlehensschuld + get_ges_zinsen;
end;


function TDarlehen.speichern(): string;
begin
  result := Ident + '#' + formatfloat('0.00',darlehensschuld)
                  + '#' + datetostr(Beginn)
                  + '#' + inttostr(Laufzeit)
                  + '#' + formatfloat('0.00',jahreszins)
                  + '#' + formatfloat('0.00',get_mon_zinsen)
                  + '#' + formatfloat('0.00',get_mon_raten)
                  + '#' + formatfloat('0.00',get_ges_zinsen)
                  + '#' + formatfloat('0.00',get_ges_zahlung);
end;


//*-----*//TAnnuitaetendarlehen//*-----*//

constructor TAnnuitaetendarlehen.create(id: string);
begin
  Ident := id;
end;


function TAnnuitaetendarlehen.get_mon_Raten(): real;
begin
  result := Darlehensschuld * power(1 + Jahreszins/1200, Laufzeit)
            *(Jahreszins/1200) /(power(1 + Jahreszins/1200, Laufzeit) -1);
  //Power errechnet aus Base und einen beliebigen Wert die Potenz. Wird als
  //Exponent ein Bruchwert oder ein Wert größer MaxInt angegeben,
  //muss Base größer als 0 sein.
end;


function TAnnuitaetendarlehen.get_ges_Zinsen(): real;
begin
  result := get_mon_Raten * laufzeit - Darlehensschuld;
end;


//*-----*//TEndfaelliges_Darlehen//*-----*//


constructor TEndfaelliges_Darlehen.create(id: string);
begin
  Ident := id;
end;


function TEndfaelliges_Darlehen.get_mon_Zinsen(): real;
begin
  result := get_ges_Zinsen
end;


function TEndfaelliges_Darlehen.get_ges_Zinsen(): real;
begin
  result := Darlehensschuld * power(1 + Jahreszins/100 {wegen Prozent},
            Laufzeit/12) - Darlehensschuld
end;                                                                          


end.

DeddyH 27. Jan 2016 18:09

AW: Memory-Spiel: Ideen
 
Zitat:

Zitat von XardasLP (Beitrag 1328510)
Zitat:

BTW.: Was hat das mit Memory zu tun?
Das Memory kommt ja erst noch.

Achso, dann stehst Du auch stundenlang im Baumarkt, weil Du Dich nicht für das richtige Türschloss für Dein neues Haus entscheiden kannst, bevor morgen früh der Bagger kommt, um die Grube auszuheben?

Monday 27. Jan 2016 18:29

AW: Memory-Spiel: Ideen
 
In einem Projekt immer das wichtigste zuerst. Gut, du hast schon viele Ideen gesammelt. Aber das Hauptprogramm ist das Spiel selbst. Deshalb mach zuerst das Memory. Die zwölf Kärtchen, anklicken, umdrehen, vergleichen, zählen und zwar als Einzelspieler. Damit bist du schon genug beschäftigt. (Wenn das nicht funktioniert, ist alles andere sowieso umsonst gewesen.) Mach die Kärtchen ruhig erstmal an einer fixen Position, der Zufall kann später auch noch kommen. Das ist einfacher.

Danach könntest du über Mehrspieler, gegen Computer usw. nachdenken (Das funktioniert nur wenn der Einzelspieler schon läuft, und ist auch noch schwierig genug!).

Menüführung, Login usw. ist hier das unwichtigste (und behandelt einen ganz anderen Teilaspekt). Man braucht es gar nicht, und falls man es wirklich will, kann man es am Schluss noch dazu machen. Auch wenn man im Programm zuerst in das Menü gehen würde, als zweites Einstellungen machen würde usw. ist das beim Programmieren andersrum. Das wichtigste zuerst. Deine Gesamtvorstellungen sind gut, aber über das Ziel hinausgeschossen.

LG

XardasLP 27. Jan 2016 18:43

AW: Memory-Spiel: Ideen
 
Tja, das da oben ist eine so genannte KOMPLEXAUFGABE bei uns.
Und das was wir jetzt aufgelegt bekommen haben steht in keiner Weise mit dem was wir können in Relation. 85% Unbekannte Sachen herausfinden erscheint mir schon ziemlich krass.

Delphi-Quellcode:
Mach die Kärtchen ruhig erstmal an einer fixen Position, der Zufall kann später auch noch kommen. Das ist einfacher.

Danach könntest du über Mehrspieler, gegen Computer usw. nachdenken (Das funktioniert nur wenn der Einzelspieler schon läuft, und ist auch noch schwierig genug!).
Werde ich denke sowieso machen, denn nur die angebliche Vollversion umfasst zufällige Spielfelder.
Ich muss das ja alles machen, kann mich nicht beschrenken. Das ist gefordert und wie ich das mache interessiert den Typ nicht.

Der meint statt Listbox.Items.Add ist Listbox.Lines.Add richtig... also richtige Gammellehrer wo wir Schüler so krass viel kernen - NICHT!


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:43 Uhr.
Seite 3 von 13     123 45     Letzte »    

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz