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

JavaScript losowanie liczby jeszcze raz jeżeli nie spełni warunku.

Aruba Cloud VPS - 50% taniej przez 3 miesiące!
0 głosów
554 wizyt
pytanie zadane 19 marca 2016 w JavaScript przez uRTLy Bywalec (2,420 p.)
edycja 19 marca 2016 przez uRTLy

 

function computerLogic(array) {

  function random() {

    var rand = Math.floor(Math.random() * 9);

    var result = (array[rand] === computerChoice) || (array[rand] === playerChoice) ?
      random(): (function() {
        array[rand] = computerChoice;
        grid.item(rand).innerHTML = computerChoice;
      })(rand);
  }

  random();


}

Moze i proste ale moja logika mnie zawodzi.  

To  gra w kółko i krzyżyk , computerLogic(array) jest wywoływana za każdym razem jak użytkownik kliknie i wtedy losowana jest liczba . Jak pod  indexem tablicy znajduje sie X albo O ( playerChoice) albo (userChoice) chce żeby wylosowało liczbe jeszcze raz. Do tej pory robiłem to jakby rekursywnie ale nie chce zeby za każdym razem wywoływało znowu funkcje random tylko poprostu znowu wylosowało..I jakoś wogóle nie mam pomysłu..

https://github.com/uRTLy/Tic-Tac-Toe tutaj kod aplikacji ale przed tym jak zmieniłem na ternary operator zamiast ifów.
 

edit
może też wracać do początku funkcji znowu albo poprostu niech znowu włączy rand ale niech ponownie sprawdzi czy nie wylosowało indexu z zajętym polem. Tylko niech nie wywołuje się jeszcze raz bo pod koniec w konsoli przeglądarki mam 10 randomów wywołanych i maximum call stack exceeded przy kółku i krzyżyku....

 

1 odpowiedź

+2 głosów
odpowiedź 19 marca 2016 przez Comandeer Guru (606,240 p.)

Osobiście nie szedłbym w rekurencję, a w pętlę do...while.

komentarz 19 marca 2016 przez uRTLy Bywalec (2,420 p.)
A pomożesz z warunkiem? Bo do...while też już próbowałem i za cholere nie moge wymyślić logicznego warunku, to takie irytujące...

do{

rand=Math.floor(Math.random() * );

}while((array[rand]!== playerChoice ) || (array[rand] =computerChoice))
nie wróci do góry funkcji i nie sprawdzi ponownie . A potrzebuje tego żeby wykonało uzupełnienie tablicy.
komentarz 19 marca 2016 przez Comandeer Guru (606,240 p.)
var random;

do {
    random = losuj();
} while ( board[ random ] === computersChoice || board[ random ] === playersChoice )

 

komentarz 19 marca 2016 przez uRTLy Bywalec (2,420 p.)
Dobra ale wtedy tylko wylosuje liczbe ponownie a nie wykona reszty instrukcji, które są ważne.Musi sprawdzić ponownie od początku funkcji czy warunek jest spełniony żeby wykonać ważne instrukcje.
komentarz 19 marca 2016 przez Comandeer Guru (606,240 p.)
No ok, ale samo losowanie będzie w pętli. Jak wykona się pętla, to przejdzie do reszty instrukcji.
komentarz 19 marca 2016 przez uRTLy Bywalec (2,420 p.)

no już mniej więcej cie czaje i zamieniłem to nawet na coś takiego :

 

function computerLogic(array) {
function randomize(){
  var x=Math.floor(Math.random() * 9);
  return x;
}

  do {
      random = randomize();

  } while ( array[ random ] !== computerChoice && array[ random ] !== playerChoice );

console.log(random);
if(( array[random] !== computerChoice) && (array[random] !== playerChoice )){
array[random]=computerChoice;
grid.item(random).innerHTML=computerChoice;

}

}

tylko teraz mi nie updatuje wyglądu :O. ta petla do while dalej jest cos nie tak.Tam przy If sprawdzam poraz kolejny czy array[random] !== X ani O ,
Ale nie wykonuje się instrukcja w srodku czyli pętla źle działa.

komentarz 19 marca 2016 przez Comandeer Guru (606,240 p.)

No bo Twój warunek w pętli jest wadliwy… Pętla ma się wykonywać tak długo, jak długo wylosowana liczba BĘDZIE zajęta przez gracza lub komputer. U Ciebie warunek jest odwrotny.

komentarz 19 marca 2016 przez uRTLy Bywalec (2,420 p.)
function computerLogic(array) {
var random;
var zero = 0;
while (array[random] === zero){
  random=(function (){
    var a= Math.floor(Math.random()*9);
    return a;
  })();
}
  console.log(random);

if(array[random] === zero ){
array[random]=computerChoice;
grid.item(random).innerHTML=computerChoice;
}
}

 

Ułatwiłem to sobie, jeżeli array[random] === 0 to znaczy że nie jest równy ani playerChoice ani computerChoice.

Tylko dalej jest coś nie tak, myślałem że to z porównaniem coś nie tak więc dalem 0 w zmienna. Hmm nie wiem co jest nie tak. Albo ta funkcja random jest zle zrobiona ale już próbowałem każdej.

komentarz 19 marca 2016 przez Comandeer Guru (606,240 p.)

Ehh… Przeczytaj jeszcze raz to:

Pętla ma się wykonywać tak długo, jak długo wylosowana liczba BĘDZIE zajęta przez gracza lub komputer.

A teraz pomyśl, co robi Twój kod ;) 

komentarz 20 marca 2016 przez uRTLy Bywalec (2,420 p.)
while (array[random] !== zero)

zapewne o to ci chodzi ale teraz while crashuje program,

komentarz 20 marca 2016 przez Comandeer Guru (606,240 p.)
Jak będę mieć chwilę wolnego, to obadam Twój projekt na GH.
komentarz 20 marca 2016 przez uRTLy Bywalec (2,420 p.)
Wiesz co zrobie od nowa całe kółko i krzyżyk całkiem inaczej bo mam teraz troche inny pomysł.

Podobne pytania

0 głosów
1 odpowiedź 1,319 wizyt
pytanie zadane 28 czerwca 2018 w JavaScript przez Tomasz Ozi Orzech Początkujący (300 p.)
0 głosów
2 odpowiedzi 2,248 wizyt
0 głosów
1 odpowiedź 157 wizyt
pytanie zadane 6 marca 2018 w JavaScript przez myku18 Nowicjusz (210 p.)

93,194 zapytań

142,206 odpowiedzi

322,051 komentarzy

62,518 pasjonatów

Advent of Code 2024

Top 15 użytkowników

  1. 3053p. - dia-Chann
  2. 2998p. - Łukasz Piwowar
  3. 2993p. - Łukasz Eckert
  4. 2970p. - CC PL
  5. 2930p. - Tomasz Bielak
  6. 2907p. - Łukasz Siedlecki
  7. 2890p. - rucin93
  8. 2801p. - Adrian Wieprzkowicz
  9. 2645p. - Mikbac
  10. 2485p. - Marcin Putra
  11. 2461p. - Michał Telesz
  12. 2418p. - Michal Drewniak
  13. 2371p. - Anonim 3619784
  14. 1733p. - rafalszastok
  15. 1650p. - Mariusz Fornal
Szczegóły i pełne wyniki

Motyw:

Akcja Pajacyk

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

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...