Autor |
Beitrag |
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Mo 11.01.10 23:58
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 12.01.10 00:11
Jop, da war nen Fehler von mir, daher habe ich von 1 auf 3 gewechselt
Redundanzen musste ich erst mal googln
Eigentlich macht Delphi doch noch Spaß  Zumindest, wenn etwa klappt.
--- Moderiert von Narses: Beiträge zusammengefasst---
Komisch, jetzt wird nur noch nach der gebrauchten Zeit sortiert und nicht die Bedingung
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if (Item1.Data = Item2.Data) then Compare := CompareText(Item1.SubItems[3],Item2.SubItems[3]) else Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); end; |
scheint nicht mehr zu funktionieren?
Apropo welches SubItems ist den was?
So wie ich es hier geschrieben habe:
[1] ist doch Benötigte Zeit?
[0] Name
[2] Paare
[3] Fehlversuche
[4] Datum
?
Habe es wohl nun so gefixt:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if (Item1.Data = Item2.Data) then Compare := CompareText(Item2.SubItems[2],Item1.SubItems[2]) else Compare := CompareValue(Integer(Item1.Data),Integer(Item2.Data)); end; |
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 12.01.10 00:51
Moin!
Vorschlag hat folgendes geschrieben : | Komisch, jetzt wird nur noch nach der gebrauchten Zeit sortiert und nicht die Bedingung |
Wonach auch immer du sortieren willst, das musst du schon selbst wissen.
Vorschlag hat folgendes geschrieben : | Apropo welches SubItems ist den was? |
Bei einem TListItem ist die erste Spalte die .Caption-Eigenschaft des TListItems, die 2. Spalte ist das erste .SubItem. also .SubItems[0], etc.pp.
Vorschlag hat folgendes geschrieben : | So wie ich es hier geschrieben habe: |
Mit der Erläuterung und dem Code, in welcher Reihenfolge du die Elemente anlegst, solltest du wohl selbst drauf kommen können.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 12.01.10 16:31
Wie erstelle ich einen 2 Spieler Modus?
Wie verschwinden die gefundenen Paare?
Edit: Das Verschwinden habe ich hinbekommen.
Den 2-Spieler Modus leider nicht.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 12.01.10 17:23
Moin!
Vorschlag hat folgendes geschrieben : | Wie erstelle ich einen 2 Spieler Modus?
[...]
Den 2-Spieler Modus leider nicht. |
Öhm, 2 Spieler beim Memory?  Wie soll das ablaufen?
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 12.01.10 17:27
Also 2 Spieler habe ich schon.
Ich soll nur noch für die einzelnen Spieler die gefundenen Pärchen zählen-.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15:
| else begin if LbSpieler.Caption= 'Spieler 1' then begin GameState := gsOpenCards2; LbSpieler.Caption:= 'Spieler 2'; Moves := Moves +1; ShowMessage('Spieler 2 ist an der Reihe.'); end else begin GameState := gsOpenCards2; Moves := Moves +1; ShowMessage('Spieler 1 ist an der Reihe.'); LbSpieler.Caption:= 'Spieler 1' end; end; |
Also Points irgendwie verdoppeln?
|
|
Horschdware
      
Beiträge: 744
Erhaltene Danke: 54
Win XP Pro, Win 7 Pro x64
Delphi 7, Delphi XE, C++ Builder 5, SAP R/3
|
Verfasst: Di 12.01.10 17:41
_________________ Delphi: XE - OS: Windows 7 Professional x64
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 12.01.10 17:45
Moin!
Horschdware hat folgendes geschrieben : | Zwei Spieler wechseln sich mit Aufdecken ab. Wer einen Treffer landet ist nochmals dran. Sieger ist, wer mehr Paare aufgedeckt hat. |
Ah, ist natürlich eine Möglichkeit.
Vorschlag hat folgendes geschrieben : | Also Points irgendwie verdoppeln? |
Ja, genau so.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 12.01.10 17:48
Und wie implentiere ich es, dass die bei LbSpieler1 und LbSpieler2 die abwechselnd eins zunehmen?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 12.01.10 17:57
Moin!
Du musst dir in einer weiteren Variablen merken, wer gerade dran ist.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Di 12.01.10 17:58
Hi
Du brauchst eine Variable, in der du dir merkst, welcher Spieler am Zug ist. Jede Stelle, an der du Punkte, Zeit o.ä. des Spielers anpasst, muss nun zuerst prüfen, welcher Spieler am Zug ist. Dann veränderst du entsprechend ausschließlich Zeiten und Punkte dieses Spielers.
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 12.01.10 19:10
Okay, habe eine Variable.
Es funktioniert nun auch schon, dass Spieler 1 und Spieler 2, wenn sie dran sind, Punkte für gefundene Paare bekommen.
Ich muss nun nur noch einfügen, dass nur der Sieger sich in die Highscoreliste eintragen kann und das der Gewinner automatisch ermittelt wird 
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 18.01.10 19:28
Das mit dem Highscore sortieren verstehe ich immer noch nicht ganz.
Ich habe:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11:
| with Form2.lvHighscore.Items.Add do begin Caption := EdName.Text; SubItems.Add(Form1.LbGebrauchteZeit.Caption); SubItems.Add(IntToStr(Points)); SubItems.Add(IntToStr(Moves)); SubItems.Add(DateTimeToStr(Now)); Data := Pointer(Moves); end; Form2.lvHighscore.Items.EndUpdate; Form2.ShowModal; end |
Soll nach der Anzahl von Zügen sortiert werden beim Eintragen
daher
Delphi-Quelltext 1:
| Data := Pointer(Moves); |
und die Highscoreliste hat noch:
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if (Item2.SubItems[1] = Item1.SubItems[1]) then Compare := CompareText(Item1.SubItems[2],Item2.SubItems[2]) else Compare := CompareValue(Integer(Item2.SubItems[1]),Integer(Item1.SubItems[1])); end; |
Sprich, wenn die Anzahl der Paare gleich sind, dann wird doch nach gebrauchten Runden sortiert?
Meine Tabelle sieht so aus:
Name: .Caption
Benötigte Zeit: SubItems[0]
Paare: SubItems[1]
Runden: SubItems[2]
Datum: SubItems[3]
Wieso wird die Highscoreliste nicht richtig sortiert?
Hier mal mein aktueller Stand: (siehe Anhang)
--- Moderiert von Narses: Beiträge zusammengefasst---
Also irgendwie ist da wieder komplett der Wurm drinnen. Die Highscoreliste sortiert nun überhaupt nur noch nach Lust und Laune?!?
Morgen ist Abgabe
Moderiert von Narses: Gelöschten Anhang wiederhergestellt.
Einloggen, um Attachments anzusehen!
Zuletzt bearbeitet von Vorschlag am Di 19.01.10 16:49, insgesamt 1-mal bearbeitet
|
|
Hidden
      
Beiträge: 2242
Erhaltene Danke: 55
Win10
VS Code, Delphi 2010 Prof.
|
Verfasst: Mo 18.01.10 22:21
Hi
Welche Version von Delphi verwendest du? Die neueren haben die Möglichkeit der Projektwiederherstellung, das wäre ievlleicht Mal einen Blick wert.
Beim durchscrolen des Quelltextes sehe ich ein with-Statement. Schlüssle das mal auf, with sorgt eigentlich meiner Erfahrung nach nur für Ärger.
So, ich entschuldige mich jetzt mal ins Bett. Bin krank
mfG,
_________________ Centaur spears can block many spells, but no one tries to block if they see that the spell is a certain shade of green. For this purpose it is useful to know some green stunning hexes. (HPMoR)
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Mo 18.01.10 22:33
Das Zurücksetzen bringt leider nicht viel.
Da anscheinend die Highscoreliste davor auch schon nicht funktioniert hat. Also die Sortierung nach gebrauchter Zeit ging ohne Probleme. Aber bei gleicher Zeit zusätzlich nach gebrauchten Runden zu sortieren ging wohl nie
Jetzt will ich es aber ja eh komplett anderst sortieren lassen und zwar nach gefundenen Paaren und falls diese gleich sind nach gebrauchten Runden.
Brauche mehr oder weniger nen quick fix für morgen 
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.01.10 00:21
Moin!
Vorschlag hat folgendes geschrieben : | Das Zurücksetzen bringt leider nicht viel. |
So ist es, der Fehler steckt im Detail.
Vorschlag hat folgendes geschrieben : | Jetzt will ich es aber ja eh komplett anderst sortieren lassen und zwar nach gefundenen Paaren und falls diese gleich sind nach gebrauchten Runden. |
Wenn du den .Data-Wert der TListItems gar nicht verwendest, brauchst du ihn auch nicht zuweisen, mal so nebenbei.
Vorschlag hat folgendes geschrieben : | Brauche mehr oder weniger nen quick fix für morgen  |
Wenn ich mir so deinen Projekt-Quelltext ansehe, dann muss ich leider sagen, dass du nicht die blasseste Ahnung hast, was du da tust.
Da man das aber auch nicht in ein paar Minuten nachholen kann, was man in Wochen Info-Unterricht versäumt hat, kann ich dir "auf die Schnelle" leider nicht mehr helfen. Ich zeige dir deshalb nur noch die Fehlerstellen, wenn du das bis morgen nicht selbst behoben bekommst, dann ist das auch ganz einfach "deine Leistung".
Dann fangen wir mal an:  - Wenn man bereits das 2. Spiel startet, hat man keine Memory-Karten mehr, woher soll man wissen, was man da suchen muss?
Delphi-Quelltext 1:
| if EPoints.Text > EPoints2.Text | Dieser Vergleich kann (grundsätzlich) nicht richtig sein, da hier Texte verglichen werden, es geht aber um Zahlen. Da diese - zum Glück für Dich - nicht größer als 9 werden können (mehr Paare gibt´s in meiner Memory-Version nicht), spielt das aber keine Rolle. Durch die Lehrer-Brille gesehen heißt das aber: du hast das nicht verstanden. Denn: füge ein weiteres Paar hinzu, und es klappt nicht mehr.
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8:
| with Form2.lvHighscore.Items.Add do begin Caption := EdName.Text; SubItems.Add(Form1.LbGebrauchteZeit.Caption); SubItems.Add(IntToStr(Points)); SubItems.Add(IntToStr(Moves)); SubItems.Add(DateTimeToStr(Now)); Data := Pointer(Moves); end; |
- Was ist denn, wenn Spieler 2 gewonnen hat?
- Spieler 1 und 2 haben die gleiche Anzahl Züge?
- Da du den .Data-Wert nicht zum Sortieren benötigst, kann du die - logisch völlig falsche - Zuweisung weglassen.
Delphi-Quelltext 1: 2: 3: 4: 5: 6:
| procedure TForm2.LoadHighscores; [...] with lvHighscore.Items.Add do begin Caption := Zeile.Strings[0]; Data := Pointer(StrToIntDef(Zeile.Strings[1],0)); SubItems.Add(IntToStr(Integer(Data))); | Ich dachte, danach wolltest du nicht mehr sortieren?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9:
| procedure TForm2.lvHighscoreCompare(Sender: TObject; Item1, Item2: TListItem; Data: Integer; var Compare: Integer); begin if (Item2.SubItems[1] = Item1.SubItems[1]) then Compare := CompareText(Item1.SubItems[2],Item2.SubItems[2]) else Compare := CompareValue(Integer(Item2.SubItems[1]),Integer(Item1.SubItems[1])); end; | - Erneut vergleichst du Zahlen in Textdarstellung, das kann nicht richtig sein.
- Integer(StringVar) liefert nicht etwa die numerische Darstellung einer Zahl im Textformat, sondern ist ein sinnloser Typecast. Lehrerbrille: ganz heftig keine Ahnung...
 Fazit: Kein Wunder, dass deine Highscoreliste nicht richtig sortiert, du sortierst ja auch nicht nach den richtigen Werten. 
Viel Glück morgen!
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 19.01.10 09:21
Delphi-Quelltext 1:
| Compare := CompareValue(Integer(Item2.SubItems[1]),Integer(Item1.SubItems[1])); |
Aber hier wird doch nicht nach dem Textverglichen sondern nach dem Wert?
CompareValue und Integer sind doch ganzzahlige Zahlen?
Habe heute noch 2 Stunden Zeit, möglichst viel zu fixen
Delphi-Quelltext 1:
| Data := Pointer(Moves); |
Data spricht dann also mehr oder weniger auch die 2 Spalte des Highscores an und das würde mit Moves keinen Sinn machen?
Was wäre, wenn ich einfach den Highscore ein bisschen ändere, sodass Gebrauchte Zeit und gefundene Paare vertauscht werden?
Wäre denke ich einfacher?
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.01.10 12:25
Moin!
Vorschlag hat folgendes geschrieben : | Delphi-Quelltext 1:
| Compare := CompareValue(Integer(Item2.SubItems[1]),Integer(Item1.SubItems[1])); | Aber hier wird doch nicht nach dem Textverglichen sondern nach dem Wert?
CompareValue und Integer sind doch ganzzahlige Zahlen? |
CompareValue() hat auch eine überladene Version für Integer-Zahlen, das ist richtig. Dein Code vergleicht zwar Integerzahlen, aber nicht die, die du verglichen haben möchtest.  - ItemX.SubItems[y] ist ein String.
- Integer() erzwingt eine Umwandlung in eine Integerzahl, allerdings ohne die Daten selbst zu verändern. Auf einen String angewendet liefert Integer(StringVar) die Adresse der Stringdaten auf dem Heap.
- Du möchtest allerdings etwas ganz anderes: die Zahl, die als Text in dem String steht, in einen Integer konvertieren. Das geht aber nicht mit einem Typecast! (Ich sage ganz bewusst nicht, wie man es richtig macht, denn ich möchte rausfinden, ob du etwas von dem, was du da tust, verstanden hast. Witzigerweise verwendest du den richtigen Ansatz bereits im Code, aber ich fürchte, du hast nicht verstanden, warum.
)
Vorschlag hat folgendes geschrieben : | Delphi-Quelltext 1:
| Data := Pointer(Moves); | Data spricht dann also mehr oder weniger auch die 2 Spalte des Highscores an und das würde mit Moves keinen Sinn machen? |
"Data" spricht überhaupt nichts an, es ist eine Eigenschaft. Man kann sie verwenden (z.B. zum Sortieren) oder auch nicht. In deinem Fall kannst du diese Zeile(n) komplett weglassen, weil du eine eigene Vergleichsmethode verwendest, um die Werte zu sortieren. Und in dieser verwendest du die Eigenschaft .Data gar nicht (mehr), deshalb ist das komplett unnötig.
Zur Erläuterung: auch hier wird die Adresse der Stringdaten auf dem Heap geliefert, und nicht der Integer-Wert der Zahl in Stringdarstellung.
Vorschlag hat folgendes geschrieben : | Was wäre, wenn ich einfach den Highscore ein bisschen ändere, sodass Gebrauchte Zeit und gefundene Paare vertauscht werden?
Wäre denke ich einfacher? |
Nein, da es das Problem nicht behebt.
cu
Narses
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Vorschlag 
      
Beiträge: 63
|
Verfasst: Di 19.01.10 13:33
Mal noch eine andere Frage, gibt es einen Befehl, alle Images anzusprechen?
Delphi-Quelltext 1: 2: 3: 4: 5: 6: 7: 8: 9: 10: 11: 12: 13: 14: 15: 16: 17: 18:
| Image1.Visible:= true; Image2.Visible:= true; Image3.Visible:= true; Image4.Visible:= true; Image5.Visible:= true; Image6.Visible:= true; Image7.Visible:= true; Image8.Visible:= true; Image9.Visible:= true; Image10.Visible:= true; Image11.Visible:= true; Image12.Visible:= true; Image13.Visible:= true; Image14.Visible:= true; Image15.Visible:= true; Image16.Visible:= true; Image17.Visible:= true; Image18.Visible:= true; |
umd dies alles in einen Befehl zu ändern`?
Das Highscore Problem löse ich halt nur dirty  Also lasse es nur nach gebrauchter Zeit sortieren.
|
|
Narses
      

Beiträge: 10183
Erhaltene Danke: 1256
W10ent
TP3 .. D7pro .. D10.2CE
|
Verfasst: Di 19.01.10 13:55
_________________ There are 10 types of people - those who understand binary and those who don´t.
|
|
Dieses Thema ist gesperrt, Du kannst keine Beiträge editieren oder beantworten.
Das Thema wurde von einem Team-Mitglied geschlossen. Wenn du mit der Schließung des Themas nicht einverstanden bist, kontaktiere bitte das Team.
|
|