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
» 2014-11-30 02:15:26
Mam już kod poprawiony, włożyłem w niego dużo czasu i radziłem się wielu mądrych głów, w tym tych z tego forum. Mam jeszcze pytanie dotyczące tego, w jaki sposób "zabezpieczyć się" przed zapętleniem programu, gdy w rubrykę "podaj wiersz" w konsoli wpiszę się dowolną literę. I też jeszcze, jak przyspieszyć działanie funkcji rand? Na początku działania programu, konkretne pole wylosowane jest dość szybko, im dalej w las tym trochę z tym gorzej. Co powinienem zmienić? Oto mój kod (mam dwa rozwiązania dla funkcji wybierz_pole2, stąd jedno jest skomentowane):

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[ MAX_WIERSZ ][ MAX_KOLUMNA ] )
{ for( int i = 0; i < MAX_WIERSZ; i++ )
    { for( int j = 0; j < MAX_KOLUMNA; j++ )
             plansza[ i ][ j ] = ' ';
       
    }
}

void rysuj_plansze( const char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] )
{ 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 << endl;
}

bool sprawdz_pole( const char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ], int wiersz, int kolumna )
{ if( wiersz < 1 || wiersz > MAX_WIERSZ )
    { cout << "Nieprawidlowy wiersz" << endl;
        return false;
    }
    if( kolumna < 1 || kolumna > MAX_KOLUMNA )
    { cout << "Nieprawidlowa kolumna" << endl;
        return false;
    }
    if( plansza[ wiersz - 1 ][ kolumna - 1 ] != ' ' )
    { cout << "Pole jest zajete, podaj inne wspolrzedne: " << endl;
        return false;
    }
    return true; //  okay to place stone here
}

void wybierz_pole1( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] )
{ char litera;
    int wiersz;
    int kolumna;
   
    do
    { cout << "Podaj wiersz: ";
        cin >> wiersz;
        cout << "Podaj kolumne (A-F): ";
        cin >> litera;
        litera = toupper( litera );
        kolumna = litera - 'A' + 1;
    }
    while( !sprawdz_pole( plansza, wiersz, kolumna ) );
   
    plansza[ wiersz - 1 ][ kolumna - 1 ] = '#';
   
    cout << "wybrane pole to: " << wiersz << litera << endl;
}
/*
void wybierz_pole2 (char plansza[MAX_WIERSZ][MAX_KOLUMNA])
{
     char litera;
     int wiersz;
     int kolumna;
    
     do{
     srand(time(NULL));
     wiersz = rand()%6+1;
     kolumna = rand()%6+65; // ASCII
     //litera = toupper(litera);
     kolumna = litera - 64;
     }
     while (! sprawdz_pole (plansza, wiersz, kolumna));   
     plansza[wiersz-1][kolumna-1] = '#';
    
     cout << "wybrane pole to: " << wiersz << litera << endl;
}
*/


void wybierz_pole2( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] )
{
    srand( time( NULL ) );
    int wiersz = rand() % 6 + 1;
    int kolumna = rand() % 6 + 1;
    char litera;
    if( kolumna == 1 )
         litera = 'A';
   
    if( kolumna == 2 )
         litera = 'B';
   
    if( kolumna == 3 )
         litera = 'C';
   
    if( kolumna == 4 )
         litera = 'D';
   
    if( kolumna == 5 )
         litera = 'E';
   
    if( kolumna == 6 )
         litera = 'F';
   
    while( !sprawdz_pole( plansza, wiersz, kolumna ) );
   
    plansza[ wiersz - 1 ][ kolumna - 1 ] = '#';
   
    cout << "wybrane pole to: " << wiersz << litera << endl;
}

bool sprawdz_dostepnosc( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] )
{ 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[ MAX_WIERSZ ][ MAX_KOLUMNA ];
   
    inicjuj_plansze( plansza );
    while( !sprawdz_dostepnosc( plansza ) )
    {
        rysuj_plansze( plansza );
        wybierz_pole1( plansza );
        system( "cls" );
        rysuj_plansze( plansza );
        wybierz_pole2( plansza );
    }
   
    rysuj_plansze( plansza );
    system( "pause" );
    return 0;
}
P-121728
Tomek_z_W11
» 2014-11-30 12:27:11
Jeżeli użytkownik wprowadzi liczbe z zakresu <65,90> lub <97,122>, to musisz to jakos obsluzyc.
Liczby 65, 90 i 97 122 oznaczaja liczbowe odpowiedniki liter w kodzie ASCII:
97 - 'a'
98 - 'b'
99 - 'c'
.
.
.
122 - 'z'

65 - 'A'
66 - 'B'
67 - 'C'
.
.
.
90 - 'Z'


Po prostu w jakiejs funkcji, dodaj ifa:
C/C++
if(( wprowadzona_liczba >= 65 && wprowadzona_liczba <= 90 ) ||( wprowadzona_liczba >= 97 && wprowadzona_liczba <= 122 ) )
{
    cout << "Wprowadzone pole jest niepoprawne" << endl;



Oprócz tego w funkcji:
C/C++
bool sprawdz_pole( const char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ], int wiersz, int kolumna )
{ if( wiersz < 1 || wiersz >= MAX_WIERSZ ) //TU ZAMIEN NA >=
    { cout << "Nieprawidlowy wiersz" << endl;
        return false;
    }
    if( kolumna < 1 || kolumna >= MAX_KOLUMNA ) //TU TEZ ZAMIEN NA >=
    { cout << "Nieprawidlowa kolumna" << endl;
        return false;
    }
    if( plansza[ wiersz - 1 ][ kolumna - 1 ] != ' ' )
    { cout << "Pole jest zajete, podaj inne wspolrzedne: " << endl;
        return false;
    }
    return true; //  okay to place stone here
}
P-121734
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-12-01 22:58:17
A miałbyś może jakieś sugestie dotyczące liczenia punktów?
C/C++
void policz_punkty( char plansza[ MAX_WIERSZ ][ MAX_KOLUMNA ] ) //int wiersz, int kolumna)
{
    int wiersz;
    int kolumna;
    int punkty = 0;
    int licznik = 0;
    for( int i = 0; i < 6; i++ ) //dla kolumny
    {
        if( plansza[ wiersz ][ i ] == '#' ) licznik++;
       
    }
    if( licznik == 3 ) punkty = punkty + 1;
    else if( licznik == 6 ) punkty = punkty + 2;
   
    licznik = 0;
    for( int i = 0; i < 6; i++ ) // dla wiersza
    {
        if( plansza[ i ][ kolumna ] == '#' ) licznik++;
       
    }
    if( licznik == 3 ) punkty = punkty + 1;
    else if( licznik == 6 ) punkty = punkty + 2;
   
    licznik = 0;
    if( wiersz == kolumna ) //dla przekątnej (lewy gorny rog -> prawy dolny), jeżeli do niej należy
    {
        for( int i = 0; i < 6; i++ )
        {
            if( plansza[ i ][ i ] == '#' ) licznik++;
           
        }
        if( licznik == 3 ) punkty = punkty + 1;
        else if( licznik == 6 ) punkty = punkty + 2;
       
        licznik = 0;
    }
    if( wiersz + kolumna == 5 ) //dla drugiej, jeżeli do niej należy
    {
       
        for( int i = 0; i < 6; i++ )
        {
            if( plansza[ i ][ i ] == '#' ) licznik++;
           
        }
        if( licznik == 3 ) punkty = punkty + 1;
        else if( licznik == 6 ) punkty = punkty + 2;
       
    }
    return punkty;
}

Ale na dobrą sprawę chyba nie wiele mi to daje. Punkty są przyznawane graczom, gdy po ich ruchu na planszy ustawione są 3 kamienie obok siebie pionowo, poziomo lub na skos (główna przekątna)(1 punkt) i gdy jest to 6 kamieni to pionowo, poziomo lub na skos(2 punkty).
P-121907
Tomek_z_W11
» 2014-12-02 10:23:26
Co do pętli "dla kolumn" to bym ją trochę pozmieniał.

C/C++
for( int i = 0; i < 6; i++ ) //dla kolumn
{
    for( j = 0; j < 6; j++ ) //dodatkowa petla
    {
       
        if( plansza[ j ][ i ] == '#' ) licznik++; //zwroc uwage, ze musi byc plansza[j][i]
       
    }
}


Jeżeli chodzi o wiersze, to też będziesz musiał zrobić pętle w pętli, bo trzeba przeszukać wszystkie wiersze, a w każdym z tych wierszów wszystkie komórki - analogicznie jak w przypadku kolumn, na jednej pętli tego nie zrobisz.


C/C++
for( int i = 0; i < 6; i++ ) // dla wierszy
{
    for( j = 0; j < 6; j++ ) //dodatkowa petla idaca po kolejnych komorkach kolejnych wierszy
    {
        if( plansza[ i ][ j ] == '#' ) licznik++;
       
    }
}


Co pętli od przekątnych, to jak na moje oko jest w porządku, nie rozumiem jedynie tego zzapisu:

C/C++
if( wiersz == kolumna )
//oraz
if( wiersz + kolumna == 5 )


Z tego co się orientuje to wiesz i kolumna nie mają nadanej wartości, kompilator nie wyświetla Ci ostrzeżeń? Wcześniej przy pomocy tych zmiennych przechodziłeś po komórkach tablicy.
A ta ostatnia pętla "dla drugiej, jeżeli do niej należy" to chodzi o drugą przekątną prawy górny -> lewy dolny?
P-121917
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-12-02 11:49:47
Tak, o tą o tą. Spróbuję dziś coś pozmieniać.
P-121920
1 « 2 »
Poprzednia strona Strona 2 z 2