From a0f65efbb5146e21ae8bdc855fe4ccf9de930df6 Mon Sep 17 00:00:00 2001 From: Alex Clink Date: Sun, 26 Sep 2021 16:38:55 -0400 Subject: [PATCH] Change Game#index to Game#index_of to unshadow previous def the method #index is defined by the enumerable module, and caused type confusion --- spec/lx_chess/board_spec.cr | 7 +++++++ spec/lx_chess/game/parse_san_spec.cr | 6 +++--- spec/spec_helper.cr | 4 ++-- src/lx_chess/board.cr | 12 ++++++------ src/lx_chess/game.cr | 26 +++++++++++++++----------- src/lx_chess/term_board.cr | 2 +- src/lx_chess/term_game.cr | 4 ++-- 7 files changed, 36 insertions(+), 25 deletions(-) diff --git a/spec/lx_chess/board_spec.cr b/spec/lx_chess/board_spec.cr index 16f7f5b..e4d3507 100644 --- a/spec/lx_chess/board_spec.cr +++ b/spec/lx_chess/board_spec.cr @@ -26,4 +26,11 @@ describe LxChess::Board do board.border_right(12).should eq(15) end end + + describe "#index" do + it "returns the index of a coordinate" do + board = LxChess::Board.new + board.index_of("e2").should eq(12) + end + end end diff --git a/spec/lx_chess/game/parse_san_spec.cr b/spec/lx_chess/game/parse_san_spec.cr index f8bfa60..7f3d6f1 100644 --- a/spec/lx_chess/game/parse_san_spec.cr +++ b/spec/lx_chess/game/parse_san_spec.cr @@ -13,8 +13,8 @@ describe Game do game = Game.new game.board["e2"] = Piece.from_fen('P') from, to = game.parse_san("e4") - from.should eq(game.board.index("e2")) - to.should eq(game.board.index("e4")) + from.should eq(game.board.index_of("e2")) + to.should eq(game.board.index_of("e4")) end it "disambiguates the move correctly" do @@ -27,7 +27,7 @@ describe Game do moves = game.parse_san("dxe5") debug_board(game, moves) - moves.should eq(["d4", "e5"].map { |s| game.board.index(s) }) + moves.should eq(["d4", "e5"].map { |s| game.board.index_of(s) }) end end end diff --git a/spec/spec_helper.cr b/spec/spec_helper.cr index 01cc9bf..d0d32e4 100644 --- a/spec/spec_helper.cr +++ b/spec/spec_helper.cr @@ -5,11 +5,11 @@ require "../src/lx_chess/board" require "../src/lx_chess/term_board" def debug_board(game : LxChess::Game, moves : Array(String)) - moves = moves.map { |m| game.board.index(m) } + moves = moves.map { |m| game.board.index_of(m) } debug_board(game, moves) end -def debug_board(game : LxChess::Game, moves = [] of Int16) +def debug_board(game : LxChess::Game, moves : Array(Int16) = [] of Int16) puts gb = LxChess::TermBoard.new(game.board) gb.highlight(moves) diff --git a/src/lx_chess/board.cr b/src/lx_chess/board.cr index 09acc6b..b0c1bb4 100644 --- a/src/lx_chess/board.cr +++ b/src/lx_chess/board.cr @@ -38,12 +38,12 @@ module LxChess # Retrieve a piece at a human cord ex: `a1` def [](cord : String) - self[index(cord)] + self[index_of(cord)] end # Retrieve a piece at an *x* and *y* cord def at(x : Int, y : Int) - self[index(x, y)] + self[index_of(x, y)] end def rel_index(index : Int, x : Int, y : Int) @@ -58,21 +58,21 @@ module LxChess # Set a piece on the board at a certain human readable *cord* def []=(cord : String, piece : Piece | Nil) - self[index(cord)] = piece + self[index_of(cord)] = piece end # Convert an *x* and *y* position into an index. # Ex: `4, 4` => `36` - def index(x : Int, y : Int) + def index_of(x : Int, y : Int) ((y * @width) + x).to_i16 end # Convert human *cord* into an index on the board. # Ex: `a1` => `0` - def index(cord : String) + def index_of(cord : String) x = LETTERS.index(cord[0].downcase) || 0 y = cord[1].to_i - 1 - index(x, y) + index_of(x, y) end # Convert an *index* into a human coordinate (ex: `a1`) diff --git a/src/lx_chess/game.cr b/src/lx_chess/game.cr index 85ef870..bf3f9a1 100644 --- a/src/lx_chess/game.cr +++ b/src/lx_chess/game.cr @@ -52,7 +52,7 @@ module LxChess def en_passant_target=(cord : String) if cord =~ /[a-z]+\d+/ - @en_passant_target = @board.index(cord) + @en_passant_target = @board.index_of(cord) else @en_passant_target = nil end @@ -63,7 +63,7 @@ module LxChess end def en_passant_target=(cord : String) - @en_passant_target = @board.index(cord) + @en_passant_target = @board.index_of(cord) end def full_moves @@ -85,7 +85,7 @@ module LxChess # Parse standard algebraic notation def parse_san(notation : Notation) - index = @board.index(notation.square) + index = nil if notation.castles? raise "expected to find a king, but couldn't!" unless king = find_king @@ -103,6 +103,12 @@ module LxChess end end + if square = notation.square + index = @board.index_of(square) + end + + raise "Missing index" unless index + fen_symbol = notation.fen_symbol(@turn == 0 ? "w" : "b") move_sets = @board.map do |piece| @@ -134,14 +140,14 @@ module LxChess raise SanError.new("#{notation.to_s} is ambiguous") if move_sets.size > 1 if set = move_sets.first? # from, to - [set.piece.index.as(Int16), index.as(Int16)] + [set.piece.index, index] else raise SanError.new("no moves matching `#{notation.to_s}`") end end def move_to_san(from : String, to : String, promotion : Char? = nil, turn = @turn) - move_to_san(@board.index(from), @board.index(to), promotion, turn) + move_to_san(@board.index_of(from), @board.index_of(to), promotion, turn) end def move_to_san(from : Int, to : Int, promotion : Char? = nil, turn = @turn) @@ -296,7 +302,6 @@ module LxChess return false unless player.castle_king return false unless index = piece.index return false unless (index - @board.border_left(index)).abs >= 2 - # TODO: figure out if castling crosses checks @board[index + 1].nil? && @board[index + 2].nil? end @@ -306,12 +311,11 @@ module LxChess return false unless player.castle_queen return false unless index = piece.index return false unless (index - @board.border_left(index)).abs >= 2 - # TODO: figure out if castling crosses checks @board[index - 1].nil? && @board[index - 2].nil? end def tmp_move(from : String, to : String, promotion : Char? = nil) - tmp_move(@board.index(from), @board.index(to), promotion) do + tmp_move(@board.index_of(from), @board.index_of(to), promotion) do yield end end @@ -334,7 +338,7 @@ module LxChess end def make_move(from : String, to : String, promotion : Char? = nil) - make_move(from: @board.index(from), to: @board.index(to), promotion: promotion) + make_move(from: @board.index_of(from), to: @board.index_of(to), promotion: promotion) end # Make a move given a set of coordinates @@ -368,7 +372,7 @@ module LxChess p && p.color == piece.color && p.rook? && p.index.as(Int16) > piece.index.as(Int16) end if rook - @board.move(from: rook.index.as(Int16), to: to - 1) + @board.move(from: rook.index, to: to - 1) end else tmp_move(from, to + 1) do @@ -379,7 +383,7 @@ module LxChess p && p.color == piece.color && p.rook? && p.index.as(Int16) < piece.index.as(Int16) end if rook - @board.move(from: rook.index.as(Int16), to: to + 1) + @board.move(from: rook.index, to: to + 1) end end end diff --git a/src/lx_chess/term_board.cr b/src/lx_chess/term_board.cr index c06bf61..17b56eb 100644 --- a/src/lx_chess/term_board.cr +++ b/src/lx_chess/term_board.cr @@ -73,7 +73,7 @@ module LxChess io << (y + 1).to_s.rjust(3) << ": " files.each do |x| - index = @board.index(x, y) + index = @board.index_of(x, y) piece = @board[index] tint = (index + y) % 2 == 0 ? :light : :dark diff --git a/src/lx_chess/term_game.cr b/src/lx_chess/term_game.cr index 7c540b3..24ca50f 100644 --- a/src/lx_chess/term_game.cr +++ b/src/lx_chess/term_game.cr @@ -38,7 +38,7 @@ module LxChess when /moves\s+([a-z]\d)/i if matches = input.match(/[a-z]\d/i) if square = matches[0]? - if index = @game.board.index(square) + if index = @game.board.index_of(square) if set = @game.moves(index) @gb.highlight(set.moves, "blue") from = "#{set.piece.fen_symbol}#{@game.board.cord(index)}: " @@ -83,7 +83,7 @@ module LxChess san = @game.move_to_san(from, to, promo) @game.make_move(from, to, promo) @pgn.history << san - @gb.highlight([@game.board.index(from), @game.board.index(to)]) + @gb.highlight([@game.board.index_of(from), @game.board.index_of(to)]) @log.unshift "#{san.to_s}: #{from} => #{to}" end end