tutorials.de Buch-Aktion 05/2012
Like Tree2Danke
  • 1 Beitrag von ibafluss
  • 1 Beitrag von sheel
ERLEDIGT
JA
ANTWORTEN
8
ZUGRIFFE
291
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    CodeCrafterCpp CodeCrafterCpp ist offline Mitglied Gold
    Registriert seit
    Nov 2011
    Beiträge
    148
    Mein Problem ist das wenn ich das Programm(TicTacToe) starte und den Mehrspieler Modus wähle und dann das Feld ein aussuche das das Feld ein nicht auf x gesetzt wird sonder Falsch Eingabe gemeldet wird. Um es besser zu verstehen eben selber Compilieren.


    Ich hab mit bei der Setzen Funktion ganz schön verhaspelt und wollte fragen wie ihr das gemacht hättet.






    Code :
    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
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    
    #include <iostream>
    #include <conio.h>
    #include <Windows.h>
     
    using namespace std;
     
    void Render(char *f);
    char Setzen(char eingabe, char *f, bool player_turn);
     
    int main()
    {
        //********************************************//
        //Variablen
        //********************************************//
        bool player_turn = true;
        int gewinn = 0;
        char ki;
        char eingabe;
        char zeichen;
        bool exit = false;
        char f[9];
        for(int i = 0; i < 9; i++)
        {
            f[i] = i+49;
        }
     
        cout << "TicTacToe" << endl;
        cout << "Waehle eine Spiel Modus aus:" << endl
             << "0: mehr Spieler Modus" << endl
             << "1: gegen Computer einfach" << endl
             << "2: gegen Computer schwerer als einfach" << endl
             << "3: gegen Computer mittel" << endl
             << "4: gegen Computer leichter als schwer" << endl
             << "5: gegen Computer schwer" << endl;
        ki = getch();
     
     
        //********************************************//
        //Game_Loop
        //********************************************//
     
            
            if(ki == '0')
            {
                while(!exit)
                {
                    system("cls");
                    Render(f);
                    if(player_turn == true)
                    {
                        cout << "Spieler 1 ist dran. Bitte waehle ein Feld: ";
                        zeichen = 'x';
                    }
                    if(player_turn == false)
                    {
                        cout << "Spieler 2 ist dran. Bitte waehle ein Feld: ";
                        zeichen = 'o';
                    }
                    eingabe = getch();
                    Setzen(eingabe, f, player_turn);
     
     
                }
            }
            else if(ki == '1')
            {
                while(!exit)
                {
     
                }
            }
            else if(ki == '2')
            {
                while(!exit)
                {
     
                }
            }
            else if(ki == '3')
            {
                while(!exit)
                {
     
                }
            }
            else if(ki == '4')
            {
                while(!exit)
                {
     
                }
            }
            else if(ki == '5')
            {
                while(!exit)
                {
     
                }
            }
     
     
     
        return 0;
    }
     
     
     
    void Render(char *f)
    {
        cout << f[0] << "|"<< f[1]<< "|"<< f[2]<< endl;
        cout << "-" << "+" << "-" << "+" << "-" << endl;
        cout << f[3] << "|"<< f[4]<< "|"<< f[5]<< endl;
        cout << "-" << "+" << "-" << "+" << "-" << endl;
        cout << f[6] << "|"<< f[7]<<"|"<< f[8]<< endl;
    }
     
     
    char Setzen(char eingabe,char *f, bool player_turn)
    {
        if(eingabe == f[eingabe])
        {
            if(player_turn == true)f[eingabe] = 'x';
            if(player_turn == false)f[eingabe] = 'o'; 
     
        }
        else
        {
            while(true)
            {
                system("cls");
                Render(f);
                cout << "Bitte wähle ein anderes Feld da diese besetzt ist: ";
                eingabe = getch();
                if(eingabe >= 49 && eingabe <= 57)
                {
                    if(f[eingabe] == eingabe)
                    {
                        if(player_turn == true)f[eingabe] = 'x';
                        if(player_turn == false)f[eingabe] = 'o'; 
                        break;
                    }
                }
                else
                {
                    system("cls");
                    Render(f);
                    cout << "Falsche eingabe! Bitte wähle ein Feld von 1-9: ";
                    eingabe = getch();
                }
            }
        }
        return eingabe, *f;
    }


    Mit freundliche Grüßen
    Geändert von CodeCrafterCpp (21.12.11 um 20:31 Uhr)
     

  2. #2
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Schau mal auf die if-Verzweigung in Zeile 120: if(eingabe == f[eingabe])

    eingabe ist ja char. Du vergleichst jetzt das char mit f[eingabe]. In eingabe ist aber keine Zahl im Format 1 gespeichert, sondern im Format '1'! Es wird also das Zeichen 1 gespeichert und nicht die 1 selbst. Du müsstest die Eingabe noch in int konvertieren, dann kannst du damit auf Arrayelemente zugreifen. Z.B.:

    Code :
    1
    2
    3
    
    int zahl;
     
    zahl = eingabe - 48     // So kommst du vom Zeichen auf die Zahl selbst

    Jetzt kannst du mit zahl auf die Arrayelemente zugreifen.

    P.S.: Ich habe den restlichen Code nocht nicht angeschaut, versuch mal wie das Programm jetzt läuft.

    Lg
    CodeCrafterCpp bedankt sich. 

  3. #3
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Hi

    was ich anders gemacht hätte:

    main:
    Statt 49 '1' nehmen.
    Variablendefs zusammenfassen ( char a, b, c; )
    Unnötige Variablen weg
    Die einzelnen Modi in eigene Funktionen auslagern
    Statt x==true und x==false einfach x und !x verwenden
    Bei den KI-Modi keine Endlosschleife, sondern vorerst eine Fehlermeldung

    Render: Schleifen

    Setzen:
    Dein Fehler: Beim ersten if nicht vergessen, dass '1' ja 49 ist und als Index ungeeignet
    Die Falschprüfung nicht so umständlich, mit zwei verschiedenen Meldungen etc.

    Gruß
    CodeCrafterCpp bedankt sich. 
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  4. #4
    CodeCrafterCpp CodeCrafterCpp ist offline Mitglied Gold
    Registriert seit
    Nov 2011
    Beiträge
    148
    Ok danke euch beiden wo ich mir es so anschaue macht es ja auch sinn.
    @sheel Unnötige Variablen weg******** Es kommt ja noch ein bsschen an Quelltext oder meinst du was jetzt schon sinnlos ist?

    Und das beim Render eine Schleife benutzt were jetzt ja sinnlos und in der Konsole sieht das dann doof aus.

    Aber sonst danke.
     

  5. #5
    ibafluss ibafluss ist offline Mitglied Gold
    Registriert seit
    Feb 2011
    Beiträge
    168
    Und noch was: Ich habe ja selbst vor cirka einem Monat mein TicTatToe mit KI programmiert und ich würde sagen, es ist ziemlich sinnlos, 5 verschiedene Schwierigkeitsgrade zu programmieren. Sonst endet das nur so, dass der schwerste immer alle Angriffe blockt, der zweitschwerste dann halt das selbe, nur dass er zum Beispiel einen besonderen Fall nicht beachtet usw...
    Am besten mach einen Computergegner und den gibst du dafür alles, was er braucht um die Gegner ins Schwitzen zu bringen
     

  6. #6
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    @Render-Schleife: Warum soll wegen einer Schleife die Konsole anders ausschauen?
    @Sinnlos-Variablen: Wenn du die im noch fehlenden Code brauchst, ok. Bin ja kein Hellseher
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  7. #7
    CodeCrafterCpp CodeCrafterCpp ist offline Mitglied Gold
    Registriert seit
    Nov 2011
    Beiträge
    148
    @Render-Schleife Weil es eine Konsole eigendlich nicht für Spiele gemacht ist und somit kein Doppel Buffering (oder wie das noch heißst) hat. Wenn ich jetzt sagen wir mal jede Sekunde Zeichne blitzt mir das Spielfeld nur auf und das ist ja ziemlich doof. Also es kann auch sein das ich das mit deiner Schleife falsch verstanden habe.


    mfG
     

  8. #8
    Avatar von sheel
    sheel sheel ist offline Moderator
    tutorials.de Moderator
    Registriert seit
    Jul 2007
    Beiträge
    4.501
    Meinte nur, das:
    Code cpp:
    1
    2
    3
    4
    5
    
        cout << f[0] << "|"<< f[1]<< "|"<< f[2]<< endl;
        cout << "-" << "+" << "-" << "+" << "-" << endl;
        cout << f[3] << "|"<< f[4]<< "|"<< f[5]<< endl;
        cout << "-" << "+" << "-" << "+" << "-" << endl;
        cout << f[6] << "|"<< f[7]<<"|"<< f[8]<< endl;
    durch zB. sowas zu ersetzen:
    Code cpp:
    1
    2
    3
    4
    5
    6
    
    for(int i = 1; i <=9; i++)
    {
        cout << f[i - 1];
        if(!(i % 3)) cout << endl << "-+-+-" << endl;
        else cout << "|";
    }

    Gruß
     
    Netiquette (vA §15) und Nutzungsregeln (vA §4.8) einhalten! Programmcode in Codetags/Codeboxen.
    Sehr gute Beiträge bitte Bewerten (Stern darunter oder "Danke").
    "Funktioniert nicht" ist zu ungenau! Code, Fehlermeldungen, Verhalten des Programms, ...?

  9. #9
    CodeCrafterCpp CodeCrafterCpp ist offline Mitglied Gold
    Registriert seit
    Nov 2011
    Beiträge
    148
    @Sheel Achso ok das ist ja gut. Hab das so verstanden das man eben pro Sekunde 28 mal Render wie bei ein richtigen 3D Spiel.
    Geändert von CodeCrafterCpp (22.12.11 um 14:57 Uhr)
     

Ähnliche Themen

  1. Antworten: 2
    Letzter Beitrag: 21.07.11, 09:55
  2. [Visio] Beim Shape erstellen: Steuer-/Kontrollpunkte setzten?
    Von Syrill im Forum Office-Anwendungen
    Antworten: 0
    Letzter Beitrag: 28.01.11, 12:15
  3. Mit ant beim compilieren Pfade setzten?
    Von reweiss im Forum Java
    Antworten: 3
    Letzter Beitrag: 30.09.08, 14:40
  4. Antworten: 0
    Letzter Beitrag: 10.07.08, 16:29
  5. Probleme beim setzten einer Umgebungsvariablen
    Von Hawkings im Forum Linux & Unix
    Antworten: 4
    Letzter Beitrag: 12.06.07, 17:25