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

problem ze sprawdzeniem pola i losowym graniem jednego playera

Ostatnio zmodyfikowano 2014-12-02 11:49
Autor Wiadomość
kevindurant95
Temat założony przez niniejszego użytkownika
problem ze sprawdzeniem pola i losowym graniem jednego playera
» 2014-11-28 01:25:03
Cześć, wcześniej już posiłkowałem się tym forum, żeby rozwiązać swoje problemy z takim programem:

C/C++
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <windows.h>

using namespace std;
const int MAX_WIERSZ = 6;
const int MAX_KOLUMNA = 6;

void inicjuj_plansze( char ** plansza );
void rysuj_plansze( char ** plansza );
void wybierz_pole1( int * numer_wiersza, int * numer_kolumny );
void rysuj_kamien( char ** plansza, int * numer_wiersza, int * numer_kolumny );
bool sprawdzenie_miejsca( char ** plansza );


void inicjuj_plansze( char ** plansza )
{ for( int i = 0; i < MAX_WIERSZ; i++ ) {
        for( int j = 0; j < MAX_KOLUMNA; j++ )
             plansza[ i ][ j ] = ' ';
       
    }
}
void rysuj_plansze( char ** plansza )
{ for( int i = 0; i < MAX_WIERSZ; i++ )
    {
        cout << " +-----+-----+-----+-----+-----+-----+" << endl;
        cout << i + 1 << "|";
        for( int j = 0; j < MAX_KOLUMNA; j++ )
        if( plansza[ i ][ j ] == '#' )
             cout << " ### |";
        else
             cout << "     |";
       
        cout << endl;
        cout << " |";
        for( int j = 0; j < MAX_KOLUMNA; j++ )
        if( plansza[ i ][ j ] == '#' )
             cout << " ### |";
        else
             cout << "     |";
       
        cout << endl;
    }
    cout << " +-----+-----+-----+-----+-----+-----+" << endl;
    cout << "    A     B     C     D     E     F   " << endl;
    cout << endl;
}
void wybierz_pole1( int * numer_wiersza, int * numer_kolumny )
{
    char litera;
    cout << "podaj wiersz: ";
    cin >> * numer_wiersza;
    cout << "podaj kolumne (A=1, B=2, C=3, D=4, E=5, F=6): ";
    cin >> * numer_kolumny;
    if( * numer_kolumny == 1 )
    {
        litera = 'A';
    }
    if( * numer_kolumny == 2 )
    {
        litera = 'B';
    }
    if( * numer_kolumny == 3 )
    {
        litera = 'C';
    }
    if( * numer_kolumny == 4 )
    {
        litera = 'D';
    }
    if( * numer_kolumny == 5 )
    {
        litera = 'E';
    }
    if( * numer_kolumny == 6 )
    {
        litera = 'F';
    }
   
    if( * numer_wiersza >= 1 && * numer_wiersza <= MAX_WIERSZ && * numer_kolumny >= 1 && * numer_kolumny <= MAX_KOLUMNA ) {
        cout << "wybrane pole to: " << * numer_wiersza << litera << endl << endl << endl;
        Sleep( 1000 ); }
   
    else {
        cout << "takie pole nie istnieje, podaj inne pole: " << endl << endl << endl;
        Sleep( 1000 ); }
   
}

void rysuj_kamien( char ** plansza, int * numer_wiersza, int * numer_kolumny )
{
    if( * numer_wiersza >= 1 and * numer_wiersza <= MAX_WIERSZ and * numer_kolumny >= 1 and * numer_kolumny <= MAX_KOLUMNA )
         plansza[ * numer_wiersza - 1 ][ * numer_kolumny - 1 ] = '#';
   
    cout << plansza[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ];
}
bool sprawdzenie_miejsca( char ** plansza )
{ for( int i = 0; i < MAX_WIERSZ; i++ )
    { for( int j = 0; j < MAX_KOLUMNA; j++ )
        { if( plansza[ i ][ j ] == ' ' )
                 return false; // No point in checking further
           
        }
    }
    return true; // No spaces found
}




int main()
{
    char ** plansza = new char *[ MAX_WIERSZ ]; //alokacja pamięci dla tablicy dynamicznej
    for( int i = 0; i < MAX_WIERSZ; i++ )
         plansza[ i ] = new char[ MAX_KOLUMNA ];
   
    int * numer_wiersza = new int;
    int * numer_kolumny = new int;
   
    inicjuj_plansze( plansza );
    for( int i = 0; i < 36; i++ )
    {
        cout << endl;
        rysuj_plansze( plansza );
        wybierz_pole1( numer_wiersza, numer_kolumny );
        sprawdzenie_miejsca( plansza );
        rysuj_kamien( plansza, numer_wiersza, numer_kolumny );
        system( "cls" );
    }
   
    system( "pause" );
    return 0;
}


Jak mogę skorygować funkcję 'bool sprawdzenie_miejsca' tak, żeby program wyświetlał mi "to pole jest zajete", gdy na podanym przez niego polu stoi już jakiś symbol (kamień)? Drugim moim pytaniem jest sposób, w jaki drugi gracz ma losowo wybierać pole, które ma zająć. Jak to zrobić?
P-121601
darko202
» 2014-11-28 07:32:35
Musisz gdzieś przechowywać informację
o bieżącym stanie planszy np. w tablicy dwuwymiarowej

mógłbyś pomyśleć też nad stworzeniem odpowiednie klasy/klas
i umieszczeniem tam ww. informacji i stworzonych już funkcji.
P-121604
NopeDotAvi
» 2014-11-28 07:38:04
1. Słabo opisane pytanie. Zrozumiałem to na dwa sposoby:
a) By wypisało gdy gracz chce tam się ruszyć
b) By wypisywało cały czas

Jako iż te drugie trochę bez sensu to dla a:
najlepiej będzie podczas ruchu gracza po prostu tak:
C/C++
void ruszGraczem( /*parametry*/ )
{
    //tutaj gracz wpisuje pozycję jaką chce osiągnąć a po wpisaniu wiersza i kolumny przez gracza sprawdzasz
    if( plansza[ wiersz ][ kolumna ] != znakPrzeciwnika )
    {
        //reszta kodu
    }
    else //te pole jest zajete
         cout << "Te pole jest zajete" << endl;
   

2. Najłatwiej będzie Ci zrobić, by po prostu losował dwie liczby z przedziału 1-6 i potem sprawdzał czy zajęte, jeżeli tak to caly czas losował dopóki miejsce wylosowane  byłoby nie zajęte.
P-121605
Tomek_z_W11
» 2014-11-28 13:26:36
Co do pierwszego pytania, po pierwsze, to do funkcji musisz dać jakiś argument JAKIE pole wybrał gracz, bo w tym momencie to dajesz tablice dwuwymiarową, ale co z tego, skoro nie wiadomo co wybrał gracz. Po drugie robisz typ zwracany bool, a potem tego "nie przechwytujesz" w mainie, czyli co z tego, że funkcja zwróci false, jak Ty tego nie interpretujesz w mainie. Funkcja sie wywola, zwroci false i nic sie nie dzieje. W jaki sposób wykorzystać? Chociażby tak:

C/C++
if( sprawdzenie == true )
     rysuj_plansze;


Czyli po modyfikacji, wyglądałoby to pi x drzwi tak:

C/C++
bool sprawdzenie_miejsca( char ** plansza, numer_wiersza, numer_kolumny ) //jako argumenty - wybrane pole
{
    if( plansza[ numer_wiersza ][ numer_kolumny ] == '#' ) //sprawdzamy, czy jest zajete
    {
        cout << "To pole jest juz zajete" << endl;
        return false; //zwraca falsz - pole jest zajete
    }
    return true; //zwraca prawde - pole jest wolne
}

//przechwytywanie informacji w mainie

int main()
{
    char ** plansza = new char *[ MAX_WIERSZ ]; //alokacja pamięci dla tablicy dynamicznej
    for( int i = 0; i < MAX_WIERSZ; i++ )
         plansza[ i ] = new char[ MAX_KOLUMNA ];
   
    int * numer_wiersza = new int;
    int * numer_kolumny = new int;
   
    inicjuj_plansze( plansza );
    for( int i = 0; i < 36; i++ )
    {
        cout << endl;
        rysuj_plansze( plansza );
        wybierz_pole1( numer_wiersza, numer_kolumny );
        if( sprawdzenie_miejsca( plansza, numer_wiersza, numer_kolumny ) ); //jezeli funkcja zwroci falsz to nie wejdziemy do
       
        rysuj_kamien( plansza, numer_wiersza, numer_kolumny ); // ifa, czyli nie rysujemy na tym polu
       
        //czy wejdziemy do ifa, czy nie - dalej bedzie sie robic kolejny obrot petli
       
        system( "cls" );
    }
   
    system( "pause" );
    return 0;
}

Jezeli chodzi o losowe wybieranie pola - masz funkcje zywcem ze stackoverflow. Funkcja losuje liczbe calkowita z przedzialu <fMin, fMax>

C/C++
int fRand( int fMin, int fMax )
{
    return fMin +( rand() %( int )( fMax - fMin + 1 ) );
}
P-121615
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-11-29 19:29:32
Wszystko się zgadza, ale nadal po powtórnym wpisaniu po sobie pola np. 4D, program nie wypisuje mi komunikatu: "to pole jest juz zajete". Jak mogę to zmienić?
P-121706
NopeDotAvi
» 2014-11-29 19:56:49
Podaj aktualny kod
P-121708
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-11-29 20:01:44
C/C++
#include <cstdlib>
#include <iostream>
#include <iomanip>
#include <windows.h>
#include <ctime>

using namespace std;
const int MAX_WIERSZ = 6;
const int MAX_KOLUMNA = 6;

void inicjuj_plansze( char ** plansza );
void rysuj_plansze( char ** plansza );
void wybierz_pole1( char ** plansza, int * numer_wiersza, int * numer_kolumny );
bool sprawdzenie_miejsca( char ** plansza, int * numer_wiersza, int * numer_kolumny );
void wybierz_pole2( char ** plansza, int * numer_wiersza, int * numer_kolumny );


void inicjuj_plansze( char ** plansza )
{ for( int i = 0; i < MAX_WIERSZ; i++ ) {
        for( int j = 0; j < MAX_KOLUMNA; j++ )
             plansza[ i ][ j ] = ' ';
       
    }
}

void rysuj_plansze( char ** plansza )
{ for( int i = 0; i < MAX_WIERSZ; i++ )
    {
        cout << " +-----+-----+-----+-----+-----+-----+" << endl;
        cout << i + 1 << "|";
        for( int j = 0; j < MAX_KOLUMNA; j++ )
        if( plansza[ i ][ j ] == '#' )
             cout << " ### |";
        else
             cout << "     |";
       
        cout << endl;
        cout << " |";
        for( int j = 0; j < MAX_KOLUMNA; j++ )
        if( plansza[ i ][ j ] == '#' )
             cout << " ### |";
        else
             cout << "     |";
       
        cout << endl;
    }
    cout << " +-----+-----+-----+-----+-----+-----+" << endl;
    cout << "    A     B     C     D     E     F   " << endl;
    cout << endl;
}
void wybierz_pole1( char ** plansza, int * numer_wiersza, int * numer_kolumny )
{
    char litera;
    cout << "podaj wiersz: ";
    cin >> * numer_wiersza;
    cout << "podaj kolumne (A=1, B=2, C=3, D=4, E=5, F=6): ";
    cin >> * numer_kolumny;
    if( * numer_kolumny == 1 )
         litera = 'A';
   
    if( * numer_kolumny == 2 )
         litera = 'B';
   
    if( * numer_kolumny == 3 )
         litera = 'C';
   
    if( * numer_kolumny == 4 )
         litera = 'D';
   
    if( * numer_kolumny == 5 )
         litera = 'E';
   
    if( * numer_kolumny == 6 )
         litera = 'F';
   
    if( * numer_wiersza >= 1 && * numer_wiersza <= MAX_WIERSZ && * numer_kolumny >= 1 && * numer_kolumny <= MAX_KOLUMNA ) {
        cout << "wybrane pole to: " << * numer_wiersza << litera << endl << endl << endl;
        Sleep( 750 ); }
   
    else {
        cout << "takie pole nie istnieje, podaj inne pole: " << endl << endl << endl;
        Sleep( 750 ); }
   
    if( * numer_wiersza >= 1 and * numer_wiersza <= MAX_WIERSZ and * numer_kolumny >= 1 and * numer_kolumny <= MAX_KOLUMNA )
         plansza[ * numer_wiersza - 1 ][ * numer_kolumny - 1 ] = '#';
   
    cout << plansza[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ];
   
}

bool sprawdzenie_miejsca( char ** plansza, int * numer_wiersza, int * numer_kolumny ) //jako argumenty - wybrane pole
{
    if( plansza[ * numer_wiersza ][ * numer_kolumny ] == '#' ) //sprawdzamy, czy jest zajete
    {
        cout << "To pole jest juz zajete" << endl;
        return false; //zwraca falsz - pole jest zajete
    }
    return true; //zwraca prawde - pole jest wolne
}

void wybierz_pole2( char ** plansza, int * numer_wiersza, int * numer_kolumny )
{
    srand( time( NULL ) );
    int numer_wiersza2 = rand() % 6 + 1;
    int numer_kolumny2 = rand() % 6 + 1;
    char litera;
    if( numer_kolumny2 == 1 )
         litera = 'A';
   
    if( numer_kolumny2 == 2 )
         litera = 'B';
   
    if( numer_kolumny2 == 3 )
         litera = 'C';
   
    if( numer_kolumny2 == 4 )
         litera = 'D';
   
    if( numer_kolumny2 == 5 )
         litera = 'E';
   
    if( numer_kolumny2 == 6 )
         litera = 'F';
   
    if( numer_wiersza2 >= 1 && numer_wiersza2 <= MAX_WIERSZ && numer_kolumny2 >= 1 && numer_kolumny2 <= MAX_KOLUMNA ) {
        cout << "wybrane pole to: " << numer_wiersza2 << litera << endl << endl << endl;
        Sleep( 750 ); }
   
    else {
        cout << "takie pole nie istnieje, podaj inne pole: " << endl << endl << endl;
        Sleep( 750 ); }
   
    plansza[ numer_wiersza2 - 1 ][ numer_kolumny2 - 1 ] = '#';
   
    cout << plansza[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ];
   
}






int main()
{
    char ** plansza = new char *[ MAX_WIERSZ ]; //alokacja pamięci dla tablicy dynamicznej
    for( int i = 0; i < MAX_WIERSZ; i++ )
         plansza[ i ] = new char[ MAX_KOLUMNA ];
   
    int * numer_wiersza = new int;
    int * numer_kolumny = new int;
   
    inicjuj_plansze( plansza );
    for( int i = 0; i < 36; i++ )
    {
        cout << endl << "                Gracz 1" << endl;
        rysuj_plansze( plansza );
        wybierz_pole1( plansza, numer_wiersza, numer_kolumny );
        Sleep( 500 );
        system( "cls" );
        cout << endl << "                Gracz 2" << endl;
        rysuj_plansze( plansza );
        wybierz_pole2( plansza, numer_wiersza, numer_kolumny );
        Sleep( 500 );
        system( "cls" );
    }
   
    system( "pause" );
    return 0;
}

Moje pytanie brzmi: Jak zaznaczyć, że to pole jest zajęte? Bo nie wychodzi. Opcję z losowaniem pola przez komputer ogarnąłem, jednak często pola się powielają i nie jest to nijak ograniczone.
P-121709
Tomek_z_W11
» 2014-11-29 23:33:17
Ufff..

Po funkcji wybierz_pole() sprawdzasz przy pomocy funkcji sprawdzenie_miejsca(), czy pole jest zajete, jezeli jest zajete, nie rysujesz planszy i przy pomocy slowka continue "przechodzisz" do poczatku petli, zobacz sobie przy pomocy tego prostego programu jak dziala continue dla petli:

C/C++
#include <iostream>

using namespace std;

int main()
{
    int i;
   
    for( i = 0; i < 10; i++ )
    {
        if( i > 5 )
             continue;
       
        cout << i << endl;
    }
    return 0;
}


Jezeli pole nie jeste zajete - rysujesz plansze:

C/C++
int main()
{
    char ** plansza = new char *[ MAX_WIERSZ ]; //alokacja pamięci dla tablicy dynamicznej
    for( int i = 0; i < MAX_WIERSZ; i++ )
         plansza[ i ] = new char[ MAX_KOLUMNA ];
   
    int * numer_wiersza = new int;
    int * numer_kolumny = new int;
   
    inicjuj_plansze( plansza );
    for( int i = 0; i < 36; i++ )
    {
        cout << endl << "                Gracz 1" << endl;
        rysuj_plansze( plansza );
        wybierz_pole1( plansza, numer_wiersza, numer_kolumny );
       
        if( sprawdzenie_miejsca == false ) //jezeli funkcja zwroci falsz, to pole jest zajete - NIE RYSUJEMY
             continue; //"przechodzimy" do poczatku petli, funkcja sprawdzenie_miejsca() wyswietli odpowiedni komunikat
        //jezeli funkcja zwrocila true, to nie wejdziemy do ifa, czyli pole nie jest zajete, czyli RYSUJEMY,
        //a to oznacza, ze petla sie dalej normalnie wykonuje
        //jezeli nie rozumiesz polecenia continue, odpal sobie programik, który Ci napisałem powyżej
       
        Sleep( 500 );
        system( "cls" );
        cout << endl << "                Gracz 2" << endl;
        rysuj_plansze( plansza );
        wybierz_pole2( plansza, numer_wiersza, numer_kolumny );
        Sleep( 500 );
        system( "cls" );
    }
   
    system( "pause" );
    return 0;
}
P-121725
« 1 » 2
  Strona 1 z 2 Następna strona