Closed hiroto0222 closed 2 years ago
@hiroto0222
ゲーム音いいですね!Macでも聞こえますよ CPUの実装もいい感じです。3点だけ気になった部分があります。
対策 ・setTimeOutの第二引数の値を5秒から10秒くらい取るのはどうでしょうか? ・新しいピースの場合、どこに置いたのかわかるようにCSSを当てるとか?
こちらはゲーム判定がまだ完成していなかったということもあると思うので、一旦hayatoさんのとこちらのプルリクをマージしてから修正していただきます。
ちなみに、RoomPageのchangePlayerTurn関数で // ピースを置かずにターンが変わる場合(パス, 時間切れ)場合は実行しない とコメントにありますが、これは意図的にそうしたのでしょうか?
src/model/player.js
getRandomMoves() {
const randomMoves = [];
for (let row = 0; row < this.totalCells; row++) {
for (let col = 0; col < this.totalCells; col++) {
randomMoves.push([row, col]);
}
}
randomMoves.sort(() => Math.random() - 0.5);
return randomMoves;
}
getPieceOptions() {
return Object.keys(this.remainingPieces)
.reverse()
.reduce((filtered, pieceId) => {
if (!this.remainingPieces[pieceId].isUsed) {
filtered.push(parseInt(pieceId));
}
return filtered;
}, []);
}
今のランダムプレイヤーの動きは以下のようになっていますよね。
・ボードの座標から一旦すべて洗い出して、それをランダムに並び変える(2人プレイの場合、196通り) ・最大のマスのピースを取得し、それをランダムに置く。3回まで回転したりできる?
これだとかなり計算量が多くなってしまうと思うんですよね。。
僕は、Random アルゴリズムは、まず手元のピースの中からランダムに置くピースを選択し、そのピースが配置可能な位置を取得する。(確かAvailablePlayerMovesみたいな配列を返す関数があった気がする) そして配置可能な座標が入っているその配列からランダムに次の手を選択する 配置可能な座標がない場合、今のピースを候補から除いて、また別のピースをランダムに選択するのを繰り返すというのを想定していましたが、何かしらうまくいかなかったため、14 * 14 = 196個の配列を作成するという方法にしたんでしょうか?
できたらランダムでも貪欲法でも探索範囲をあらかじめ絞れた方が計算量的にいいので。。
@hiroto0222 先にhayatoさんが行なってくださったゲームロジックとタイマーの処理が追加されたDevelopブランチにマージしてから修正したほうがやりやすいですか? もしそうであれば、先にこちらマージしようかと思っています!
@tkwonn レビューありがとうございます!
- CPUが次の手を決めるまでが早すぎてどこに置いたのかわからない(特に4人プレイ)+時間をあまり浪費しない
対策 ・setTimeOutの第二引数の値を5秒から10秒くらい取るのはどうでしょうか?
10秒ですとかなり長く感じるので、4 - 6 秒だと程良いかも?(相談必要)
新しいピースの場合、どこに置いたのかわかるようにCSSを当てるとか?
新しいピースを置いた際に canvas でボーダー色を濃く入れたりすると分かりやすいかもしれないです。
- getRandomMoves関数について 僕は、Random アルゴリズムは、まず手元のピースの中からランダムに置くピースを選択し、そのピースが配置可能な位置を取得する。(確かAvailablePlayerMovesみたいな配列を返す関数があった気がする)そして配置可能な座標が入っているその配列からランダムに次の手を選択する 配置可能な座標がない場合、今のピースを候補から除いて、また別のピースをランダムに選択するのを繰り返すというのを想定していましたが、何かしらうまくいかなかったため、14 * 14 = 196個の配列を作成するという方法にしたんでしょうか?
Issue: #50
目的
実装の概要
CPUの実装
効果音を js の Audio api で試しに実装