Sha256: f8a23aab0fcb9022f65dabd00aea264ea3d458b2d9a5caf055338ae2cd43c984

Contents?: true

Size: 1.52 KB

Versions: 9

Compression:

Stored size: 1.52 KB

Contents

# frozen-string-literal: true

module Bioshogi
  module BoardParser
    # P1-KY-KE-GI-KI-OU-KI-GI-KE-KY
    # P2 * -HI *  *  *  *  * -KA *
    # P3-FU-FU-FU-FU-FU-FU-FU-FU-FU
    # P4 *  *  *  *  *  *  *  *  *
    # P5 *  *  *  *  *  *  *  *  *
    # P6 *  *  *  *  *  *  *  *  *
    # P7+FU+FU+FU+FU+FU+FU+FU+FU+FU
    # P8 * +KA *  *  *  *  * +HI *
    # P9+KY+KE+GI+KI+OU+KI+GI+KE+KY
    class CsaBoardParser < Base
      def self.accept?(source)
        source && source.match?(/\b(P\d+)\b/)
      end

      def parse
        shape_lines.each do |line|
          if md = line.match(/P(?<y>\d+)\s*(?<cells>.*)\s*/) # strip 代わりに cells の両方を \s* している
            y = md[:y]

            # 空白または * の文字を 1..3 とすることで行末スペースの有無に依存しなくなる
            # この方法では次のようにスペースが潰れている場合に失敗する
            # P1 * -HI * * * * * -KA *
            # cells = md[:cells].scan(/\S{3}|[\s\*]{1,3}/)

            # 改良した方法
            # " " または +- の直前で分離する
            cells = md[:cells].split(/\s+|(?=[+-])/)

            cells.reverse_each.with_index(1) do |e, x|
              if md = e.match(/(?<csa_sign>\S)(?<piece>\S{2})/)
                location = Location[md[:csa_sign]]
                place = Place["#{x}#{y}"]
                soldiers << Soldier.new_with_promoted(md[:piece], place: place, location: location)
              end
            end
          end
        end
      end
    end
  end
end

Version data entries

9 entries across 9 versions & 1 rubygems

Version Path
bioshogi-0.0.15 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.14 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.10 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.9 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.8 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.7 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.5 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.4 lib/bioshogi/board_parser/csa_board_parser.rb
bioshogi-0.0.3 lib/bioshogi/board_parser/csa_board_parser.rb