Saper w c++

0

siemka, piszę sapera w c++ i natknąłem się na pewien problem. Mianowicie chciałem by konstruktor losował mi pozycja min za pomocą funkcji rand. Na początku losuje randem wiersz a potem kolumnę tablicy dwuwymiarowej. Ilość min ma być podyktowana 3 stopniami trudności i opisuje ją równianie
amountOfMines = width * high * EasyLevel; gdzie EasyLevel = 0.1. Konstruktor jednak nie spełnia swojej roli a jedynie wyświetla puste pola (bez min)...
Czy byłby ktoś w stanie nakreślić mój błąd w kodzie bądź złe podejście do problemu?

Minesweeperboard ::Minesweeperboard(int width, int high, GameMode mode) {
        for (int i = 0; i < width; i++) {
            for (int j = 0; j < high; j++) {
                board[j][i].hasMine = 0;
                board[j][i].hasFlag = 0;
                board[j][i].isRevealed = 0;
            }
        }

        srand(time(NULL));
        int EasyLevel=0.1, NormalLevel=0.2, HardLevel=0.3, column=0, raw=0, amountOfMines=0;
        if(mode==EASY){
            amountOfMines = width * high * EasyLevel;
            for(int i=0; i<10; i++){
                column = rand() % high;
                raw = rand() % width;
                board[raw][column].hasMine = 1;

            }
        }
    if(mode==NORMAL){
        amountOfMines = width * high * NormalLevel;
        for(int i=0; i<amountOfMines; i++){
            column = rand()%high;
            raw = rand()%width;
            board[raw][column].hasMine=1;
        }
    }if(mode==HARD){
        amountOfMines = width * high * HardLevel;
        for(int i=0; i<amountOfMines; i++){
            column = rand()%high;
            raw = rand()%width;
            board[raw][column].hasMine=1;
        }
    }
}
1
int EasyLevel=0.1, NormalLevel=0.2, HardLevel=0.3,

int opisuje liczby całkowite. Chcesz zmiennoprzecinkowe - użyj double.

Swoją drogą, polecam lekturę: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

A tak poza tym, to po co tyle tam duplikacji kodu, jak tylko mnożnik zmieniasz? :​(

0
kq napisał(a):
int EasyLevel=0.1, NormalLevel=0.2, HardLevel=0.3,

int opisuje liczby całkowite. Chcesz zmiennoprzecinkowe - użyj double.

Swoją drogą, polecam lekturę: https://dsp.krzaq.cc/post/180/nie-uzywaj-rand-cxx-ma-random/

A tak poza tym, to po co tyle tam duplikacji kodu, jak tylko mnożnik zmieniasz? :​(

Racja, śmieszny błąd ale w życiu bym nie pomyślał żeby tam go szukać, dzięki!
Co do duplikacji kodu, to wersja początkowa, potem będę poprawiał ale dzięki za słuszną uwagę :)

1
Bartek24 napisał(a):

Czy byłby ktoś w stanie nakreślić mój błąd w kodzie bądź złe podejście do problemu?

Może nie tyle złe, co mocno ociekające C ;)

Gdyby pole było reprezentowane przez strukturę, a plansza byłaby tak naprawdę jednowymiarową tablicą to inicjalizacja mogłaby wyglądać np. tak:

struct Cell
{
  Cell(bool withBomb = false);
  /*...*/
};

Board::Board(unsigned width, unsigned height, Mode mode)
{
  cells.resize(width * height);  // cells to std::vector<Cell>
  unsigned numBombs = width * height * getFactor(mode);
  fill_n(cells.begin(), numBombs, Cell{true});
  mt19937 gen(random_device{}());
  shuffle(cells.begin(), cells.end(), gen);
}

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