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

[C++] wypisywanie znaku w danym polu

Ostatnio zmodyfikowano 2014-11-25 23:18
Autor Wiadomość
Tomek_z_W11
» 2014-11-24 23:18:58
Hmm, odpaliłem ten kod i wydaje się wszystko w porządku.

Nie działa powiadasz? Co dokładnie? Jeżeli masz na myśli funkcje rysuj_kamien(), to wyświetlasz "ostatni" element tablicy, który niekoniecznie musi mieć przypisany znak, innymi słowy, jeżeli użytkownik nie wpisze, że wybiera wiersz 6 i kolumnę 6, to program będzie Ci wypisywał pusty znak ' ', a jeżeli użytkownik wybierze 6 wiersz i 6 kolumnę, to program wypisze '#' i od razu to wymaże z konsoli z powodu polecenia system("cls"), jeżeli chcesz sprawdzić, to co napisałem, to zakomentuj linijkę system("cls") i wklep w klawiature 6, 6; na konsoli powinien sie pokazać znak '#', który będzie się znajdować w lewym górnym rogu planszy.

Jeżeli chodzi o skrócenie zapisu, to możesz to puścić w pętli, jeżeli chcesz, żeby wybieranie, jak i rysowanie, działo się 5 razy, to możesz napisać na przykład tak:

C/C++
int main()
{
    int i;
    inicjuj_plansze();
    for( i = 0; i < 5; i++ )
    {
        rysuj_plansze();
        wybierz_pole();
        rysuj_kamien();
        system( "cls" );
    }
    rysuj_plansze();
    system( "pause" );
    return 0;
}

P-121331
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-11-25 00:03:56
Gdy wpisuję w konsolę wiersz 5 i kolumnę 6, program wypisuje mi dwa symbole w polach F5 i A6. Nawet jak wypisze to w drugim ruchu, to pierwszy jakby zostaje skasowany i symbole mam tylko na F5 oraz A6. Mam jeszcze jedno pytanie... Mianowicie mój projekt nie może zawierać w sobie zmiennych, globalnych, co najwyżej stałe globalne. Jak powinienem to zmienić?
P-121338
Tomek_z_W11
» 2014-11-25 10:24:54
Masz jakiś inny kod niż ja, najprawdopodobniej wprowadzałeś jakieś zmiany i coś się skiepściło. U mnie działa jak należy, no może oprócz wychodzenia poza zakres, wtedy się zawiesza, a jest to spowodowane tym, że w ifie sprawdzającym zakres nie powinno być 'and' tylko '&&', w każdym miejscu.


Zmienne globalne możesz zamienić na wskaźniki, a tablicę charów, na dynamiczą tablicę dwuwymiarową.
P-121347
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-11-25 22:15:42
Dobrze, zmieniłem na tamten co wcześniej i już ładnie działa. Jak zmienić te zmienne na wskaźniki i czy nie ma innego sposobu?
P-121414
Tomek_z_W11
» 2014-11-25 22:38:54
Tam gdzie używałeś zmiennych globalnych (tych nie const, bo const mogą według tego co napisałeś), musisz użyć wskaźników, czyli w funkcjach inicjuj_plansze(), rysuj_plansze(), rysuj_kamien - używałeś board, a w funkcji wybierz_pole() używałeś numer_wiersza i numer_kolumny.
Teraz te zmienne i tablica board zostały zadeklarowane w mainie. Jednocześnie zaalokowałem dla nich pamięć, jeżeli chcesz ich użyć w jakiejś funkcji, "wrzucasz" wskaźnik jako argument, a w funkcji go odbierasz i na nim pracujesz.

Inny sposób nie przychodzi mi na myśl, tzn. zawsze coś się znajdzie, ale nie mam pomysłu w tym momencie.

Wszystko wygląda mniej więcej tak:

C/C++
#include <cstdlib>
#include <iostream>
#include <iomanip>

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


void inicjuj_plansze( char ** board )
{ for( int i = 0; i < MAX_WIERSZ; i++ ) {
        for( int j = 0; j < MAX_KOLUMNA; j++ )
             board[ i ][ j ] = ' ';
       
    }
}
void rysuj_plansze( char ** board )
{ for( int i = 0; i < MAX_WIERSZ; i++ )
    {
        cout << " +-----+-----+-----+-----+-----+-----+" << endl;
        cout << i + 1 << "|";
        for( int j = 0; j < MAX_KOLUMNA; j++ )
        if( board[ i ][ j ] == '#' )
             cout << " ### |";
        else
             cout << "     |";
       
        cout << endl;
        cout << " |";
        for( int j = 0; j < MAX_KOLUMNA; j++ )
        if( board[ i ][ j ] == '#' )
             cout << " ### |";
        else
             cout << "     |";
       
        cout << endl;
    }
    cout << " +-----+-----+-----+-----+-----+-----+" << endl;
    cout << "    A     B     C     D     E     F   " << endl;
    cout << endl << endl;
}
void wybierz_pole( 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;
    else
         cout << "takie pole nie istnieje" << endl << "podaj inne pole: ";
   
}

void rysuj_kamien( char ** board, int * numer_wiersza, int * numer_kolumny )
{
    if( * numer_wiersza >= 1 and * numer_wiersza <= MAX_WIERSZ and * numer_kolumny >= 1 and * numer_kolumny <= MAX_KOLUMNA )
         board[ * numer_wiersza - 1 ][ * numer_kolumny - 1 ] = '#';
   
    cout << board[ MAX_WIERSZ - 1 ][ MAX_KOLUMNA - 1 ];
}

int main()
{
    int i;
   
    char ** board = new char *[ MAX_WIERSZ ]; //alokacja pamięci dla tablicy dynamicznej
    for( i = 0; i < MAX_WIERSZ; i++ )
         board[ i ] = new char[ MAX_KOLUMNA ];
   
    int * numer_wiersza = new int;
    int * numer_kolumny = new int;
   
    inicjuj_plansze( board );
    for( i = 0; i < 5; i++ )
    {
        rysuj_plansze( board );
        wybierz_pole( numer_wiersza, numer_kolumny );
        rysuj_kamien( board, numer_wiersza, numer_kolumny );
        system( "cls" );
    }
    rysuj_plansze( board );
    system( "pause" );
    return 0;
}
P-121416
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-11-25 22:54:30
OOO, dzięki bardzo. Naprawdę, bardzo mi pomagasz. A jakaś wskazówka co do tego, by sprawdzać, czy dane pole jest już zajęte, czy nie?
P-121420
Tomek_z_W11
» 2014-11-25 23:08:13
Zdaje się, że informacje o tym przechowujesz w tablicy char'ów board.

Zresztą spójrz na swoją funkcję rysuj_plansze(), rysujesz '###', tam gdzie
if( board[ i ][ j ] == '#' )
Ja bym to zrobił tak, że w funkcji wybierz_pole() robie dodatkowego ifa takiego jak w funkcji rysuj_planesz().

Tak szczerze, sam to wszystko napisałeś, tzn. te podstawowe funkcje i ogólnie Twoja to idea? O całości mówię.
P-121421
kevindurant95
Temat założony przez niniejszego użytkownika
» 2014-11-25 23:18:56
Tak, z pomocą tego forum, jak i forum na innej stronie próbuję wszystko sklecić w spójną całość, analizując wszystko krok po kroku. Generalnie cały szablon i zarys jest mój, pytam się o dość konkretne rzeczy, a jak już zaznaczyłem, z programowania jestem raczej średnio ogarnięty. Jednak bardzo się staram :D
P-121422
1 « 2 »
Poprzednia strona Strona 2 z 2