読者です 読者をやめる 読者になる 読者になる

餅屋LGTM

餅つきのあとの静けさ

Rubyでオセロ 〜その2〜

COM対戦と観戦(COM同士の対戦)まで

1. メインメニューを作る

メインメニューを作りそこからモードを選択できるようにする

  1. COM戦
    • COM先手
    • COM後手
  2. 対人戦
  3. 観戦
#モード番号
COM = 1
HUMAN = 2
WATCH = 3

#メインメニュー
def menu
  while true
    print("COMと対戦: 1\n")
    print("二人で対戦: 2\n")
    print("観戦: 3\n")
    print("終了: 4\n\n")
    mode = gets.chomp!
    if mode.to_i == 4
      break
    end
    if mode =~ /[1-3]/
      @mode = mode.to_i
      case @mode
      when COM
        print("手番を選択してください\n")
        print("1: 先手(黒), 2: 後手(白)")
        player = gets.chomp!.to_i
        case player
        when 1
          print("あなたの先手で始めます\n")
          @player_color = BLACK
        when 2
          print("comの先手で始めます\n")
          @player_color = WHITE
        end
      end
      start_game
    else
      print("1~4で選択してください\n\n")
      menu
    end
  end
end

2. 対戦モードによって石を置く処理を分ける

人が置くかCOMが置くかの2通り
今までput_stoneメソッドで行っていた処理をphasehuman or comput_stoneの4つのメソッドに分ける

#手番の流れ
def phase
  turnable_cells = get_turnable_cells #石を置くことができるマスの一覧の取得
  if turnable_cells.size == 0
    print("パスしました\n")
    @pass_count += 1
    @stone_color = -@stone_color
  else
    print("#{@turn+1}手目: ")
    case @mode
    when COM #COM戦の場合
      if @stone_color == @player_color #プレイヤーの手番の時は人が置く
        human(turnable_cells)
      else #COMの手番の時はcomが置く
        com(turnable_cells) 
      end
    when HUMAN #対人戦の場合
      human(turnable_cells)
    when WATCH #観戦の場合
      com(turnable_cells)
    end
  end
end

def human(turnable_cells) #人が石を置く操作
end

def com(turnable_cells) #COMの場合
end

#石を置く
def put_stone(cell)
  col = cell[0]
  row = cell[1]
  @board[col][row] = @stone_color
  reverse_stone(col, row)
  @stone_color = -@stone_color #処理が終わったら色を変える
  @turn += 1
  @pass_count = 0
end

3. 人が石を置く動作

前回までのput_stoneメソッドから今回のput_stoneメソッドにもある部分を抜いただけ

def human(turnable_cells) #人が石を置く操作
  cell_list = ""
  turnable_cells.each do |val|
    cell_list += "(" + ROW_NUM.key(val[1]) + COL_NUM.key(val[0]) + ")"
  end
  move = gets.chomp!
  if move =~ /[a-h][1-8]/
    cell = move.split("")
    col = COL_NUM[cell[1]]
    row = ROW_NUM[cell[0]]
    cell = [col, row]
    if turnable_cells.include?(cell) #指定されたマスが置くことができるマスの時
      put_stone(cell)
    else
      print("そのマスには打つことはできません\n")
      print("打てるマスは#{cell_list}です\n")
      phase
    end
  else
    print("正しいマスを指定してください\n")
    phase
  end
end

4. COMが石を置く動作

石を置くことができるマスの一覧からランダムに1つ取り出しそのマスに置く

def com(turnable_cells) #COMの場合
  cell = turnable_cells.sample
  col = COL_NUM.key(cell[0])
  row = ROW_NUM.key(cell[1])
  print(row + col) #石を置いた座標を人にもわかるように変換する
  put_stone(cell)
end

完成

com対戦できるオセロ · GitHub