Autor Beitrag
pupu
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 104

WinXP
Borland Delphi 7, Turbo Pascal 7
BeitragVerfasst: So 06.08.06 15:09 
Hi...ich hab eine ganz bescheidene Frage... und zwar hab ich ein TicTactoe programmiert :zustimm: :wink: zwar noch ziemlich schlecht aber is halt noch in der Aufbauphase :wink:

Nu hab ich aber ma wieder mein typisches Problem, und zwar, dass mein Code ma wieder viiiiiiiiel zu kompliziert ist und viel zu lang...(479 Zeilen is eigentlich viel zu viel für so ein Spiel denk ich)

Und nu meine Bitte...könnt ihr euch (wenn ihr ma Langeweile und genug Zeit habt) an meinen Code setzen und den dahingehend optimieren, dass ich weniger viele Zeilen hab? Damit möchte ich niemanden irgendeine Arbeit aufdrücken oder abdrücken, sondern einfach mal wissen, was ich an meinem Styl ändern kann... weil ich weiß dass ich vieles einfach viel zu oft wiederhole und so weiter...
Aber da ich keinene Schimmer hab wie ich meinen Code umschreiben kann, wende ich mich hoffnungsvoll an euch :wink:

Wer kein Bock darauf hat (was ich voll und ganz verstehen kann) könnte mir aber hier trotzdem vielleicht mal sagen, wass ICH denn ma verbessern kann, ohne dass derjenige sich selbst diese Mühe macht...aber da ich nich sooo viel Ahnung davon hab, wäre es besser wenn den jemand optimieren könnte und erklärt was er verändert hat und warum...das wär RICHTIG geil von euch wenn ihr das machen würdet...

An sich kann wer keine Lust auf das ganze hat ja jemand vllt trotzdem mal das Spiel anschauen und bewerten (obwohl die meiste Kritik wohl negativ ausfallen wird :lol: )..

Danke schonmal
Einloggen, um Attachments anzusehen!
Tilo
ontopic starontopic starontopic starontopic starofftopic starofftopic starofftopic starofftopic star
Beiträge: 1098
Erhaltene Danke: 13

Win7 geg. WInXP oder sogar Win98
Rad2007
BeitragVerfasst: So 06.08.06 15:26 
Hallo,
meine 2 Codeoptimierungen:
a) eine boolsche Variable reicht aus um festzustellen welcher Spieler dran ist.
b) Schmeiss die Tlabels und TFields raus Verwende stattdessen Tbutton.


ZUm Programm ansich:
Ganz nett.
Sinnvoll wäre aber noch einzubauen, das nach dem 9. Click nicht zu schreiben "Spieler sowieso ist dran".
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: So 06.08.06 15:32 
Als erstes mal stimmt die Exe, die du uns geliefert hast, nicht mit dem Code überein. Zweitens muss ich erst diese Zeile:
  ptictactoe in 'ptictactoe.pas' {Form1}; ändern in diese:
ausblenden Delphi-Quelltext
1:
  tictactoe2 in 'tictactoe2.pas' {Form1};					

Da du deine unit einfach so umbenannt hast.
Drittens funktioniert der ganze Code nicht. Beispielsweise klicke ich einmal irgentwo hin, und schon wird eine waagerechte linie angezeigt. Du setzt nämlich im Resetknopf keine einzige Variable zurück. Außerdem tauchen Spalte2 und 3 nie auf, weiterhin wird Spalte1.Visible nicht auf false gesetzt.
Alle Felder sind immer halb verdeckt. Ich sehe immer nur ein halbes O oder ein halbes X.
Und dann fällt mir ein Tipp zum verringern der Zeilen ein: Schreib die Abfragen, ob jemand gewonnen hat, in eine eigene Procedure und ruf sie nach jedem Klick auf. Und schreib für alle 9 Felder nur eine Procedure, das geht so:
Setze bei jedem Feld die Eigenschaft Tag auf die Feldzahl. Bei Feld1 also Tag:=1 bei Feld2 Tag:=2; etc. Dann schreibst du folgendes:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
Procedure TForm1.Feld1Click(Sender: TObject);
Begin
    (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel).Visible := true;
    If kreuz Then
    Begin
        (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel.Caption := 'X';
        kreuz := false;
    End
    Else
    Begin
        (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel.Caption := 'O';
        kreuz := true;
    End;
    CheckIfWeHaveAWinner; //Deine selbstgeschriebene Procedure zum auf Spielende prüfen
End;

Und nun gib allen Feldern diese Procedure (Objektmanager -> Ereignisse -> onClick in der DropDown liste Feld1Click auswählen). Damit sparst du dir alle anderen Proceduren Feld2Click - Feld9Click.
Wenn du es dir noch einfacher machen willst, lass einfach alle Images weg und nenn die Labels Feld1-9, dann sparst du dir viel: (FindComponent('Label'+IntToStr((Sender as TImage).tag)) as TLabel).Visible := true; wird zu (Sender as TLabel).Visible := true;

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
pupu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 104

WinXP
Borland Delphi 7, Turbo Pascal 7
BeitragVerfasst: So 06.08.06 15:48 
aaaaaaaaaaaaaaaaaaaaaaaaaaaaaahhhhhhhhhhhhhhh

*mist*escheißescheiße (sorry)

Hab die original Source gelöscht...hatte vorher einige dateien mit dem namen "tictactoe" und "tictactoe2" in dem ordner...
hab alle dateien mit "tictactoe" gelöscht...aber irgendwie hab ich das so *mist*e gespeichert, dass die source zu "tictactoe2" "tictactoe.pas" hieß...die ich nun leider gelköscht hab...die source zu "tictactoe" is denn "tictactoe2.pas" gewesen (aus welchem grund auch immer ich son mist gebaut hab)...ich versuch ma n "recoverytool zu installieren...vllt bekomm ich die datei ja noch ma wieder :cry: :cry: :cry: :cry:
systemwiederherstellung bringt da wohl nix oder?

es war auf jeden fall das letzte was ich gelöscht hatte...

also bitte vorerst diesen thread schließen oder so...weil das hat ja keinen sinn, weil euch die falsche source vorliegt :x :x :x

aber trotzdem nochma zu dir tilo...

1. bei meiner gelöschten source hab ich die variable kreuz vom typ boolean benutzt um zu erkennen, wer dran is...so wurde nach jedem zug von "O" die variable kreuz auf true gesetzt, sodass man erkennen kann ob kreuz dran war oder nich

2. das hab ich vom sinn her nich verstanden mit den TFields und Tbuttons und so :wink:

@jayEff jetzt weißt du warum das ganze nich klappt...in dem eigentlichen code benutze ich ja panels...ich hab ja nur die falsche .pas dabei
Chryzler
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 1097
Erhaltene Danke: 2



BeitragVerfasst: So 06.08.06 16:21 
Ich hab ihn mal ein bisschen optimiert.
Einloggen, um Attachments anzusehen!
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 07.08.06 01:44 
Nicht schlecht! Ich glaub, das macht ein Recovery tool überflüssig, denn der Code funktioniert einwandfrei.
Und er ist schon sehr weit optimiert, es ist auf eine wesentliche Procedure gekürzt! Nun müsste man im Siegfall die Labels "unklickbar" machen. Vielleicht eine Boolean, die vor dem Klickereignis abgefragt wird.

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Di 08.08.06 15:12 
So, ich hab dann mal noch ein paar letzte Kleinigkeiten verbessert...auch mal ein paar Dokuzeilen eingefügt...nur um das schneller zu lesen...für den ein oder anderen...

1) X kann O nicht mehr vom Feld schupsen und umgekehrt
2) bei Gewonnen ist das Bedienen der Felder net mehr möglich
3) mal noch ein Beende-Button eingefügt

@Edit : Wer beim compilieren Probleme hat, der sollte mal unter uses Variants einfügen.
Einloggen, um Attachments anzusehen!
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Di 08.08.06 19:04 
Mmh...ich hatte mal noch etwas Langeweile...hab damit noch etwas rumgespielt.

Die Länge des Quellcodes kann man nur schwer verkleinern, (so dass er auch noch lesbar bleibt !).

1) Anzeige, wer gewonnen hat
2) Dokumentation erweitert
3) Felder etwas vergrößert
Einloggen, um Attachments anzusehen!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Mi 09.08.06 00:08 
sorry, der code stimmt nicht. nach einer manuellen eingabe muss zumindest die andere seite dran sein, und nicht, wenn man nicht dran denkt und den eigenen zug macht, dass plötzlich ein "verkehrter spieler" auftaucht. bitte korrigieren. danke.
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Mi 09.08.06 09:35 
Ok, dann hab ich mal noch schnell eine Anzeige eingebaut, die dir sagt, welcher Spieler am Zug ist... :)
Einloggen, um Attachments anzusehen!
pupu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 104

WinXP
Borland Delphi 7, Turbo Pascal 7
BeitragVerfasst: Mi 09.08.06 15:09 
ok dazu hab ich n paar Fragen...

1. Was sind die "Shapes"???
2. kann mir jemand detailliert erklären was genau püassiert wenn man auf "Reset" klickt?
3. Was hat es mit der prozedur "LabelClick" auf sich? habt ihr die dazugeschrieben? oder kann man die unter Events irgendwo hinzufügen? könnt ihr mir das nochmal erklären, wie durch einen Klick auf IRGENDEIN label die gesamte Hauptprozedur aufgerufen wird?
das is immer mein problem, dass ich jede möäglichkeit haarklein in eine neue Prozedur pack und so der Code viel zu lang und unübersichtlich wird

-geändert-
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Mi 09.08.06 16:58 
Zu 1) Hilfe Delphi

"Die Komponente TShape dient dazu, in einem Formular eine geometrische Figur darzustellen.

Beschreibung

Mit Hilfe eines TShape-Objekts lassen sich einfache geometrische Figuren in ein Formular einfügen. TShape führt Eigenschaften ein, welche die Gestaltung des Umrisses sowie der Füllung beschreiben."

Besser kann ich es auch nicht formulieren. Dient nur zum Aussehen der Rechtecke ! Bei TTT ist das recht praktisch. Über diesen Shapes werden Label gelegt. Diese Labels besitzen eine OnClick Event, denen du eine Funktion zu weisen kannst. Hier die Funktion "LabelClick". (siehe Objektinspector -> Ereignisse)

Zu 3)
Man könnte natürlich zu jedem Label ein eingen OnClick - Funktion schreiben. Sicher müsste man hier nicht prüfen, wenn du das Feld 1 (links oben) drückst, ob unten 7 8 9 jemand gewonnen hat...usw.
Da aber die Labels im Großen und Ganzen das selbe machen, kann man hier nur eine Funktion schreiben. Diese eine Funktion ist zwar etwas länger, aber der gesamte code wird evtl. kürzer.
Dieser Funktion muss man natürlich das Feld übergeben...Nummer...ID....Tag, um dann Unterscheidungen zu machen...

Ich sag es mal so....du hast ein Stück Kuchen und es gibt 3 Personen die nur auf den Startschuß warten ihn zu essen. Du bist der jenige welcher den Personen dies sagen kann. Die "Funktion" : "Iss den Kuchen" ist im Endefekt die selbe...nur wer den Kuchen ißt...das bestimmst du, indem du sagst "Maier iss den Kuchen"...
Also ONClick Feld 1 oder Feld 2 oder Feld 3...was da passiert ist das selbe...es wird zum "X"...

Diese Entscheidung wird hier mit "FeldClick(TLabel(Sender));" gemacht, also mit dem übergebenen Parameter.

Zu 2)

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
procedure TForm1.Reset_btnClick(Sender: TObject);
    var
    i : Integer;
    l : TLabel;
  begin
    for i := 1 to 9 do
      begin
        l := TLabel(FindComponent('Label' + IntToStr(i)));
        l.Font.Color := clBlack;
        l.Caption := '';
      end;
    gewonnen := false;
    if Kreuz = true then
      begin Edit1.Text := 'X ist am Zug'end
    else
      begin Edit1.Text := 'O ist am Zug'end;
    Edit2.Text := '';
  end;


(Keinen Kommentar zu "in der if-Scheife und in der else-Schleife kann man aber begin und end weglassen"... Danke)

Tja was macht die Funktion :

In der For - Schleife werden alle 9 Felder zurückgesetzt. In der 1. Zeile werden alle Labels l zu gewiesen und dann werden z.B. mit Label1.Font.Color die Schriftfarbe wieder auf schwarz gesetzt (da ja evtl. rot geworden ist) und dann wird die Caption geleert, also X und O verschwinden.

Tja was gehört noch zu einer "Resetfunkion" :

Gewonnen wird auf false gesetzt und Edit2 (hier das Gewinneranzeigefeld) wird geleert. Kreuz sagt aus ob X oder O dran ist...ist Kreuz true dann wird als nächstest ein X gesetzt...also muss in der Edit1 - Anzeige "X ist am Zug" stehen.

Moderiert von user profile iconChristian S.: Delphi-Tags hinzugefügt
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Mi 09.08.06 17:09 
Hoffe den Quellcode kann man noch lesen...wenn nicht dann einfach mal runterladen...etwas höher...
Hoffe ich könnte dir etwas helfen...bin nicht so tolle im erklären...aber wegen deinen Prog-Problem, da kann ich nur eins sagen "Übung macht den Meister" ! :)
pupu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 104

WinXP
Borland Delphi 7, Turbo Pascal 7
BeitragVerfasst: Mi 09.08.06 19:58 
alles klar danke sehr...

ich wusste gar nich, dass man das ganze so einfach übergeben kann... Hatte mich bei der Programmierung die ganze Zeit gefragt wie man die einzelnen Labels jeweils einfach übergeben kann...aber dass es sooo einfach geht hätt ich nich gedacht :)

Das is es immer bei mir. Ich weiß noch nicht wie ich Delphi am besten nutzen kann um optimalen Code zu bekommen...aber das kommt denk ich ma...spätestens nach den 2 Jahren 4-Wochenstunden Informatikuntericht als Vorbereitung auf meine mündlich Abiturprüfung in Informatik :lol:
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Do 10.08.06 11:18 
:)
Das ist ja auch das Problem, heute als Einsteiger wirst du erschlagen mit den ganzen Methoden und Eigenschaften der Tools die dir schon standardmäßig zur Verfügung stehen...

Hab damals mit TurboPascal in der Schule angefangen, das war noch etwas einfacher...ach ja...
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Do 10.08.06 14:35 
user profile iconPlaton hat folgendes geschrieben:
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
{------------------------------------------------------------------------------}
Procedure TForm1.Reset_btnClick(Sender: TObject);
Var
    i: Integer;
    l: TLabel;
Begin
    For i := 1 To 9 Do
    Begin
        l := TLabel(FindComponent('Label' + IntToStr(i)));
        l.Font.Color := clBlack;
        l.Caption := '';
    End;
    gewonnen := false;
    If Kreuz = true Then
        Edit1.Text := 'X ist am Zug'
    Else
        Edit1.Text := 'O ist am Zug';
    Edit2.Text := '';
End;


Mit Delphitags kann mans sicher besser lesen, als ohne.
user profile iconPlaton hat folgendes geschrieben:
(Keinen Kommentar zu "in der if-Scheife und in der else-Schleife kann man aber begin und end weglassen"... Danke)

Yo.. Ich hab sie einfach weg gemacht. was soll das? :shock: Sind übrigens keine Schleifen sondern Abfragen. Wenn, dann wärens for- oder while- Schleifen.
Hab auch die Formatierung überarbeitet, bzw. mal den sourceFormatter drüberlaufen lassen ...

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Mo 14.08.06 16:20 
Dann Danke für die Aufklärung was Schleifen und Abfragen sind !

Jeder hat so seinen eigenen Programmierstil. Wem es nicht passt, der regt sich halt auf !? Was soll's !?
JayEff
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 2971

Windows Vista Ultimate
D7 Enterprise
BeitragVerfasst: Mo 14.08.06 16:22 
keep cool, passt ja soweit :mrgreen: Ich glaub das Thema is erledigt, dann... oder? ^^

_________________
>+++[>+++[>++++++++<-]<-]<++++[>++++[>>>+++++++<<<-]<-]<<++
[>++[>++[>>++++<<-]<-]<-]>>>>>++++++++++++++++++.+++++++.>++.-.<<.>>--.<+++++..<+.
pupu Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 104

WinXP
Borland Delphi 7, Turbo Pascal 7
BeitragVerfasst: Di 15.08.06 12:53 
bin grad dabei etwas ähnliches Programmiert mit vielen Labels, denen jeweils ein OnClick-Event zugefügt wird. Aber ich habs immer noch nich so ganz verstanden.

1.Also ist die Funktion "LabelClick(Sender: TObject);" selbst geschrieben? oder aus einem festgelegten Event heraus?

Woher erkennt das Programm dann dass es bei jedem Label diese Prozedur ausführen soll? an dem "Label" in dem Prozedurnamen?

2.FeldClick(TLabel(Sender)); : wird also das jeweilige Label im "TLabel" an die Prozedur "TForm1.FeldClick(var Feld: TLabel);" Was hat das "Sender" darin für eine Aufgabe?
Platon
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 42

WinXP, Windows 7
Delphi 5 Enterprise, Delphi 2005 Architect, Delphi 2007 Prof., Delphi 2010 Prof., Delphi XE2 Prof., Visual C++ 6.0, LabView 7.1, SPS
BeitragVerfasst: Di 15.08.06 17:30 
Die Funktion "LableClick" schreibst du selber !
Bei einer Funktion, die du später einem Event (z.B. OnClick) zu weisen willst, musst du der Funktion den Sender vom Typ TObject übergeben.

Wenn du nun selber den "Sender" auswerten willst, also die Funktion noch anderen OnClick - Events zuweisen willst, kannst du mit z.B. "TLabel(Sender)" -> Label3 oder "TButton(Sender)" -> Button4 den Button/Label bestimmen und auswerten.

Im Objektinspector kannst du dann die Funktion dem Event/den Events zuweisen.