Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Highscore (https://www.delphipraxis.net/7653-highscore.html)

Gregor00 18. Aug 2003 14:09


Highscore
 
Hallo Leute

bin mir nich ganz sicher ob mein Problem in dieses Forum gehört bin noch neu hier :shock:
Also mein problem is Folgendes: ich bin grad dabei nen kleines Spiel zu proggen und will auch ne Highscore hinzufügen: Aber diese funktioniert einfach nicht so wie sie soll. Ich will sie mit einer Listbox realisieren, also name und Punktzahl in einer Listbox. Ohne die namen währe es ja kein problem, aber da die Namen ja Strings sind funktionieren die Sortieralgorithmen logischerweise nicht.
Also lautet meine frage: Löse ich dieses prob?? Vielleicht gibt es ja auch einfachere möglichkeiten (nicht mit einer Listbox), wenn ja, welche wären das??

Also vielen Dank schon mal für alle antworten 8)
gregor

Marco Haffner 18. Aug 2003 14:15

Re: Highscore
 
Nimm eine TListView und setze ViewStyle auf vsReport.

neolithos 18. Aug 2003 14:16

Re: Highscore
 
Halte die Daten doch in einer Liste von Records / Klassen (TList, TObjectList).

Diese Klassen haben eine anpassbare Sortier-Funktion.

Die Daten würde ich per Owner-Data-List darstellen um rudimentäre Daten zu vermeiden.

+ Owner-Draw zur Verschönerung weil es ja ein Spiel werden soll.

Gregor00 18. Aug 2003 15:24

Re: Highscore
 
@ marco Haffner

Danke schon mal für den Tipp, ich komm aber mit der TListView net ganz klar. Ich hab mit der noch nie gearbeitet (lern Delpi erst seid 2 Jahren in der schule) und die Online- Hilfe konnte mir auch nicht wirklich helfen. :roll:
Kannst du (oder jemand anderes) mir nochmal genauere Anweisungen geben??

@ neolithos
Auch danke für die Hilfe, die Möglichkeit finde ich aber irgentwie zu kompliziert, da muss es doch was einfacheres geben....

cu
gregor

Tpercon 18. Aug 2003 15:31

Re: Highscore
 
Hier mal schnelkl das Einfügen eines Eintrages im ListView:
Delphi-Quellcode:
var ListItem: TListItem;
begin
  ListItem := ListView.Items.Add;
  ListItem.Caption := 'Caption';
  ListItem.SubItems.Add('1. SubItem');
Sowas müßte aber eigentlich in der OH zu finden sein. Ansonsten wirst du auch hier im Forum fündig.

Gregor00 18. Aug 2003 16:13

Re: Highscore
 
ok danke Tpercon, hast mir sehr geholfen.
Sorry wenn ich nerve, aber alles ist jetzt immernoch nicht ganz klar:
Ich weiß nicht wie ich einträge Sortieren soll. Ich mein jetzt nicht die Namen sondern die "Untertitel" der Namen, welche die gewonnene Punktzahl darstellen sollen. ich hab#s schon selber versucht bekomme aber immer nur ne Zugriffsverletztung.... als ergebnis :oops:

Alexander 18. Aug 2003 16:20

Re: Highscore
 
Kuck dir mal den Source auf der Seite an:
http://www.swissdelphicenter.ch/de/showcode.php?id=1103

Da steht zwar noch etwas mehr, sollte dir aber dennohc helfen :mrgreen:

Gregor00 18. Aug 2003 16:43

Re: Highscore
 
hab mir grad den link angesehen.. sieht ja wahnsinnig kompliziert aus...
versteh ich fast kein wort von.
Da muss es doch noch ne viel einfachere Möglichkeit geben, z.B. mit den ganz normalen Sortieralgorithmen. oder geht das etwa nicht???

kiar 18. Aug 2003 17:39

Re: Highscore
 
versuche mal das , damit wird bei einem klick auf column sortiert
Delphi-Quellcode:
procedure TForm1.listview1ColumnClick(sender:TObject;Column:TListColumn);

begin
    ColumnToSort := Column.Index;
    (Sender as TCustomListView).AlphaSort;

end;

procedure TForm1.ListView1Compare(Sender: TObject;
              Item1, Item2: TListItem;
                                  Data: Integer;
                                  var Compare: Integer);
var
  i:integer;
begin
       if ColumnToSort = 0 then
          Compare := CompareText(Item1.Caption,Item2.Caption)
       else begin
          i := ColumnToSort - 1;
          Compare := CompareText(Item1.SubItems[i],Item2.SubItems[i]);
  end;
end;
[edit=Daniel B]Delphi-Tags korrigiert Mfg, Daniel B[/edit]

Alexander 18. Aug 2003 19:08

Re: Highscore
 
Zitat:

hab mir grad den link angesehen.. sieht ja wahnsinnig kompliziert aus...
versteh ich fast kein wort von.
Da muss es doch noch ne viel einfachere Möglichkeit geben, z.B. mit den ganz normalen Sortieralgorithmen. oder geht das etwa nicht???
Ich habe ja gesagt, dass es etwas mehr ist als du willst. Hätte aber man bestimmt hinbiegen könenn.
Schließlich lernt man ja auhc daraus.

Gregor00 18. Aug 2003 19:24

Re: Highscore
 
@ alexander

klar lernt man daraus, aber nur wenn man es auch versteht und man nach einer weile erfolge verbuchen kann. Wenn man jedoch stundenlang vor dem monitor sitzt, sich seitenweise die online- hilfe durchliest und am ende immernoch nichts dabei rauskommt ist das schon ein bisschen demmotivierend, oder etwa nicht??

ok dank eurer hilfe funktioniert das sortieren jetzt ganz gut (vor allem dank kiar)

jetzt stellt sich jedoch noch die frage wie ich das realisiere nicht auf die einzelnen Columns zu klicken, sondern per Button die Column sortiert werden... einfache anweisungen á la " Button1.Click " funktionieren (natürlich) nicht (wär ja auch zu schön gewesen) :twisted:

Tpercon 18. Aug 2003 19:29

Re: Highscore
 
In der OnClick Prozedure des Buttons schreibst du einfach
Delphi-Quellcode:
ColumnToSort := 1;
ListView1.AlphaSort;

Gregor00 19. Aug 2003 09:58

Re: Highscore
 
oki thx Tpercon

jetzt vertehe ich bloß nicht so ganz wie ich die einzelnen "Subitems" direkt ansprechen kann. schließlich muss ich die niedrigste punktzahl der Highscore mit der vom spieler erreichten Punktzahl vergleichen..
Ich würde das gern mit ner " If ... then... else..." - Anweisung machen, hab schon ales mögliche ohne erfolg versucht

bye
greg

Tpercon 19. Aug 2003 10:05

Re: Highscore
 
Es geht ja jetzt nur um die Anzeige im ListView, oder?
Du fügst deine Werte einfach mittels Add... in die ListView ein.
Anschließend sagst du ihm halt mittels ColumnToSort welche Spalte er sortieren soll und dann sortierst du das ganze mittels AlphaSort. Da du ja Integer und keine Strings vergleichen möchtest, mußt du die entsprechende Sort Methode für die Spalte noch anpassen:
Delphi-Quellcode:
  case ColumnToSortLV1 of
    0: Compare := CompareText(Item1.Caption,Item2.Caption);
    1: begin //bzw. die Spalte die die Integer enthält
         ix := ColumnToSortLV1 - 1;
         if CompareText(Item1.SubItems[ix],Item2.SubItems[ix]) = 0 then
           Compare := 0
         else
           if StrtoInt(Item1.SubItems[ix]) > StrtoInt(Item2.SubItems[ix]) then
             Compare := 1
           else Compare := -1;
       end;
    else
      begin
        ix := ColumnToSortLV1 - 1;
        Compare := CompareText(Item1.SubItems[ix],Item2.SubItems[ix]);
      end;
Das müßte dir jetzt gut weiterhelfen, ansonsten frag einfach.

Gregor00 19. Aug 2003 10:23

Re: Highscore
 
thx for answer aber ich mein was anderes, Das Sortieren der einträge funktioniert jetzt ganz gut.
ok, ich beschreib mein prob mal ausfürlicher: Also die SupItems (das sind die Punkte die der entsprechende spieler erreicht hat) werden von der größten zahl (ganz oben auf der ListView) bis zur kleinsten (ganz unten auf der ListView) sortiert, das funktioniert auch. Da ich aber nur eine bestimmte anzahl an namen und Punkten in der HighScore stehen haben will muss halt verglichen werden ob die Punktzahl, die der spieler erreicht hat (werden in einem Label ausgegeben) höher ist als die niedrigste Punktzahl auf der Highscore. wenn ja, dann soll diese höhere punktzahl auf die Highscore gesetzt werden und dementsprechned die niedrigste gelöscht werden (das löschen ist kein problem)
so ich hoffe jetzt ist meine frage deutlicher

cu greg

Alexander 19. Aug 2003 10:29

Re: Highscore
 
Probier das mal so:
Delphi-Quellcode:
if (Label1.Caption > ListView1.Items[ListView1.Items.Count -1].SubItems.Text)
then ShowMEssage('Du bist auf der HighScore!!');
Erklärung:
Es wird das überprüft, ob die Zahl in dem Label größer ist als die letzte Zahl im ersten SubItem.
Nachtrag: Habe es nicht getestet.

Tpercon 19. Aug 2003 10:32

Re: Highscore
 
Füge den Wert einfach in die ListView hinzu, sortiere das und lösche einfach den/ die unteren Einträge!
Delphi-Quellcode:
while ListView1.Items.Count > 10 do begin
  ListView1.Items.Delete(ListView1.items.Count - 1);
end;
Eine andere Möglichkeit wäre (Voraussetzung: ddie Liste ist wirklich sortiert!) das du einfach schaust, wie groß der letzte Wert ist und wenn die neue Punnktezahl größer ist, dann fügst du den in die ListView und löscht den letzten.

Gregor00 19. Aug 2003 11:10

Re: Highscore
 
super danke alex genauso funktioniert es. so ähnlich hab ich es auch versucht...

@ tpercon
hab's bisjetzt auf eine ähnliche weise gemacht aber vielleicht änder ich's auch noch auf deinen Vorschlag um

also vielen dank für die hilfe dank euch funhtioniert mein 'Highscoretestprogramm' jetzt (fast) einwandfrei, jetzt muss ich's nur noch in das richtige spiel einbauen...(mal sehen was na wieder für probleme auftauchen..)

die nächste frage wäre, wie ich die Highscore in eine Datei speicher, aber das versuch ich erstmal selber :lol:

Alexander 19. Aug 2003 11:13

Re: Highscore
 
Als Tip: Inis wären dafür Ideal. So ähnlich aufgebaut (links der Name, rechts die Punkte...):
Code:
[highscore]
name1=500
name2=400

Tpercon 19. Aug 2003 11:16

Re: Highscore
 
Und beim Einlesen schön überprüfen, ob der Schlüssel z.B. name3 bzw. die Section auch wirklich existiert.

Gregor00 20. Aug 2003 21:25

Re: Highscore
 
hi
sorry von inis hab ich noch nie gehört (hört sich aber zu kompliziert für mich an)

also, wie vorhersehbar war, hab ich leichte probleme mit dem speichern der Highscore. ich erzeuge zwar eine datei (Typ: Integer, weiß nicht so genau ob das richtig is) aber jedes mal wenn ich sie in einer zweiten ListView darstellen will, erscheint nichts in dieser zweiten ListView
(Das Prog läuft aber, kein Compilierfehler). Ich hab keine Ahnung was ich falsch mache, aber so einfach wie mit einer ListBox (also eine einfache textdatei) isses warscheinlich nicht, oder??
ok, ich hoffe ihr könnt mir irgentwie weiterhelfen (auf möglichst einfachem wege :roll: )
danke schon mal für eure hilfe
cu greg

Tpercon 21. Aug 2003 08:16

Re: Highscore
 
Poste mal deinen Code zum Speichern und fürs Einlesen. Werden dir dann weiter helfen.

Alexander 21. Aug 2003 15:37

Re: Highscore
 
Also ganz im Gegenteil, INI's sind wesentlich einfacher...

Hier mal ein kleines Beispiel:
Delphi-Quellcode:
uses iniFiles

{...}
procedure TForm1.FormClose(Sender: TObject);
var
  Ini: TIniFile;
begin
  try
    Ini:=TIniFile.Create('C:\Test.ini');
    Ini.WriteInteger('Highscore','Name1',{PunkteZahl});
  finally
    Ini.Free;
  end;
Das sollte ein Eintrag in die Ini speichern. INI sind eigentlich so aufgebaut:
Code:
[section1]
schluessel1=Wert1
schluessel2=Wert2
[section2]
schluessel1=Wert1
schluessel2=Wert2
Sie dienen eigentlich dazu zb Programmeinstellungne zu speichern...


Alle Zeitangaben in WEZ +1. Es ist jetzt 20:35 Uhr.

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