BoardClassの実装

ゲーム板の情報を管理するBoardClassを作っていきます

ボードの操作処理を一まとめにする

board.rbを新たに作成していきましょう。

置く場所があるのか・ゲーム板の出力に関してはボードクラスに尋ねることにします。

# frozen_string_literal: true

require_relative "const"
require_relative "tic_tac_toe_input_error"
require_relative "tic_tac_toe_validator"

# ゲームの板に関する情報を管理する
class Board
  def initialize(board)
    @board = board
  end

  def board_state
    @board
  end

  # 概要: 現在のプレイヤーのゲームの勝利判定
  # 引数:   piece: プレイヤーのコマ
  # 戻り値: 勝利している場合 => true
  #        それ以外 => false
  def win?(piece)
    # 横の判定
    return true if piece == @board[0][0] && piece == @board[0][1] && piece == @board[0][2]
    return true if piece == @board[1][0] && piece == @board[1][1] && piece == @board[1][2]
    return true if piece == @board[2][0] && piece == @board[2][1] && piece == @board[2][2]

    # 縦の判定
    return true if piece == @board[0][0] && piece == @board[1][0] && piece == @board[2][0]
    return true if piece == @board[0][1] && piece == @board[1][1] && piece == @board[2][1]
    return true if piece == @board[0][2] && piece == @board[1][2] && piece == @board[2][2]

    # 斜めの判定
    return true if piece == @board[0][0] && piece == @board[1][1] && piece == @board[2][2]
    return true if piece == @board[0][2] && piece == @board[1][1] && piece == @board[2][0]

    false
  end

  # 概要: コマを配置する場所があるかどうかを判定する
  # 引数: なし
  # 戻り値: コマを配置する場所がある => true
  #         コマを配置する場所がない => false
  def can_plase_piece?
    @board.any? { |row| row.any? { |a| OPEN_SLOT == a } }
  end

  # 概要: ゲーム板にコマを配置する
  # 引数: row: 入力された更新する行番号
  #      col: 入力された更新する列番号
  #      piece: プレイヤーのコマ
  # 戻り値: なし
  def update(row, col, piece)
    TicTacToeValidator.validate_place!(@board, row, col)
    @board[row][col] = piece
  end

  # 説明: ゲーム板の状態をコンソールに出力する
  # 引数: なし
  # 戻り値: なし
  def print_board
    puts ""
    @board.each do |row|
      row.each do |e|
        print " N " if OPEN_SLOT == e
        print " o " if PLAYER1_PIECE == e
        print " x " if PLAYER2_PIECE == e
      end
      puts ""
    end
    puts ""
  end
end

テスト実装

元あったテストファイルからPlayerクラスのテストを抽出して新たにboard_test.rbを作成します

課題コーナー

player_test.rbを作成しテストを実装する

参考コードは以下のURLから参照してください

最終更新