Inicjalizacja tablicy ze stałą zmienialną w kodzie. Kurs "Od zera do gier kodera".
Ostatnio zmodyfikowano 2014-08-04 16:58
poiuy0987.93 Temat założony przez niniejszego użytkownika |
Inicjalizacja tablicy ze stałą zmienialną w kodzie. Kurs "Od zera do gier kodera". » 2014-08-04 16:21:41 Hej, przerabiam kurs "Od zera do gier kodera" i po dziale "Większy projekt", w którym to przedstawiony był program "kółko i krzyżyk" mam go przerobić tak aby w pliku nagłówkowym była stała określająca wielkość planszy (a nie jak dotychczas tylko 3x3), którą można by sobie zmieniać w zależności od potrzeb. Nie wiem jak zainicjować tablicę, której nie znam rozmiaru. Próbowałem za pomocą for'ów ale wyskakuje mi coś takiego: "Unhandled exception at 0x008d19ea in Cwiczenie_5_4.exe: 0xC0000005: Access violation reading location 0x33c0e468." #include "game.h" #include <iostream> #include <ctime>
FIELD g_aPlansza[ SIZE ][ SIZE ];
GAMESTATE g_StanGry = GS_NOTSTARTED; SIGN g_AktualnyGracz;
bool StartGry() { for( int i = 0; i < SIZE; i++ ) for( int j = 0; j < SIZE; j++ ) g_aPlansza[ i ][ j ] = FLD_EMPTY; if( g_StanGry != GS_NOTSTARTED ) return false; srand( static_cast < unsigned >( time( NULL ) ) ); g_AktualnyGracz =( rand() % 2 == 0 ? SGN_CIRCLE : SGN_CROSS ); g_StanGry = GS_MOVE; return true; }
bool Ruch( unsigned uNumerPola ) { if( g_StanGry != GS_MOVE ) return false; if( !( uNumerPola >= 1 && uNumerPola <= SIZE * SIZE ) ) return false; unsigned uY =( uNumerPola - 1 ) / SIZE; unsigned uX =( uNumerPola - 1 ) % SIZE; if( g_aPlansza[ uY ][ uX ] == FLD_EMPTY ) g_aPlansza[ uY ][ uX ] = static_cast < FIELD >( g_AktualnyGracz ); else return false; unsigned int LINE[( SIZE * 2 ) + 2 ][ SIZE ][ 2 ]; int i, j, k; for( i = 0; i < SIZE; ++i ) for( j = 0; j < SIZE; ++j ) LINE[ i ][ j ][ 0 ] = i; for( i = SIZE; i <( SIZE * 2 ) + 2; ++i ) for( j = 0; j < SIZE; ++j ) LINE[ i ][ j ][ 0 ] = j; for( i = 0; i < SIZE; ++i ) for( j = 0; j < SIZE; ++j ) LINE[ i ][ j ][ 1 ] = j; for( i = SIZE; i < SIZE * 2; ++i ) for( k = 0; k < SIZE; ++k ) for( j = 0; j < SIZE; ++j ) LINE[ i ][ j ][ 1 ] = k; for( k = SIZE; k = 0; k-- ) for( j = 0; j < SIZE; ++j ) LINE[( SIZE * 2 ) + 2 ][ j ][ 1 ] = k; FIELD Pole, ZgodnePole; unsigned uLiczbaZgodnychPol; for( int i = 0; i <( SIZE * 2 ) + 1; ++i ) { Pole = ZgodnePole = FLD_EMPTY; uLiczbaZgodnychPol = 0; for( int j = 0; j < SIZE; ++j ) { Pole = g_aPlansza[ LINE[ i ][ j ][ 0 ] ][ LINE[ i ][ j ][ 1 ] ]; if( Pole != ZgodnePole ) { ZgodnePole = Pole; uLiczbaZgodnychPol = 1; } else ++uLiczbaZgodnychPol; } if( uLiczbaZgodnychPol == SIZE && ZgodnePole != FLD_EMPTY ) { g_StanGry = GS_WON; return true; } } unsigned uLiczbaZapelnionychPol = 0; for( int i = 0; i < SIZE; ++i ) for( int j = 0; j < SIZE; ++j ) if( g_aPlansza[ i ][ j ] != FLD_EMPTY ) ++uLiczbaZapelnionychPol; if( uLiczbaZapelnionychPol == SIZE * SIZE ) { g_StanGry = GS_DRAW; return true; } g_AktualnyGracz =( g_AktualnyGracz == SGN_CIRCLE ? SGN_CROSS: SGN_CIRCLE ); return true; }
bool RysujPlansze() { if( g_StanGry == GS_NOTSTARTED ) return false; system( "cls" ); cout << " KOLKO I KRZYZYK " << endl; cout << "-----------------------" << endl << endl; for( int i = 0; i < SIZE; ++i ) { cout << " |"; for( int j = 0; j < SIZE; ++j ) { if( g_aPlansza[ i ][ j ] == FLD_EMPTY ) { printf( "%3d", i * SIZE + j + 1 ); } else cout << static_cast < char >( g_aPlansza[ i ][ j ] ); } cout << "|" << endl; } switch( g_StanGry ) { case GS_MOVE: cout << "Podaj numer pola, w ktorym" << endl; cout << "chcesz postawic "; cout <<( g_AktualnyGracz == SGN_CIRCLE ? "kolko": "krzyzyk" ) << ": "; break; case GS_WON: cout << "Wygral gracz stawiajacy "; cout <<( g_AktualnyGracz == SGN_CIRCLE ? "kolko": "krzyzyk" ) << "!"; break; case GS_DRAW: cout << "Remis!"; break; } return true; }
|
|
Jacob99 |
» 2014-08-04 16:23:51 |
|
1aam2am1 |
» 2014-08-04 16:24:21 new i delete |
|
poiuy0987.93 Temat założony przez niniejszego użytkownika |
» 2014-08-04 16:30:35 Ale o rozmiarze ma decydować nie użytkownik podczas działania programu ale ja sam w kodzie. Wielkość tablicy jest stała. Wklejam kod z pliku nagłówkowego. PS. Jeszcze w tym kursie nic nie było tablicach dynamicznych ani niczym takim także chyba inaczej to można zrobić. #include <iostream> #include <cstdlib> #include <cmath> #include <ctime>
using namespace std;
const unsigned SIZE = 4; enum SIGN { SGN_CIRCLE = 'O', SGN_CROSS = 'X' }; enum FIELD { FLD_EMPTY, FLD_CIRCLE = SGN_CIRCLE, FLD_CROSS = SGN_CROSS }; enum GAMESTATE { GS_NOTSTARTED, GS_MOVE, GS_WON, GS_DRAW };
extern GAMESTATE g_StanGry;
bool StartGry();
bool Ruch( unsigned );
bool RysujPlansze();
|
|
Jacob99 |
» 2014-08-04 16:45:00 Jeśi tablica ma stały rozmiar to nie rozumiem co chcesz zrobić.
P.S. Tablice dynamiczne używa się właśnie po to by móc je zwiększać i zmniejszać także w kodzie. |
|
poiuy0987.93 Temat założony przez niniejszego użytkownika |
» 2014-08-04 16:58:06 W takim razie poczytam o tych tablicach dynamicznych. Dzięki za pomoc, zamykam :) |
|
« 1 » |