AW: Memory-Spiel: Ideen
Ok so sieht es jetzt schon mal gut aus... jeder neue Nutzer bekommt eine eigene Datei.
Code:
Ich kann natürlich später dann "append" verwenden, damit es nur eine einzige Datei ist.
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; 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:
usw.
assignfile(tf,Benutzername + '.txt')
reset(tf) |
AW: Memory-Spiel: Ideen
Zitat:
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. |
AW: Memory-Spiel: Ideen
Zitat:
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... |
AW: Memory-Spiel: Ideen
Wenn man selber das Password validiert, dann speichert man das nicht verschlüsselt sondern als Hash mit (einer Prise) Salz.
|
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. |
AW: Memory-Spiel: Ideen
Zitat:
Login, Registrierung (Benutzer) Highscore-Liste Einspieler (alleine und gegen Computer) / Mehrspieler mehrere Schwierigkeitsgrade Zitat:
|
AW: Memory-Spiel: Ideen
Zitat:
Das einzige was wir mal mit Klassen ("komplex") gemacht haben ist das hier: Unit1:
Delphi-Quellcode:
Unit2:
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.
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. |
AW: Memory-Spiel: Ideen
Zitat:
|
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 |
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:
Werde ich denke sowieso machen, denn nur die angebliche Vollversion umfasst zufällige Spielfelder.
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!). 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. |
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