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

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

31

20.06.2009, 15:14

wie PCShadow bereits gesagt hat, ist der string zu begin leer.
du kannst ihn entweder

erst vergrößern und dann befüllen

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
string Rat;

Rat.resize(Buchstaben);

for (int j = 0; j < Buchstaben; j++)
{
    //"Tafel" leeren

    Rat [j] = '_';
}


oder einfach die buchstaben ranhängen (die funktion Rat.append macht das selbe wie das +=, was bei strings überladen wurde)

C-/C++-Quelltext

1
2
3
4
5
6
7
8
string Rat;

for (int j = 0; j < Buchstaben; j++)
{
    Rat += '_';
    // ODER

    Rat.append('_'); // smily :P

}


und dann gibts da noch die C++ version mit dem konstruktor


C-/C++-Quelltext

1
string Rat(Buchstaben, '_');


Zitat von »"C++ Referenz"«


string ( size_t n, char c );
Content is initialized as a string formed by a repetition of character c, n times.
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

32

20.06.2009, 18:07

es taucht noch ein fehler auf: ich kann die Strings anscheinend nicht per

C-/C++-Quelltext

1
Wort [i] = Tip;
belegen.[/code]
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

dot

Supermoderator

Beiträge: 9 757

Wohnort: Graz

  • Private Nachricht senden

33

20.06.2009, 18:11

was ist Tip und was für ein Fehler?

the[V]oid

Alter Hase

Beiträge: 775

Wohnort: Aachen

  • Private Nachricht senden

34

20.06.2009, 18:12

Nein, denn mit dem []-Operator kannst du nur einzelne Buchstaben eines Strings ansprechen, ich denke mal, Tip ist auch ein String? Falls es sinngemäß genau einen Buchstaben enthalten soll, kannst du die Zuweisung ja so machen:

C-/C++-Quelltext

1
Wort [i] = Tip [0];
<< an dieser Stelle ist eine Signatur verstorben >>

35

22.06.2009, 15:34

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <string>

using namespace std;

void main ()
{
    //Vordeklaraation der Variablen

    int Leben = 0;
    int Buchstaben;
    char Kontrolle;
    string Tip;
    Tip.resize (1);
    int Vorhanden;
    
    //Daten abfragen

    do
    {
        cout << "Spieler 1 wie viele Buchstaben hat dein Wort?" << endl;
        cin >> Buchstaben;
        cout << endl << "Wie viele Versuche soll Spieler 2 haben?"<< endl;
        cin >> Leben;
        printf ("Dein Wort hat %i Buchstaben und Spieler 2 hat %i Leben. \n (r)ichtig oder (f)alsch? \n", Buchstaben, Leben);
        cin >> Kontrolle;
    }while (Kontrolle != 'r' && Kontrolle != 'R');

    //Wortstrings deklarieren

    string Wort; 
    string Rat; 
    
    Wort.resize (Buchstaben);
    Rat.resize (Buchstaben);

    for (int i = 0; i < Buchstaben; i++)
    {
        //"Tafel" leeren

        Rat [i] = '_';
    }

    //Wort abfragen

    cout << "Spieler 1 wie heisst dein Wort?" << endl;
    cin >> Wort;

    //Spielschleife

    do
    {
        //Kontrollvariable zurüksetzen

        Vorhanden = 0;

        //Buchstaben abfragen

        printf ("Spieler 2 du hast noch %i Versuche uebrig. Auf der Tafel steht %s. Welchen buchstaben willst du raten?\n",
            Leben, Rat);
        getline (cin, Tip);

        //Kontrollieren des Buchstaben

        for (int i = 0; i < Buchstaben; i++)
        {

            //Kontolle

            if (Wort [i] == Tip [0])
            {
                Rat [i] = Tip[0];
                Vorhanden ++;
            }
        }
        //War der Buchstabe dabei

        if (Vorhanden > 0)
        {
            cout << endl << "Glückwunsch dein Buchstabe war dabei" << endl;
        }else{
            cout << endl << "Dein Buchstabe war leider nicht dabei" << endl;
            Leben --;
        }

    //Ende

    }while(Rat != Wort && Leben > 0);
    
    //Warum wurde die Hauptschleife beendet

    if (Rat == Wort)
    {
        cout << endl << "Glückwunsch Spieler 2 du hast gewonnen" << endl;
    }else{
        cout << endl << "Spieler 2 hat leider verloren" << endl;
    }
    return;
}

ich arbeite mit 7 buchstaben und 10 Leben es treten 2 Probleme auf:
1. Sobald die Spielschleife eingeleitetr wird, wird erstmal ein durchlauf mit ' '(leerzeichen)gemacht.. also immer falsch und man verliert ein leben
2. Und der is wichtiger Wird Rat nicht richtig belegt es liefert immer (null) zurück und kann auch in der überprüfungsroutine nicht belegt werden, deshalb beendet sich das Spiel nicht wenn man gewonnen hat und man kann nicht sehen welche Buchstaben wo stehen...
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

36

22.06.2009, 18:32

da sehe ich doch noch fehler :D

C-/C++-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
#include <iostream>
#include <string>

int main () // es heißt INT MAIN !!

{
    //Vordeklaraation der Variablen

    unsigned Leben;
    unsigned Buchstaben;
    char Kontrolle;

    //Daten abfragen

    do
    {
        std::cout << std::endl << "Spieler 1 wie viele Buchstaben hat dein Wort?" << std::endl;
        std::cin >> Buchstaben;
        std::cout << std::endl << "Wie viele Versuche soll Spieler 2 haben?"<< std::endl;
        std::cin >> Leben;
        std::count << "Dein Wort hat " << Buchstaben << " Buchstaben und Spieler 2 hat " << Leben << " Leben. \n (r)ichtig oder (f)alsch? " << std::endl;
        std::cin >> Kontrolle;
    }while (Kontrolle != 'r' && Kontrolle != 'R');

    //Wortstrings deklarieren

    std::string Wort;
    std::string Rat(Buchstaben, '_');

    //Wort abfragen

    std::cout << "Spieler 1 wie heisst dein Wort?" << std::endl;
    std::cin >> Wort;

    if (Wort.size() > Buchstaben)
        Wort.resize(Buchstaben); // geg. einkürzen


    //Spielschleife

    do
    {
        //Kontrollvariable zurüksetzen

        bool found = true;

        //Buchstaben abfragen

        std::cout << "Spieler 2 du hast noch " << Leben << " Versuche uebrig. Auf der Tafel steht " << Rat << ". Welchen buchstaben willst du raten?" << std::endl;
      
        char Tip;
        std::cin >> Tip; // ein buchstabe reicht


        //Kontrollieren des Buchstaben

        std::string::size_type pos = Wort.find(Tip, 0);
        if (pos != std::string::npos) // wenn wir was gefunden haben

        {
            do
            {
                if (Rat.size() > pos) // könnte überlaufen

                    Rat[pos] = Tip;
                // else Error

                pos = Wort.find(Tip, pos + 1);
            }
            while (pos != std::string::npos);
            std::cout << std::endl << "Glückwunsch dein Buchstabe war dabei" << std::endl;
        }
        else
        {
            std::cout << std::endl << "Dein Buchstabe war leider nicht dabei" << std::endl;
            --Leben;
        }

    //Ende

    }while (Rat != Wort && Leben > 0);
   
    //Warum wurde die Hauptschleife beendet

    if (Rat == Wort)
    {
        std::cout << std::endl << "Glückwunsch Spieler 2 du hast gewonnen" << std::endl;
    }else{
        std::cout << std::endl << "Spieler 2 hat leider verloren" << std::endl;
    }
}


ob es es damit tut weiß ich nicht, aber es ist mehr C++-ig

(printf und count mischen *schüttel*)
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

37

22.06.2009, 19:12

das war um sprintf zu üben und ich war bisher halt cout gewohnt... ich programmiere sehr buchnah

EDIT:
Es funktioniert danke an alle die dabei geholfen haben und die soviel Geduld für mich aufgebracht haben... der Fehler steckt manchmal wirklich im detail
@gotbread ich würde gerne den Quell code weiternutzen um ihn ggf. zu erweitern etc. und wollte dich dafür um Erlaubnis bitten.
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

Gotbread

Alter Hase

Beiträge: 421

Beruf: Student (Etechnik) + Hiwi

  • Private Nachricht senden

38

23.06.2009, 00:59

kein problem nimms dir :D (ist ja auch irgentwie dein code)

viel glück
Mfg Goti
www.gotbread.bplaced.net
viele tolle spiele kostenlos, viele hardware-basteleien :)

"Es ist nicht undicht, es läuft über" - Homer Simpson

39

23.06.2009, 12:50

danke werd dann weitere egebnisse bei zeiten posten
Gewinnen ist, wenn man einmal mehr aufsteht, als man zu Boden geht.

riCo

Treue Seele

Beiträge: 165

Beruf: Student

  • Private Nachricht senden

40

23.06.2009, 13:13

@Gotbread
Wenn schon INT main, dann auch den return-Wert nicht vergessen.. :roll:
Wir leben alle unter dem Sternenhimmel, aber wir haben nicht alle den gleichen Horizont.

Werbeanzeige