Schneider SPS - Highscoreliste programmieren?

Orbitus

Level-1
Beiträge
5
Reaktionspunkte
0
Zuviel Werbung?
-> Hier kostenlos registrieren
Hallo!
Ich programmiere für meine Abschlussarbeit ein Lichtspiel, bei dem aufleuchtende Felder betätigt werden müssen.
Nun möchte ich dies mit einer Highscoreliste (Top 10) erweitern, indem man den Namen eingeben muss und dieser samt der Punktezahl eingetragen wird.
Ich verwende eine Modicon Premium: TSX PSY 2600M und programmiere mit Unity Pro XL.
Es wäre super, hier einige Anregungen zu finden, da ich nicht weiß, wie ich das bewältigen soll.
Vielleicht wurde dies schon mal so in der Art programmiert und man könnte mir das näher bringen.
Ich habe darüber nachgedacht, das vielleicht in Arrays zu speichern und dann zu vergleichen, dass der mit den wenigsten Punkten unten quasi herausfällt.
Ich bedanke mich schon mal im voraus.

Mit freundlichen Grüßen
 
Hallo
Also ich würde es in ein Array of struct einbetten und dann nach dem Highscore aussortieren.

highscore.JPG


Grüsse Holger
 
ich denken ST ist am besten geignet. Würde aber auch in CFC gehen.
Wie genau sortiere ich das dann aus?
Ich würde das Array durchlaufen und den nächst grösseren und nächst kleineren Wert suchen. Dann die alten Score einen weiter kopieren und den neuen einfügen.
Holger
 
Mit Array durchlaufen, denke ich ist mal eine Schleifenfunktion gemeint?
Wie genau mache ich das möglich, dass er nach dem nächst größeren und nächst kleineren Wert sucht?
Und wie kann ich den alten Score weiter kopieren? Vielleicht mit einer Schiebeoperation oder ähnlichem?
Entschuldigung für die Fragen, aber ich bin in strukturiertem Text für Unity Pro nicht so sehr bewandert.

Liebe Grüße
 
Zuviel Werbung?
-> Hier kostenlos registrieren
wenn du in ST noch Übung brauchst, würde ich es erstmal nicht in einer Schleife machen. Die 10 Werte kann man auch nacheinander bearbeiten.
Erst wenn alles verständlich ist, kann man sich über Optiomierung gedanken machen.

Der Code sollte ungefähr so aussehen:
Code:
nächst_Grössere_Variablenindex = -1
nächst_Kleinere_Variablenindex = -1

If Neuer_Score < Highscore.Highscore(0).Wert then nächst_Grössere_Variablenindex= 0
If Neuer_Score < Highscore.Highscore(1).Wert then nächst_Grössere_Variablenindex= 1
.
.
If Neuer_Score < Highscore.Highscore(9).Wert then nächst_Grössere_Variablenindex= 9
.
If Neuer_Score > Highscore.Highscore(9).Wert then nächst_Kleinere_Variablenindex =9
.
If Neuer_Score > Highscore.Highscore(0).Wert then nächst_Kleinere_Variablenindex =0
Danach weist du welcher Index der nächst Grössere ist und welcher der nächst kleinere.
z.B. der nächst grössere ist der Wert in Index 6. Das bedeutet, dass dein neuer Score in den Wert des Index 7 rein mus.
Als nächstes muss also der Wert von Index 8 nach 9 ( 9 verschwindet)
dann von 7 nach 8 und dein neuer Score nach Index 7.
Vorher noch prüfen ob überhaupt was gemacht werden muss.

Wenn es jetzt funktioniert dann würde ich mir gedanken machen, was man wie in Schleifen packt um den Code zu optimieren.

Grüsse Holger
 
Zuletzt bearbeitet:
Ich habe das mal angewendet und getestet.
Ich stell mit nur folgende Frage:
Und zwar, Wenn ich schreibe:

If Neuer_Score > Highscore.Highscore(9).Wert then nächst_Kleinere_Variablenindex =9

Damit werden doch auch die Plätze 8 - 1 angesprochen, muss da nicht eine Verrieglung für die jeweiligen Plätze rein?

Ein weiteres Problem was ich noch habe ist, dass wenn ich die Scores alle um einen Platz nach unten schiebe und ich diese Operation öfters in meinen IF Abfragen hab, dass diese Funktion öfters ausgeführt wird.
 
If Neuer_Score > Highscore.Highscore(9).Wert then nächst_Kleinere_Variablenindex =9
Damit werden doch auch die Plätze 8 - 1 angesprochen, muss da nicht eine Verrieglung für die jeweiligen Plätze rein?
:confused: Dann quittiert das Unity mit einem Fehler, weil die Syntax falsch ist. War nur als Gedankengang gedacht, nicht als schreibbarer Code.
Ich habe mal was zusammengeschrieben für den Anfang.


Code:
Naechstgroesser:=11;
NaechstKleiner:=11;

if Eingabe.Score < Daten[9].Score then Naechstgroesser:=9;
elsif Eingabe.Score < Daten[8].Score then Naechstgroesser:=8;
elsif Eingabe.Score < Daten[7].Score then Naechstgroesser:=7;
elsif Eingabe.Score < Daten[6].Score then Naechstgroesser:=6;
elsif Eingabe.Score < Daten[5].Score then Naechstgroesser:=5;
elsif Eingabe.Score < Daten[4].Score then Naechstgroesser:=4;
elsif Eingabe.Score < Daten[3].Score then Naechstgroesser:=3;
elsif Eingabe.Score < Daten[2].Score then Naechstgroesser:=2;
elsif Eingabe.Score < Daten[1].Score then Naechstgroesser:=1;
elsif Eingabe.Score < Daten[0].Score then Naechstgroesser:=0;
elsif Eingabe.Score > Daten[0].Score then Naechstgroesser:=-1;
end_if;


if Eingabe.Score > Daten[0].Score then NaechstKleiner:=0;
elsif Eingabe.Score > Daten[1].Score then NaechstKleiner:=1;
elsif Eingabe.Score > Daten[2].Score then NaechstKleiner:=2;
elsif Eingabe.Score > Daten[3].Score then NaechstKleiner:=3;
elsif Eingabe.Score > Daten[4].Score then NaechstKleiner:=4;
elsif Eingabe.Score > Daten[5].Score then NaechstKleiner:=5;
elsif Eingabe.Score > Daten[6].Score then NaechstKleiner:=6;
elsif Eingabe.Score > Daten[7].Score then NaechstKleiner:=7;
elsif Eingabe.Score > Daten[8].Score then NaechstKleiner:=8;
elsif Eingabe.Score > Daten[9].Score then NaechstKleiner:=9;
end_if;

(* Nur ausführen wenn der Score größer dem kleinsten ist*)
if Naechstgroesser < 9 then
(* Daten um einen Index weiterkopieren*)
for zaehler := 8 to NaechstKleiner by -1 do
Daten[zaehler +1].Score := Daten[zaehler ].Score;
(*Hier fehlt noch Name, Vorname, Datum, Uhrzeit*)
end_for;

(*Neuen Score an erster Stelle einfügen*)
if Naechstgroesser = -1 then
daten[0].score := Eingabe.Score;
(*Hier fehlt noch Name, Vorname, Datum, Uhrzeit*)

(*Neuen Score nach dem nächstgrösserem einfügen*)
elsif Naechstgroesser <9 then
daten[Naechstgroesser+1].score := Eingabe.Score;
(*Hier fehlt noch Name, Vorname, Datum, Uhrzeit*)
end_if;
end_if;

Was noch fehlt, ist die Aktion bei gleichem Score.
Anschließend kannst du dir überlegen, wie man den Code in eine Schleife packt um ihn zu optimieren.

Den Code habe ich noch ein wenig verändert, darum weicht er vom Anhang ab.
Anhang anzeigen highscore.zip
Grüsse Holger
 
Zuletzt bearbeitet:
Ich würde die Highscoreliste nur einmal von Platz 10 zu Platz 1 durchgehen und dabei immer einen Eintrag nach tiefer verschieben bis ich den Eintrag zum Einfügen des neuen Score gefunden habe.
Vergleich und Eintragen neuer Score (Pseudocode, ich tippe am Tablet):
Code:
If Neuer_Score <= Highscore(10) then exit ;

If Neuer_Score > Highscore(9) then copy(Highscore(9) to Highscore(10))
else copy(Neuer_Score to Highscore(10)), exit ;

If Neuer_Score > Highscore(8) then copy(Highscore(8) to Highscore(9))
else copy(Neuer_Score to Highscore(9)), exit ;
...

If Neuer_Score > Highscore(2) then copy(Highscore(2) to Highscore(3))
else copy(Neuer_Score to Highscore(3)), exit ;

If Neuer_Score > Highscore(1) then copy(Highscore(1) to Highscore(2))
else copy(Neuer_Score to Highscore(2)), exit ;

copy(Neuer_Score to Highscore(1)) ;
copy(...to...) meint: den kompletten Struct eines Highscore-Eintrages kopieren.
exit meint: Suche/Schleife abbrechen, nachfolgende Anweisungen nicht mehr ausführen.

Auch möglich, aber viel Daten kopieren: Einsortieren in 1 Durchgang Bubble Sort:
Wenn neuer Score größer als Highscore(10) dann neuer Score überschreibt zunächst Highscore(10). Danach mit Highscore(9) vergleichen und ggf. beide tauschen und ggf. mit Highscore(8) vergleichen und ggf. beide tauschen... bis Highscore(1) erreicht oder nicht getauscht
(das kann man auch mit neuer_Score als unsichtbarer Highscore(11) anfangen)

Harald
 
Morgen Orbitus
Auf den ersten Blick sieht es so aus, als könnte es funktionieren aber 476 Zeilen Code ...
Exportiere doch mal deine Funktion und die Variabe.

Jetzt solltest du überlegen, welche Teile du zusammenfassen könntest um den Code zu optimieren.
Ich schätze mal 50 Zeilen Code sollten auf alle Fälle ausreichen.

Grüsse Holger
 
Zurück
Oben