-2

ruby で三目並べゲームを実現しようとしています。私はデカルト座標を持っています (0 < x <= 3, 0 < y <= 3)。

x|x|x
- - -
x|x|x
- - -
x|x|x

上の表の のある場所は、または記号xを配置できる場所です。いくつかの記号の集まりが直線を構成しているかどうかを確認するにはどうすればよいですか?xo

4

1 に答える 1

0

結果が紙の上で次のようになっているとします。

x o o
x o x
o x o

勝者がいるかどうか、もしそうなら誰が勝ったかを知りたいとします。その描画は、配列で表すことができます。

toe = [[:x, :o, :o], [:x, :o, :x], [:o, :x, :o]]

(文字列'x'とを使用することもでき'o'ましたが、記号を使用した方が効率的で、キーストロークを節約できます。0and1またはtrueと を使用することもできfalseましたが、そうすることには利点がありません。)

勝った:x場合、勝った場合、または勝者がいない場合に返すメソッドを定義しましょう。x:oo: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)を返すメソッドです。そのメソッドを記述するには、次のヘルパー メソッドを使用できます(個別にテストできます)。truefalsep: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
于 2015-10-16T19:15:03.893 に答える