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

Problem z "kółko i krzyżyk" w konsoli

Ostatnio zmodyfikowano 2017-06-08 23:08
Autor Wiadomość
Rainbow
Temat założony przez niniejszego użytkownika
Problem z "kółko i krzyżyk" w konsoli
» 2017-06-08 21:14:42
Ostatnio, jako projekt do szkoły, pracuję nad kodem na kółko i krzyżyk w konsoli (pracuję tzn. raz na jakiś czas siadam i myślę nad tym jak jest okazja), jednak kiedy już napisałam w miarę optymalny kawałek kodu, okazało się, że coś nie działa:
C/C++
#include<iostream>
#include<conio.h>
#include<windows.h>
#include<cstdlib>
using namespace std;
void znak( int l ) {
    HANDLE hOut;
    hOut = GetStdHandle( STD_OUTPUT_HANDLE );
    switch( l ) {
    case 0:
        cout << " ";
        break;
    case 1:
        SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_INTENSITY );
        cout << "X";
        break;
    case 2:
        SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_INTENSITY );
        cout << "O";
        break;
    case 3:
        SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY );
        cout << "X";
        break;
    case 4:
        SetConsoleTextAttribute( hOut, FOREGROUND_RED | FOREGROUND_GREEN | FOREGROUND_INTENSITY );
        cout << "O";
        break;
    }
    SetConsoleTextAttribute( hOut, FOREGROUND_BLUE | FOREGROUND_RED | FOREGROUND_GREEN );
}
void wypisanie( int l[ 3 ][ 3 ] ) {
    system( "cls" );
    for( int j = 0; j < 3; j++ ) {
        for( int i = 0; i < 3; i++ ) {
            znak( l[ i ][ j ] );
            if( i < 2 ) cout << char( 186 );
            else cout << endl;
           
        }
        if( j < 2 ) cout << char( 205 ) << char( 206 ) << char( 205 ) << char( 206 ) << char( 205 ) << endl;
        else cout << endl;
       
    }
}
void pozycja( int l[ 3 ][ 3 ], int p[ 3 ] ) {
    for( int k = 0; k < 3; k++ ) {
        for( int m = 0; m < 3; m++ ) {
            if( l[ m ][ k ] == 3 || l[ m ][ k ] == 4 ) l[ m ][ k ] = 0;
           
        }
    }
    l[ p[ 1 ] ][ p[ 2 ] ] = p[ 3 ];
}
void start( int l[ 3 ][ 3 ], int p[ 3 ] ) {
    for( int n = 0; n < 3; n++ ) {
        for( int o = 0; o < 3; o++ ) {
            if( l[ o ][ n ] == 0 ) {
                p[ 1 ] = o;
                p[ 2 ] = n;
            }
        }
    }
}
int ruch( int l[ 3 ][ 3 ], int p[ 3 ] ) {
    char znak;
    znak = getch();
    switch( znak ) {
    case 77:
        for( int i1 = p[ 2 ]; i1 < 3; i1++ ) {
            for( int j1 = p[ 1 ]; j1 < 3; j1++ ) {
                if( l[ j1 ][ i1 ] == 0 ) {
                    p[ 1 ] = j1;
                    p[ 2 ] = i1;
                }
            }
        }
        break;
    case 75:
        for( int i2 = p[ 2 ]; i2 >= 0; i2-- ) {
            for( int j2 = p[ 1 ]; j2 >= 3; j2-- ) {
                if( l[ j2 ][ i2 ] == 0 ) {
                    p[ 1 ] = j2;
                    p[ 2 ] = i2;
                }
            }
        }
        break;
    case 80:
        for( int i3 = p[ 2 ]; i3 < 3; i3++ ) {
            for( int j3 = p[ 1 ]; j3 < 3; j3++ ) {
                if( l[ i3 ][ j3 ] == 0 ) {
                    p[ 1 ] = i3;
                    p[ 2 ] = j3;
                }
            }
        }
        break;
    case 72:
        for( int i4 = p[ 2 ]; i4 >= 0; i4-- ) {
            for( int j4 = p[ 1 ]; j4 < 3; j4-- ) {
                if( l[ i4 ][ j4 ] == 0 ) {
                    p[ 1 ] = i4;
                    p[ 2 ] = j4;
                }
            }
        }
        break;
    case 13:
        return 1;
        break;
    }
    return 0;
}
int main() {
    int l[ 3 ][ 3 ] = { { 0, 0, 0 }, { 0, 0, 0 }, { 0, 0, 0 } };
    int p[ 3 ] = { 0, 0, 3 };
    int koniec = 0;
    for( int i = 0; i < 9; i++ ) {
        start( l, p );
        while( 1 == 1 )
        {
            pozycja( l, p );
            wypisanie( l );
            koniec = ruch( l, p );
            if( koniec == 1 ) break;
           
        }
        l[ p[ 1 ] ][ p[ 2 ] ] -= 2;
        if( p[ 3 ] == 3 ) p[ 3 ] = 4;
        else p[ 3 ] = 3;
       
    }
    system( "pause" );
    return 0;
}

Otóż problemem jest to, że po uruchomieniu kodu, wyświetla się pusta plansza (mimo, iż lewe górne pole powinno być aktywne), po wciśnięciu strzałki pierwszych parę razy, program aktualizuje plansze, która wciąż jest pusta. Nagle program przestaje reagować również na strzałki, a po paru sekundach wyświetla się komunikat Windows, że "program przestał działać".

Ktoś ma może jakiś pomysł dlaczego tak się dzieje?




P.S. Wpadłam na pomysł, że może się również przydać informacja w jaki sposób ma działać program, więc - program zawiera dwie główne tablice przechowujące dane, dwuwymiarową l, która przechowuje informacje o stanie planszy oraz jednowymiarową p, w której dwie pierwsze wartości odpowiadają współrzędnym pola aktywnego (współrzędnym w tablicy l oczywiście), a trzecia mówiąca, który gracz w danym momencie wykonuje ruch (czyli który znak ma wyświetlić, jako aktywny). Funkcja pozycja zeruje tablicę l z pól aktywnych a następnie ustala właściwe aktywne pole pobierając dane z tablicy p. Funkcja wypisanie wyświetla plansze, natomiast funkcja znak wyświetla zawartość planszy (wartość 1 jest stałym znakiem dla X, 2 jest znakiem stałym dla O, 3 jest znakiem aktywnym dla X, a 4 jest znakiem aktywnym dla O). Funkcja ruch pobiera z klawiatury informację dotyczącą ruchu gracza, w przypadku strzałki aktualizuje pozycję pola aktywnego szukając najbliższego wolnego pola w wybranym kierunku i zwraca zero, natomiast w przypadku entera zwraca 1, co następnie zamyka pętle while. Wykonuje się zamiana pola aktywnego na pole stałe, a następnie zmiana aktywnego gracza. Całość w teorii powinna się powtórzyć 9 razy, czyli do zapełnienia planszy (nie ma jeszcze systemu wykrywania wygranej, najpierw chcę rozwiązać ten problem).
P-162270
Monika90
» 2017-06-08 22:34:28
Tablica p ma trzy elementy, p[0] p[1] i p[2], a Ty używasz p[1] p[2] i p[3]
P-162272
Rainbow
Temat założony przez niniejszego użytkownika
» 2017-06-08 22:41:02
Dzięki wielkie, to rozwiązuje problem wyświetlania. Jednak ciągle z jakiegoś powodu program nie reaguje na strzałki a po jakimś czasie przestaje działać...
P-162273
Monika90
» 2017-06-08 22:58:57
C/C++
case 72:
for( int i4 = p[ 2 ]; i4 >= 0; i4-- ) {
    for( int j4 = p[ 1 ]; j4 < 3; j4-- ) { //to jest pętla nieskończona, warunek jest zły, pewnie miało być j4 >= 0
        if( l[ i4 ][ j4 ] == 0 ) {
            p[ 1 ] = i4;
            p[ 2 ] = j4;
        }
    }
}
P-162274
Rainbow
Temat założony przez niniejszego użytkownika
» 2017-06-08 23:08:00
Jeszcze raz ogromne dzięki <3
Co prawda ciągle są małe problemy, ale z nimi jestem już sobie w stanie chyba sama poradzić
P-162275
« 1 »
  Strona 1 z 1