Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

1

22.06.2012, 19:55

sdl game - highscore erweiterung

ich bin immernoch am erweitern des spieles, diesmal möchte ich eine highscoreliste erstellen. ich komme jedoch mein der highscoreliste nicht weiter...

hier mal meine methode:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
//checkhighscore
//highscore überprüfen
void CHighscore::CheckHighscore() {
    if (m_Highscore > lHighscore.begin()) {
        lHighscore.push_front(m_Highscore);
        lHighscore.pop_back();
    }
    

}


also m_Highscore ist int. in der methode möchte ich prüfen, ob m_Highscore größer ist als der erste listen eintrag. da dachte ich mir, prüfe ich mit lHighscore.begin().
wenn es größer ist, sollte m_Highscore an den anfang der liste gesetzt werden und der letzte wert gelöscht werden...so weit die theorie.

doch will der compiler nicht, er meint, meine if() abfrage ist falsch. hier mal seine fehlermeldung:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
1>Highscore.cpp
1>c:\users\Overlord\desktop\sdl_game\highscore.cpp(30) : error C2784: "bool std::operator >(const std::list<_Ty,_Ax> &,const std::list<_Ty,_Ax> &)": template-Argument für "const std::list<_Ty,_Ax> &" konnte nicht von "int" hergeleitet werden.
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\list(1319): Siehe Deklaration von 'std::operator >'
1>c:\users\Overlord\desktop\sdl_game\highscore.cpp(30) : error C2784: "bool std::operator >(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)": template-Argument für "const std::reverse_iterator<_RanIt> &" konnte nicht von "int" hergeleitet werden.
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2270): Siehe Deklaration von 'std::operator >'
1>c:\users\Overlord\desktop\sdl_game\highscore.cpp(30) : error C2784: "bool std::operator >(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)": template-Argument für "const std::_Revranit<_RanIt,_Base> &" konnte nicht von "int" hergeleitet werden.
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\xutility(2083): Siehe Deklaration von 'std::operator >'
1>c:\users\Overlord\desktop\sdl_game\highscore.cpp(30) : error C2784: "bool std::operator >(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)": template-Argument für "const std::pair<_Ty1,_Ty2> &" konnte nicht von "int" hergeleitet werden.
1>        c:\program files (x86)\microsoft visual studio 9.0\vc\include\utility(108): Siehe Deklaration von 'std::operator >'
1>c:\users\Overlord\desktop\sdl_game\highscore.cpp(30) : error C2677: Binärer Operator '>': Es konnte kein globaler Operator gefunden werden, der den Typ 'std::list<_Ty>::_Iterator<_Secure_validation>' akzeptiert (oder keine geeignete Konvertierung möglich)
1>        with
1>        [
1>            _Ty=int,
1>            _Secure_validation=true
1>        ]
1>Das Buildprotokoll wurde unter "file://c:\Users\Overlord\Desktop\SDL_Game\Debug\BuildLog.htm" gespeichert.
1>SDL_Game - 5 Fehler, 0 Warnung(en)
========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========


anscheindend ist lHighscore.begin() zum prüfen nicht geeignet? die lösung will mir nicht einfallen :dash:

könnte mir jemand bitte helfen? :thumbsup:

2

22.06.2012, 20:41

oh ich habe die antwort. das problem löse ich, indem ich einfach lHighscore.front() benutzte anstatt .begin() :D

so jetzt muss ich nurnoch einen allgorithmus basteln, der nicht nur den ersten, sondern auch die anderen werte in der liste prüft. ich poste den code, sobald ich etwas funktionierendes habe :thumbsup:

4

22.06.2012, 21:13



mit sort hats bei mir nicht geklappt. aber ich habe jetzt eine funktionierende methode für eine highscoreliste mit drei einträgen. hier mal der code:

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
//checkhighscore
//highscore überprüfen
void CHighscore::CheckHighscore() {
    i = lHighscore.begin();
    i++;

    if (m_Highscore > lHighscore.front()) {
        lHighscore.push_front(m_Highscore);
        lHighscore.pop_back();

    } else if (m_Highscore > *i) {
        lHighscore.insert(i, m_Highscore);
        lHighscore.pop_back();

    } else if (m_Highscore > lHighscore.back()) {
        lHighscore.pop_back();
        lHighscore.push_back(m_Highscore);
    } 

}


bei mir hat es bis jetzt ohne probleme geklappt, wer fehler/bugs findet darf gerne bescheid sagen :thumbsup:

Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von »Overlord« (22.06.2012, 21:31)


5

22.06.2012, 21:17

Was wenn "lHighscore" nur ein Element hat? Dann hast du eine Zugriffsverletzung und dein Programm stürzt ab...

6

22.06.2012, 21:26

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
void CHighscore::Init() {
    //score und highscore auf 0 setzten
     m_Score = 0;
     m_Highscore = 0;

     lHighscore.push_back(0);
     lHighscore.push_back(0);
     lHighscore.push_back(0);


}


ich habe von anfang an 3 elemente in der liste, sollte also niemals nur ein element vorhanden sein. oder irre ich mich?

7

22.06.2012, 21:29

Dann sind 3 Elemente in der Liste. Du irrst dich nicht.

8

22.06.2012, 21:32

dann habe ich eine solide lösung für das problem hinbekommen, ganz ohne hilfe hehe.
freut mich richtig :thumbsup:


ps: wer will kann den code gerne benutzten... ;)

Werbeanzeige