Vue3で○×ゲームを作る③
タグ:
vue3
親コンポーネントで勝敗判定を行うための配列を用意し、更新する。
子コンポーネントから必要な情報を貰えたので、残りは親コンポーネントで勝敗判定をします。
やることは JavaScript で勝敗判定をするときとほぼ同じです。
まず、○× の情報を保存する 0 で埋まった配列
Array(9).fill(0)
は [0,0,0,0,0,0,0,0,0] と同じ意味です。
さらに
App.vue
// 略 import Masu from './components/Masu.vue'; export default { name: 'App', data() { return { count: 0, states: Array(9).fill(0), message: '', }; }, methods: { doCountUp(clickNumber, masu) { this.count += 1; // clickNumberは1~9までなので、1減らして配列に当てはめる this.states[clickNumber - 1] = masu; }, }, };
勝敗判定のための配列を作る
勝敗を判定するために縦横斜めの 3+3+2 の8パターンの配列が必要です。
現在のstates
を受け取って、8 パターンの配列を返すメソッドmakeArrays
を作ります。
array.filter()
は、
filter の第二引数は、その要素の配列内でのインデックス(順番)を返します。
array.slice()
は、
App.vue
//略 methods: { makeArrays(array){ // 縦の配列 const columnA = array.filter((n,index) => index % 3 === 0) const columnB = array.filter((n,index) => index % 3 === 1) const columnC = array.filter((n,index) => index % 3 === 2) // 横の配列 const rowA = array.slice(0,3) const rowB = array.slice(3,6) const rowC = array.slice(6,9) // 斜めの配列 const diagonalA = [array[0],array[4],array[8]] const diagonalB = [array[2],array[4],array[6]] // 8個の配列を持った配列として返す return [columnA,columnB,columnC,rowA,rowB,rowC,diagonalA,diagonalB] }, doCountUp(clickNumber, masu) { this.count += 1; // clickNumberは1~9までなので、1減らして配列に当てはめる this.states[clickNumber - 1] = masu; const checkArrays = this.makeArrays(this.states) }, },
勝敗判定をするメソッドを作り適用させる。
勝敗を判定するために縦横斜めの 3+3+2 の8パターンの配列が必要です。
data()
内に変数template
内で表示させます。
勝敗の判定を行うメソッド
array.every()
は、
map()
は、
App.vue
<template> <div> <div class="board"> <Masu v-bind:count="count" v-for="n of 9" v-bind:key="n" v-bind:number="n" v-on:count-event="doCountUp" /> </div> <p class="message">{{ message }}</p> </div> </template> <script> import Masu from "./components/Masu.vue"; export default { name: "App", data() { return { count: 0, states : Array(9).fill(0), message: "", }; }, components: { Masu, }, methods: { makeArrays(array){ // 略 }, checkWin(array){ if(array.every(n=>n === "◯")){ this.message = "Aの勝ち!" } else if (array.every(n=>n === "×")){ this.message = "Bの勝ち!" } }, doCountUp(clickNumber, masu) { this.count += 1; // clickNumberは1~9までなので、1減らして配列に当てはめる this.states[clickNumber - 1] = masu; const checkArrays = this.makeArrays(this.states) checkArrays.map((array)=>this.checkWin(array)) }, }, }; </script>
・勝敗判定がついたらゲームをストップする
・引き分けを判定する
などの機能が未完ですが、○×ゲームの基本的な機能はこれで実現することができました。