Lich555 Temat założony przez niniejszego użytkownika |
Kółko i krzyżyk » 2017-09-17 20:44:05 Witam. Wiem, że proszę o dużo. Nie jest to sprawdzenie kilku linijek. Będę bardzo wdzięczny jak komuś się będzie chciało sprawdzić ten kod :) Program mi się uruchamia, ale po pytaniu gdzie chcę wstawić kółko/krzyżyk nie widzę kółka/krzyżyku. Dalej są tam numerki planszy. main.cpp: #include <iostream> #include <conio.h> #include "game.h" extern GAMESTATE g_StanGry;
using namespace std;
int main() { StartGry(); for(;; ) { RysujPlansze(); if( g_StanGry == GS_MOVE ) { unsigned uNumerPola; cin >> uNumerPola; Ruch( uNumerPola ); } else if( g_StanGry == GS_WON || g_StanGry == GS_DRAW ) break; } getch(); return 0; }
game.h: #ifndef GAME_H_INCLUDED #define GAME_H_INCLUDED
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 };
bool StartGry();
bool Ruch( unsigned );
bool RysujPlansze();
#endif
game.cpp #include "game.h" #include <iostream> #include <ctime> #include <cstdlib>
using namespace std;
FIELD g_aPlansza[ 3 ][ 3 ] = { { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }, { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY }, { FLD_EMPTY, FLD_EMPTY, FLD_EMPTY } }; GAMESTATE g_StanGry = GS_NOTSTARTED; SIGN g_AktualnyGracz;
bool StartGry() { 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 <= 9 ) ) return false; unsigned uY =( uNumerPola - 1 ) / 3; unsigned uX =( uNumerPola - 1 ) % 3; if( g_aPlansza[ uY ][ uX ] == FLD_EMPTY ) g_aPlansza[ uY ][ uX ] == static_cast < FIELD >( g_AktualnyGracz ); else return false; const int LINIE[][ 3 ][ 2 ] = { { { 0, 0 }, { 0, 1 }, { 0, 2 } }, { { 1, 0 }, { 1, 1 }, { 1, 2 } }, { { 2, 0 }, { 2, 1 }, { 2, 2 } }, { { 0, 0 }, { 1, 0 }, { 2, 0 } }, { { 0, 1 }, { 1, 1 }, { 2, 1 } }, { { 0, 2 }, { 1, 2 }, { 2, 2 } }, { { 0, 0 }, { 1, 1 }, { 2, 2 } }, { { 2, 0 }, { 1, 1 }, { 0, 2 } } }; FIELD Pole, ZgodnePole; unsigned uLiczbaZgodnychPol; for( int i = 0; i < 8; ++i ) { Pole = ZgodnePole = FLD_EMPTY; uLiczbaZgodnychPol = 0; for( int j = 0; j < 3; ++j ) { Pole = g_aPlansza[ LINIE[ i ][ j ][ 0 ] ][ LINIE[ i ][ j ][ 1 ] ]; if( Pole != ZgodnePole ) { ZgodnePole = Pole; uLiczbaZgodnychPol = 1; } else ++uLiczbaZgodnychPol; } if( uLiczbaZgodnychPol == 3 && ZgodnePole != FLD_EMPTY ) { g_StanGry = GS_WON; return true; } } unsigned uLiczbaZapelnionychPol = 0; for( int i = 0; i < 3; ++i ) { for( int j = 0; j < 3; ++j ) if( g_aPlansza[ i ][ j ] != FLD_EMPTY ) ++uLiczbaZapelnionychPol; } if( uLiczbaZapelnionychPol == 9 ) { 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; cout << " -----" << endl; for( int i = 0; i < 3; ++i ) { cout << " |"; for( int j = 0; j < 3; ++j ) { if( g_aPlansza[ i ][ j ] == FLD_EMPTY ) cout << i * 3 + j + 1; else cout << static_cast < char >( g_aPlansza[ i ][ j ] ); } cout << "|" << endl; } cout << " -----" << endl << endl; switch( g_StanGry ) { case GS_MOVE: cout << "Podaj numer pola, w ktorym chcesz postawic " <<( g_AktualnyGracz == SGN_CROSS ? "krzyzyk": "kolko" ) << ": "; break; case GS_WON: cout << "Wygral gracz stawiajacy " <<( g_AktualnyGracz == SGN_CROSS ? "krzyzyki!": "kolka!" ); break; case GS_DRAW: cout << "Remis!"; break; } return true; }
|
|
Kinexity |
» 2017-09-17 21:16:28 Program działa, tylko twój mózg nie zauważa zmiany znaku dopóki się nie przyjrzysz. A tak w ogóle to sądząc po tym na jakim etapie nauki jesteś ("od zera do gier kodera" - 1.5), sam powinieneś szukać błędów, ponieważ masz już wystarczającą wiedzę. |
|
Monika90 |
» 2017-09-18 10:45:40 Kompilator zna odpowiedź, wystarczy go zapytać game.cpp: In function 'bool Ruch(unsigned int)': game.cpp:40:33: warning: statement has no effect [-Wunused-value] g_aPlansza[ uY ][ uX ] == static_cast < FIELD >( g_AktualnyGracz ); ^
|
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2017-09-20 22:45:50 Chodzi o to, że wstawiałem spację przy static_cast? Napisałem tak i już się nie rzuca: g_aPlansza[ uY ][ uX ] = static_cast < FIELD >( g_AktualnyGracz );
Jeszcze się rzuca o to: C:\U sers\Kacper\Desktop\C++\I nne\Kolko i krzyzyk\game.cpp || In function 'bool RysujPlansze()':| C:\U sers\Kacper\Desktop\C++\I nne\Kolko i krzyzyk\game.cpp | 136 | warning: enumeration value 'GS_NOTSTARTED' not handled in switch[ - Wswitch ] |
Chodzi o to, że "wydałem rozkazy" w switchu dla wszystkich wartości mojego typu enum GAMESTATE , a dla GS_NOTSTARTED nie powiedziałem co robić? Jak się tego pozbyć? Nie chcę, żeby cokolowiek tam było robione :P @Edit Jak robi się to, że wiadomość z loga (warningi i errory) są na takim czarnym tle, a nie takie jak ja tutaj mam? |
|
carlosmay |
» 2017-09-20 23:07:32 |
|
Monika90 |
» 2017-09-21 09:21:58 Chodzi o to, że wstawiałem spację przy static_cast?
|
Chodzi o to że użyłeś operatora == zamiast =, więc tablica nie była modyfikowana. To drugie ostrzeżenie to fałszywy alarm. Można w switchu dodać case GS_NOTSTARTED: break; . |
|
Lich555 Temat założony przez niniejszego użytkownika |
» 2017-09-22 21:23:14 O rany, faktycznie. Dzięki wielkie :) |
|
« 1 » |