class RubyShogi::Mgen

Constants

BISHOP_MOVES
BLACK_GOLD_GENERAL_MOVES

black

BLACK_KNIGHT_MOVES
BLACK_LANCE_MOVES
BLACK_SILVER_GENERAL_MOVES
KING_MOVES
PROMO_NO

promotions

PROMO_STAY
PROMO_YES
ROOK_MOVES

both

WHITE_GOLD_GENERAL_MOVES

white

WHITE_KNIGHT_MOVES
WHITE_LANCE_MOVES
WHITE_SILVER_GENERAL_MOVES

Attributes

only_captures[RW]
pseudo_moves[RW]

Public Class Methods

new(board) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 37
def initialize(board)
        @board, @moves = board, []
        @x_gen, @y_gen, @from_gen = 0, 0, 0 # move generation
        @x_checks, @y_checks = 0, 0 # checks
        @pseudo_moves = false # 3x speed up
end

Public Instance Methods

checks_b?(here = nil, useking = true) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 136
def checks_b?(here = nil, useking = true)
        here = here == nil ? @board.wking : here
        #fail if @board.find_white_king != here
        81.times do |i|
                @x_checks, @y_checks = i % 9, (i / 9).to_i
                case @board.brd[i]
                when -1 then return true if pawn_checks_b?(here)
                when -2 then return true if jump_checks_to?(BLACK_GOLD_GENERAL_MOVES, here)
                when -3 then return true if slider_checks_to?(BLACK_LANCE_MOVES, here)
                when -4 then return true if jump_checks_to?(BLACK_GOLD_GENERAL_MOVES, here)
                when -5 then return true if jump_checks_to?(BLACK_KNIGHT_MOVES, here)
                when -6 then return true if jump_checks_to?(BLACK_GOLD_GENERAL_MOVES, here)
                when -7 then return true if jump_checks_to?(BLACK_SILVER_GENERAL_MOVES, here)
                when -8 then return true if jump_checks_to?(BLACK_GOLD_GENERAL_MOVES, here)
                when -9 then return true if jump_checks_to?(BLACK_GOLD_GENERAL_MOVES, here)
                when -10 then return true if slider_checks_to?(BISHOP_MOVES, here)
                when -11 then return true if slider_checks_to?(BISHOP_MOVES, here) || jump_checks_to?(PROMOTED_BISHOP_MOVES, here)
                when -12 then return true if slider_checks_to?(ROOK_MOVES, here)
                when -13 then return true if slider_checks_to?(ROOK_MOVES, here) || jump_checks_to?(PROMOTED_ROOK_MOVES, here)
                when -14 then return true if useking && jump_checks_to?(KING_MOVES, here)
                end
        end
        false
end
checks_w?(here = nil, useking = true) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 111
def checks_w?(here = nil, useking = true)
        here = here == nil ? @board.bking : here
        #fail if @board.find_black_king !=  here
        81.times do |i|
                @x_checks, @y_checks = i % 9, (i / 9).to_i
                case @board.brd[i]
                when 1 then return true if pawn_checks_w?(here)
                when 2 then return true if jump_checks_to?(WHITE_GOLD_GENERAL_MOVES, here)
                when 3 then return true if slider_checks_to?(WHITE_LANCE_MOVES, here)
                when 4 then return true if jump_checks_to?(WHITE_GOLD_GENERAL_MOVES, here)
                when 5 then return true if jump_checks_to?(WHITE_KNIGHT_MOVES, here)
                when 6 then return true if jump_checks_to?(WHITE_GOLD_GENERAL_MOVES, here)
                when 7 then return true if jump_checks_to?(WHITE_SILVER_GENERAL_MOVES, here)
                when 8 then return true if jump_checks_to?(WHITE_GOLD_GENERAL_MOVES, here)
                when 9 then return true if jump_checks_to?(WHITE_GOLD_GENERAL_MOVES, here)
                when 10 then return true if slider_checks_to?(BISHOP_MOVES, here)
                when 11 then return true if slider_checks_to?(BISHOP_MOVES, here) || jump_checks_to?(PROMOTED_BISHOP_MOVES, here)
                when 12 then return true if slider_checks_to?(ROOK_MOVES, here)
                when 13 then return true if slider_checks_to?(ROOK_MOVES, here) || jump_checks_to?(PROMOTED_ROOK_MOVES, here)
                when 14 then return true if useking && jump_checks_to?(KING_MOVES, here)
                end
        end
        false
end
eaten_piece(eat) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 65
def eaten_piece(eat) 
        case eat
        when 2 then 1
        when 4 then 3
        when 6 then 5
        when 8 then 7
        when 11 then 10
        when 13 then 12
        else eat
        end
end
good_coord?(i) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 61
def good_coord?(i)
        i >= 0 && i <= 80
end
is_on_board?(x, y) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 52
def is_on_board?(x, y) 
        x >= 0 && x <= 8 && y >= 0 && y <= 8
end
jump_checks_to?(jumps, here) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 103
def jump_checks_to?(jumps, here)
        jumps.each do |jmp|
                px, py = @x_checks + jmp[0], @y_checks + jmp[1]
                return true if is_on_board?(px, py) && px + py * 9 == here
        end
        false
end
pawn_checks_b?(here) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 85
def pawn_checks_b?(here)
        @x_checks + 9 * (@y_checks - 1) == here
end
pawn_checks_w?(here) click to toggle source

Checks

# File lib/ruby_shogi/mgen.rb, line 81
def pawn_checks_w?(here)
        @x_checks + 9 * (@y_checks + 1) == here
end
print_move_list() click to toggle source

Utils

remove_from_array(array, x) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 56
def remove_from_array(array, x)
        array.delete_at(array.index(x) || array.length)
        array
end
slider_checks_to?(slider, here) click to toggle source
# File lib/ruby_shogi/mgen.rb, line 89
def slider_checks_to?(slider, here)
        slider.each do |jmp|
                px, py = @x_checks, @y_checks
                loop do
                        px, py = px + jmp[0], py + jmp[1]
                        break if !is_on_board?(px, py)
                        to = px + py * 9
                        return true if to == here
                        break if !@board.empty?(to)
                end
        end
        false
end