Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Kółko i krzyżyk- program przestał działać / sprawdzanie remisu

Ostatnio zmodyfikowano 2013-11-26 17:35
Autor Wiadomość
matiko101
Temat założony przez niniejszego użytkownika
Kółko i krzyżyk- program przestał działać / sprawdzanie remisu
» 2013-11-23 18:50:01
Witam,
Napisałem grę z banalnymi zasady, ale nie do końca  sobie z nią radzę.
Oto kod:
C/C++
#include<iostream>
#include<windows.h>
#include<cstdio>
#include<conio.h>
#include<cstdlib>
using namespace std;
void intro()
{
    cout << "                                      *  WITAJ *\n ";
    Sleep( 800 );
    cout << "                                   **     W    **\n ";
    Sleep( 800 );
    cout << "                                 ***    GRZE    ***\n";
    Sleep( 800 );
    cout << "                               ****      KOLKO    ****\n ";
    Sleep( 800 );
    cout << "                            *****         i       **** \n";
    Sleep( 800 );
    cout << "                         ******         KRZYZYK      ******";
    Sleep( 800 );
    Sleep( 1000 );
    system( "cls" );
   
}
int w( char tab[] )
{
    int x = 0, y = ' ';
    while( x <= 10 )
    {
        x++;
        tab[ x ] = y;
    }
}
int plansza( char tab[] )
{
    system( "cls" );
    for( int i = 1; i <= 9; i++ )
    {
        cout << "" << tab[ i ] << "";
        if( i % 3 != 0 )
        {
            cout << "  |";
           
        }
        else
        {
            if( i != 9 )
                 cout << "\n---+---+---\n";
            else
            {
                cout << endl;
            }
        }
    }
    cout << endl;
}
int wygranaO( char tab[] )
{
    char znak = 'O';
    if(( tab[ 1 ] == znak ) &&( tab[ 2 ] == znak ) &&( tab[ 3 ] == znak )
    ||( tab[ 4 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 6 ] == znak )
    ||( tab[ 7 ] == znak ) &&( tab[ 8 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 1 ] == znak ) &&( tab[ 4 ] == znak ) &&( tab[ 7 ] == znak )
    ||( tab[ 2 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 8 ] == znak )
    ||( tab[ 3 ] == znak ) &&( tab[ 6 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 1 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 3 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 7 ] == znak ) )
    {
        cout << " ________________________________________\n";
        cout << " | Wygral " << znak << "    GRATULACJE !!!           |\n";
        cout << " ========================================\n";
    }
}


bool wygranaX( char tab[] )
{
    char znak = 'X';
    if(( tab[ 1 ] == znak ) &&( tab[ 2 ] == znak ) &&( tab[ 3 ] == znak )
    ||( tab[ 4 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 6 ] == znak )
    ||( tab[ 7 ] == znak ) &&( tab[ 8 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 1 ] == znak ) &&( tab[ 4 ] == znak ) &&( tab[ 7 ] == znak )
    ||( tab[ 2 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 8 ] == znak )
    ||( tab[ 3 ] == znak ) &&( tab[ 6 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 1 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 3 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 7 ] == znak ) )
    {
        cout << " ________________________________________\n";
        cout << " | Wygral " << znak << "    GRATULACJE !!!           |\n";
        cout << " ========================================\n";
        return true;
    }
    else
    {
        return false;
    }
}


int ruch( char tab[], string gracz1, string gracz2 )
{
    char znak = ' ';
    string remis;
    int los;
    int cyfra = 1;
    w( tab );
    plansza( tab );
    while(( !wygranaX( tab ) ) ||( wygranaO( tab ) ) )
    {
        cout << "Ruch gracza " << gracz1 << ": ";
        cin >> cyfra;
        if( tab[ cyfra ] == ' ' )
        {
            tab[ cyfra ] = 'X';
            plansza( tab );
            znak = 'X';
            if( wygranaX( tab ) == true )
            {
                cout << "\n\n \n Koniec gry !";
                return 0;
            }
        }
        else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) )
        {
            cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n";
        }
        cout << "Ruch gracza " << gracz2 << ": ";
        cin >> cyfra;
        if(( tab[ cyfra ] == ' ' ) )
        {
            tab[ cyfra ] = 'O';
            plansza( tab );
            znak = 'O';
            if( wygranaO( tab ) == true )
            {
                cout << "\n\n \n Koniec gry !";
                return 0;
            }
        }
        else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) )
        {
            cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n";
        }
        else if(( cyfra > 9 ) ||( cyfra < 1 ) )
             cout << "Nie oszukuj chciales postawic na pole ktorego nie ma\n\n";
       
    }
}





int main()
{
    string imie1, imie2;
    int wybor = 0;
    char tab[ 9 ];
    cout << "\n                        ***********************************     ";
    cout << "\n                         ******   [Enter]  START     ******";
    cout << "\n                           ****   [Spacja] ZASADY    ****";
    cout << "\n                            ***   [Esc]    KONIEC    ***";
    cout << "\n                             **                      ** ";
    cout << "\n                              ************************ \n\n\n";
    wybor = getch();
    switch( wybor )
    {
    case 13: system( "cls" );
        {
            cout << "Podaj imie gracza X\n";
            cin >> imie1;
            system( "cls" );
            cout << "Podaj imie gracza O\n";
            cin >> imie2;
            ruch( tab, imie1, imie2 ); return 0; break;
        }
    case 32: system( "cls" ); break;
    case 27: system( "cls" ); return 0; break;
    }
   
    return 0;
}
Wiem, że mogłem funkcje wygranaX i wygranaO o wiele krócej, ale chciałem na razie aby działało.
Mam 2 pytania: (nie oczekuje rozwiązania tylko podpowiedzi co mam źle)
1. Dlaczego program nie odpowiada po skończeniu rundy  ?
2. W jaki sposób zrobić remis ? Próbowałem gdy nie ma wolnego miejsca na planszy, ale chyba to źle robię:
C/C++
for( int x = 2; x <= 10; x++ )
{
    if( tab[ x ] != ' ' )
    {
        plansza( tab );
        cout << "REMIS !";
        return 0;
    }
}
Umieściłem to na początku pętli while, ale nie działa tak jak powinno.
P-97194
leon_w
» 2013-11-23 19:52:08
Jeżeli chodzi o remis, to możesz zdefiniować dodatkową zmienną i dodawać do jej wartości 1 przy każdym ruchu gracza, dalej if(zmienna==9)....
P-97196
matiko101
Temat założony przez niniejszego użytkownika
» 2013-11-23 19:54:09
Z tym wyłączaniem już sobie poradziłem, ale ten remi zrobiłem tak jak mówisz. Tylko, że gdy ta zmienna wynosiła np. 5 i postawiłem na tym polu znak to wykrywało remis :( . Może coś źle zrobiłem
P-97197
leon_w
» 2013-11-23 20:20:47
To musi być osobna zmienna, np int remis=0, +1 przy ruchu każdego z graczy a warunek kończący remisem wstaw po lub w ruchu pierwszego gracza, bo to on wykonuje 9 ruch. 
P-97200
matiko101
Temat założony przez niniejszego użytkownika
» 2013-11-25 19:39:33
Udało mi się ;)
I mam pytanie co w tym kodzie jet niepotrzebne (zbędne) i czy możną go jakimś sposobem skrócić. Wydaje mi się,że powtarzanie akcji "Nie ma takie pola" lub "chciałeś postawić znak na zajęte pole " powinno być tylko raz, ale nie mam pomysłu jak pętle skonstruować, by działało w taki sam sposób jak teraz. Oczywiście jeśli zrobienie tego nie spowodowało by całej przebudowy mojego programu.
C/C++
#include<iostream>
#include<windows.h>
#include<cstdio>
#include<conio.h>
#include<cstdlib>
using namespace std;
void intro()
{
    system( "color 04" );
    cout << "                                      *  WITAJ *\n ";
    Sleep( 500 );
    cout << "                                   **     W    **\n ";
    Sleep( 500 );
    cout << "                                 ***    GRZE    ***\n";
    Sleep( 500 );
    cout << "                               ****      KOLKO    ****\n ";
    Sleep( 500 );
    cout << "                            *****         i       **** \n";
    Sleep( 500 );
    cout << "                         ******         KRZYZYK      ******";
    Sleep( 500 );
    Sleep( 800 );
    system( "cls" );
   
}

int zasady()
{
    char wybor3;
    cout << "Pola zaznaczasz za pomoca cyfr od 1 do 9 :\n";
    cout << "[1][2][3]\n[4][5][6]\n[7][8][9]\n";
    cout << "Dwoch graczy gra na zmiane i ten ktory jako pierwsz umiesci swoje 3 znaki obok siebie poziomo/pionowo/na ukos ten wygrywa ! ;";
    cout << "\n\n\n\n\n Jesli chcesz powrocic do menu kliknij [t] a jesli nie dowolny przycisk\n";
    wybor3 = getch();
    if( wybor3 == 't' )
         return 0;
    else
         exit( 0 );
   
   
}
int w( char tab[] )
{
    int x = 0, y = ' ';
    while( x <= 10 )
    {
        x++;
        tab[ x ] = y;
    }
    return 0;
}
int plansza( char tab[] )
{
    system( "cls" );
    for( int i = 1; i <= 9; i++ )
    {
        cout << "" << tab[ i ] << "";
        if( i % 3 != 0 )
        {
            cout << "  |";
           
        }
        else
        {
            if( i != 9 )
                 cout << "\n---+---+---\n";
            else
            {
                cout << endl;
            }
        }
    }
    cout << endl;
    return 0;
}



bool wygrana( char tab[], char znak )
{
    if(( tab[ 1 ] == znak ) &&( tab[ 2 ] == znak ) &&( tab[ 3 ] == znak )
    ||( tab[ 4 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 6 ] == znak )
    ||( tab[ 7 ] == znak ) &&( tab[ 8 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 1 ] == znak ) &&( tab[ 4 ] == znak ) &&( tab[ 7 ] == znak )
    ||( tab[ 2 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 8 ] == znak )
    ||( tab[ 3 ] == znak ) &&( tab[ 6 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 1 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 9 ] == znak )
    ||( tab[ 3 ] == znak ) &&( tab[ 5 ] == znak ) &&( tab[ 7 ] == znak ) )
    {
        cout << " ________________________________________\n";
        cout << " | Wygral " << znak << "    GRATULACJE !!!           |\n";
        cout << " ========================================\n";
        return true;
    }
    else
    {
        return false;
    }
}





int ruch( char tab[], string gracz1, string gracz2 )
{
    int x = 0;
    char znak;
    int cyfra = 1;
    int remis = 1;
    w( tab );
    plansza( tab );
    while(( !wygrana( tab, 'X' ) ) ||( !wygrana( tab, 'O' ) ) )
    {
        x++;
        system( "color 0C" );
        cout << "Ruch gracza " << gracz1 << ": ";
        cin >> cyfra;
        if( tab[ cyfra ] == ' ' )
        {
            tab[ cyfra ] = 'X';
            znak = 'X';
            plansza( tab );
            if( wygrana( tab, znak ) == true )
            {
                cout << "\n\n \n Koniec gry !\n\n\n";
                return 0;
            }
            else if( x == 9 )
            {
                cout << "\n\nREMIS !\n\n";
                return 0;
            }
        }
        else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) )
        {
            cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n";
        }
        else if(( cyfra > 9 ) ||( cyfra < 1 ) )
             cout << "Nie oszukuj chciales postawic na pole ktorego nie ma\n\n";
       
        x++;
        system( "color 02" );
        cout << "Ruch gracza " << gracz2 << ": ";
        cin >> cyfra;
        if(( tab[ cyfra ] == ' ' ) )
        {
            tab[ cyfra ] = 'O';
            znak == 'O';
            plansza( tab );
            if( wygrana( tab, znak ) == true )
            {
                cout << "\n\n \n Koniec gry !\n\n\n";
                return 0;
            }
        }
        else if(( tab[ cyfra ] == 'X' ) ||( tab[ cyfra ] == 'O' ) )
        {
            cout << "\n Nie oszukuj chciales postawic znak na zajete pole ! \n\n";
        }
        else if(( cyfra > 9 ) ||( cyfra < 1 ) )
             cout << "Nie oszukuj chciales postawic na pole ktorego nie ma\n\n";
       
    }
}





int main()
{
    string imie1, imie2;
    int wybor = 0;
    char wybor2 = 't';
    char tab[ 10 ];
    do
    {
        system( "cls" );
        system( "color 04" );
        cout << "\n                        ***********************************     ";
        cout << "\n                         ******   [Enter]  START     ******";
        cout << "\n                           ****   [Spacja] ZASADY    ****";
        cout << "\n                            ***   [Esc]    KONIEC    ***";
        cout << "\n                             **                      ** ";
        cout << "\n                              ************************ \n\n\n";
        wybor = getch();
        switch( wybor )
        {
        case 13: system( "cls" );
            {
                cout << "Podaj imie gracza X\n";
                cin >> imie1;
                system( "cls" );
                cout << "Podaj imie gracza O\n";
                cin >> imie2;
                do
                {
                    ruch( tab, imie1, imie2 );
                    cout << "Jesli chcesz zagrac jeszcze raz napisz [t] a jesli nie dowolny przycisk\n";
                    cin >> wybor2;
                }
                while( wybor2 == 't' );
               
                break;
            }
        case 32: system( "cls" ); zasady(); break;
        case 27: system( "cls" ); return 0; break;
        }
    }
    while( wybor != 13 );
   
    return 0;
}
P-97461
leon_w
» 2013-11-25 20:05:55
Ja bym tu dodał drugą tablice, z wpisanymi cyframi. Będzie bardziej widoczne która cyfra gdzie wstawi znak. No i trzeba by pomyśleć coś, żeby przy podaniu niewłaściwego lub zajętego pola, nie przechodziła kolej na następnego gracza.
No i te kolory :/ masakra :P
P-97466
matiko101
Temat założony przez niniejszego użytkownika
» 2013-11-25 20:32:21
odnośnie kolorów to je usunę. Myślę, że dobrym rozwiązaniem byłoby wstawić ruch gracza w pętlę której wykonywała by się dopóki nie zostaną spełnione te warunki:
- Odpowiednie pole od 1 do 9
- Pole nie jest zajęte
Tylko nie byłoby tych napisów że pole
jest zajęte itd. i wydaje mi się że będzie to lepsze niż aktualna wersja.
Jak myślisz?
Nie do końca rozumiem tej drugiej tablicy na cyfry.

Sorry, za błędy ale pisze na telefonie
P-97478
leon_w
» 2013-11-25 20:41:13
Jeszcze poprawa wygraną dla kółka, bo nie działa (wcześniej działała). Co do ruchu to tak jak piszesz. w pętli dać samo wprowadzanie cyfry, można dodać ifa, jeśli zajęty coś wypisuje, i jeśli poza układem też coś wpisuje.
Z tą dodatkową tablicą, to chodzi mi o to, że na jednej (np lewej) odbywa się gra, a na drugiej (prawej) jest wyświetlana stale tablica, gdzie zamiast 'O' i 'X' wstawione są cyfry od 1 do 9. Wizualnie widać gdzie dana cyfra wstawi znak.
Jeszcze jak gra się zakończy to nie można wyjść z programu.
I przydało by się zabezpieczyć przed wstawieniem liter, bo się wykrzacza wtedy.
P-97481
« 1 » 2
  Strona 1 z 2 Następna strona