jak zablokowac dalsze zmiany w tablicy?

0

Witam,

Pisze gre, która ma tablice NxN - polega na zamianie 0 na 1 i odwrotnie.
Jednym z przykladow jest zamiana podawanego pola + pola na gorze, dole, po prawej i po lewej.

ale jesli tablica jest 5x5 i podaje element [1][5] to zamienia sie takze element [2][1] bo program mysli ze jest to element po prawej stronie, a jest to po prostu element kolejny.

jak zablokowac to ifem by nie ruszalo tego elementu?

void mapa::ruch1(int x,int y){

	if(tab[x-1][y-1] == 1){
	   tab[x-1][y-1] = 0; // zmienia swoj stan
           tab[x-2][y-1] = 0; // gora
           tab[x][y-1] = 0; // dol
           tab[x-1][y] = 0; // prawo
           tab[x-1][y-2] = 0; // po lewej
       }

Dla zwizualizowania tego:

user image

0

Musisz po prostu sprawdzić przed każdą zmianą czy nie wykraczasz poza zakres wymiaru tablicy. Np. if(0 <= x-1 && x-1 < N && to_samo_dla_y) ...

0

ale to nie chodzi o rozmiar tablicy tylko rozmiar wiersza...

0
void mapa::ruch1(int x,int y){
 
        if(tab[x-1][y-1] == 1)
        {
           tab[x-1][y-1] = 0; // zmienia swoj stan
           if(x-1 != 0) tab[x-2][y-1] = 0; // gora
           if(x-1 != 4) tab[x][y-1] = 0; // dol
           if(y-1 != 4) tab[x-1][y] = 0; // prawo
           if( y-1 !=0 )tab[x-1][y-2] = 0; // po lewej
       }
0

dzieki wielkie !

0
kkk123 napisał(a):

ale to nie chodzi o rozmiar tablicy tylko rozmiar wiersza...

Dlatego napisałem wymiar, a nie rozmiar. Poza tym w swoim kodzie wykraczasz poza tablicę. Np. dla x i y = 1 lub 5.

@mto9: prawie dobrze, poza tym, że dla innych wymiarów tablicy się posypie ;) i brakuje walidacji poprawnych danych wejściowych.

void mapa::ruch1(int x, int y)
{
    x--;
    y--;

    if(x < 0 || x >= N || y < 0 || y >= N)
    {
        //obsługa błędu
        return;
    }

    if(tab[x][y] == 1)
    {
        tab[x][y] = 0;
        if(x != 0) tab[x-1][y] = 0; //lewo
        if(y != 0) tab[x][y-1] = 0; //góra
        if(x < N-1) tab[x+1][y] = 0; //prawo
        if(y < N-1) tab[x][y+1] = 0; //dół

        //z tego co widzę masz chyba inaczej ustawione wiersze/kolumny, ale nie mogę tego rozkminić z Twojego kodu
    }
}
0

No tak, ale to chyba logiczne :) napisałem kod tylko dla powyższego przykładu, uważając, iż autor tematu zrozumie o co chodzi.

0

no dobra, a teraz mam taki problem bo chce zrobic poziomy trudnosci 1. latwy (5x5), 2. sredni(8x8), 3. trudny(10x10), wiec nie moge uzywac define do N.

pytam wiec uzytkownika:

void mapa::poziomtrudnosci(){

    int wybor2;

    cout <<"Wybierz poziom trudnosci:" << endl;
    cout <<"1. latwy" << endl;
    cout <<"2. sredni" << endl;
    cout <<"3. trudny" << endl;

    cin >> wybor2;
}


// i dalej w funkcji rysujacej losowa mape na start:

    if (wybor2==1){
    a=5; b=5;
    }

    if (wybor2==2){
    a=8; b=8;
    }

    if (wybor2==3){
    a=10; b=10;
    }

for(int i=0;i<a;i++){
     for(int j=0;j<b;j++){
         tab[i][j]=(rand()%2)+0;
      }
}

for(int i=0;i<a;i++){
      for(int j=0;j<b;j++){
          cout << tab[i][j] << ' ';
      }
       cout << endl;
}

tylko dana wybor2 nie chce wylapywac informacji z funkcji zapisanej wyzej(frienda nie umiem zbytnio zastosowac, wykrzaczaja sie, ale niewiem czy by pomogl)/

jak inaczej to rozwiazac? :<

0
enum Difficulty { EASY = 5, MEDIUM = 8, HARD = 10};

class mapa
{
// ..
Difficulty myDifficulty;
// ..
public:
void poziomtrudnosci();
// ..
};

void mapa::poziomtrudnosci()
{
    int wybor;
 
    cout <<"Wybierz poziom trudnosci:" << endl;
    cout <<"1. latwy" << endl;
    cout <<"2. sredni" << endl;
    cout <<"3. trudny" << endl;
 
    cin >> wybor;
    if(wybor==1) myDifficulty = EASY
    else if(wybor==2) myDifficulty = MEDIUM;
    else if(wybor==3) myDifficulty = HARD;
}
 
 
// i dalej w funkcji rysujacej losowa mape na start:
 
for(int i=0;i<myDifficulty;i++){
     for(int j=0;j<myDifficulty ;j++){
         tab[i][j]=(rand()%2)+0;
      }
}
 
for(int i=0;i<myDifficulty ;i++){
      for(int j=0;j<myDifficulty ;j++){
          cout << tab[i][j] << ' ';
      }
       cout << endl;
}
0

A dlaczego mapa pyta o poziom trudności użytkownika? Mapa powinna dostać info w konstruktorze o rozmiarze jaki powinna używać. A co do błędu u Ciebie to jest klasyczny problem gdy przy nauce nadużywało się zmiennych globalnych. Powinno to być zabronione i surowo karane. wybor2 jest zmienną lokalną i ma zasięg metody poziomtrudnosci, dlatego nie jest i nie będzie widoczna w metodzie rysującej.

Rozmiar tablicy zadeklaruj jako pola klasy i inicjalizuj w konstruktorze.

1 użytkowników online, w tym zalogowanych: 0, gości: 1