• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Program do tasowania planszy nie działa

+2 głosów
76 wizyt
pytanie zadane 17 stycznia w JavaScript przez Mateusz___ Nowicjusz (140 p.)

Hej!
Jestem zupełnie niezaznajomiony z js, ale muszę napisać na zajęcia program, który ma przetasować planszę x na y elementów. Szukając komend w internecie napisałem program, który generuje szereg z określoną ilością elementów (jedna połowa to jedynki, a druga dwójki). Oto on:

let array = [];
let columnsNum = 6; // parzysty!!!
let rowsNum = 9;

const columns = Array(columnsNum/2).fill(1);
for(a=1; a<=columnsNum/2; a++) {
columns.push(2);
}
for(b=0; b<rowsNum; b++) {
array.push(columns);
}

Druga część programu wybiera po kolei każdy wiersz i kolumnę, a następnie podmienia go z przypadkowym elementem w tym samym wierszu. Powtarza to 3 razy:

for (a=0; a<=2; a++) {
for (b=0; b<rowsNum; b++){
for (c=0; c<columnsNum; c++){
let rand = Math.floor(Math.random() * columnsNum);
var tmp = array[b][rand];
array[b][rand] = array[b][c];
array[b][c] = tmp;
                                                }

                                            }

console.log(array);
}

Problem w tym, że po przetasowaniu każdy wiersz wygląda tak samo (jest przetasowany, ale każdy kolejny niżej jest taki sam).
Przykładowy przebieg programu:

[[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ],
[ 1, 1, 1, 2, 2, 2 ]]

[[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ],
[ 2, 1, 2, 1, 2, 1 ]]

[[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ],
[ 1, 1, 2, 1, 2, 2 ]]

[[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ],
[ 2, 1, 2, 1, 1, 2 ]]

Kiedy wpisuję zmienną array ręcznie, wszystko działa dobrze... Nie mam pojęcia, czym różni się wygenerowany szereg.
Wiem, że program mógł być o wiele lepszy, ale to jest dosłownie pierwsza rzecz, którą w życiu napisałem ;). Bardzo proszę pomoc!

1 odpowiedź

0 głosów
odpowiedź 19 stycznia przez VBService Mędrzec (172,150 p.)
edycja 19 stycznia przez VBService

Możesz użyć fill w każdym przypadku zamiast tych pętli.

 

przykład

const columnsNum = 7, // nie ma znaczenia czy parzysta
      rowsNum = 9;
const array = new Array(rowsNum);
 
const columns = new Array(columnsNum).fill(2);
columns.fill(1, 0, Math.floor(columnsNum/2));
console.log(columns);

array.fill(columns, 0, rowsNum);
console.log(array);

 

a do "tasowania" użyć np. metodę sort :

const shuffleArray = (a) => { return a.sort(_=> Math.random() - 0.5); }

 

przykład

const columnsNum = 7, // nie ma znaczenia czy przysta
      rowsNum = 9;
const array = [];
 
const columns = new Array(columnsNum).fill(2);
columns.fill(1,0,Math.floor(columnsNum/2));
console.log(columns);

const shuffleArray = (a) => { return a.sort(_=> Math.random() - 0.5); }
for (let i=0; i<rowsNum; ++i)
  array.push([...shuffleArray(columns)]);

console.log(array);

 

Podobne pytania

0 głosów
1 odpowiedź 151 wizyt
+2 głosów
3 odpowiedzi 184 wizyt
0 głosów
2 odpowiedzi 1,765 wizyt
pytanie zadane 27 września 2016 w JavaScript przez SzobX Nowicjusz (200 p.)

88,355 zapytań

136,952 odpowiedzi

305,669 komentarzy

58,619 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Sklep oferujący ćwiczenia JavaScript, PHP, rozmowy rekrutacyjne dla programistów i inne materiały

Oto dwie polecane książki warte uwagi. Pełną listę znajdziesz tutaj.

...