-
AI jest głupie. Mogę wstawić 2 krzyżyki w jednej linii i komputer zamiast mnie przyblokować, to stawia w randomowym miejscu. I odwrotnie - jeśli to komputer ma dwa kółka w jednej linii, to zamiast postawić trzecie kółko i wygrać, to stawia w randomowym miejscu.
-
w handlerze eventu odwołujesz się bezpośrednio do DOM, żeby wydostać index: e.target.getAttribute("index")
. Tylko, że jest to zbyteczne i w zasadzie omijasz Reacta i uzależniasz się od prawdziwego DOMu bez wyraźnej potrzeby. W React zwykle tak się robi, że przekazujesz dane do handlerów eventów, czyli w komponencie Board zamiast:
onClick={this.onPlayerMove}
mógłbyś zrobić tak:
onClick={() => this.onPlayerMove(i)}
czyli przekazujesz od razu te dane, których rzeczywiście potrzebujesz (a obiektu eventu e
w ogóle nie potrzebujesz w tym przypadku)
- czemu bindujesz handlera zdarzeń do
this
w komponencie Board?
this.onPlayerMove = props.onPlayerMove.bind(this);
wygląda to na błąd/pomyłkę albo, jeśli to celowe, to dość partyzancki kod, jeśli chcesz pożyczać this
w ten sposób handlerowi zdarzenia.
- zamiast inicjalizować tablicę w ten sposób:
board: [null, null, null, null, null, null, null, null, null],
możesz utworzyć tablicę z 9 pustymi elementami i użyć metody fill
:
board: new Array(9).fill(null),
- zamiast kombinować jak koń pod górę
let indexes = this.state.board.reduce(function (a, e, i) {
if (e === null) a.push(i);
return a;
}, []);
możesz użyć metody filter:
let indexes = this.state.board.filter(item => item === null);
- w komponencie Game masz taki kod:
winMap.forEach((element) => {
if (...) {
(...)
return;
}
});
to return
jest zbędne, bo i tak to koniec funkcji. Tylko nie wiem, jaki był twój zamiar. Bo to trochę wygląda, jakbyś chciał wyjść z funkcji wyżej (a w ten sposób nie wyjdziesz, bo return wychodzi tylko z bezpośredniej funkcji).