ruby で三目並べゲームを実現しようとしています。私はデカルト座標を持っています (0 < x <= 3, 0 < y <= 3)。
x|x|x
- - -
x|x|x
- - -
x|x|x
上の表の のある場所は、または記号x
を配置できる場所です。いくつかの記号の集まりが直線を構成しているかどうかを確認するにはどうすればよいですか?x
o
ruby で三目並べゲームを実現しようとしています。私はデカルト座標を持っています (0 < x <= 3, 0 < y <= 3)。
x|x|x
- - -
x|x|x
- - -
x|x|x
上の表の のある場所は、または記号x
を配置できる場所です。いくつかの記号の集まりが直線を構成しているかどうかを確認するにはどうすればよいですか?x
o
結果が紙の上で次のようになっているとします。
x o o
x o x
o x o
勝者がいるかどうか、もしそうなら誰が勝ったかを知りたいとします。その描画は、配列で表すことができます。
toe = [[:x, :o, :o], [:x, :o, :x], [:o, :x, :o]]
(文字列'x'
とを使用することもでき'o'
ましたが、記号を使用した方が効率的で、キーストロークを節約できます。0
and1
またはtrue
と を使用することもできfalse
ましたが、そうすることには利点がありません。)
勝った:x
場合、勝った場合、または勝者がいない場合に返すメソッドを定義しましょう。x
:o
o
:no_winner
def winner?(toe)
return :x if player_wins?(toe, :x)
return :o if player_wins?(toe, :o)
:no_winner
end
whereは、プレイヤー(または) が勝ったかどうかに応じて、またはplayer_wins?(toe, p)
を返すメソッドです。そのメソッドを記述するには、次のヘルパー メソッドを使用できます(個別にテストできます)。true
false
p
:x
:o
player の勝者となる行はありますp
か?
def row_win?(toe, p)
toe.any? { |row| row.uniq == p }
end
主対角線はプレーヤーの勝者p
ですか?
def diag_win?(toe, p)
3.times.all? { |i| toe[i][i] == p }
end
オフダイアゴナルはプレーヤーの勝者p
ですか?
def off_diag_win?(toe, p)
3.times.all? { |i| toe[2-i][i] == p }
end
これらのヘルパーを使用すると、次のように記述できますplayer_wins?
。
def player_wins?(toe, p)
row_win?(toe, p) ||
row_win?(toe.transpose, p) ||
diag_win?(toe, p) ||
off_diag_win?(toe, p)
end
試してみよう:
winner?(toe)
#=> :o
もう一つの例:
winner? [[:x, :o, :o], [:o, :o, :x], [:x, :x, :o]]
#=> :no_winner