Module: RubyShogi::Eval

Defined in:
lib/ruby_shogi/eval.rb

Constant Summary collapse

MATERIAL_SCORE =
{
  1 => 1,
  2 => 4.2,
  3 => 4.3,
  4 => 6.3,
  5 => 4.5,
  6 => 6.4,
  7 => 6.4,
  8 => 6.7,
  9 => 6.9,
  10 => 8.9,
  11 => 11.5,
  12 => 10.4,
  13 => 13,
  14 => 0
}
MATERIAL_HAND_SCORE =
{
  1 => 1.15,
  3 => 4.8,
  5 => 5.1,
  7 => 7.2,
  9 => 7.8,
  10 => 11.10,
  12 => 10.4,
  13 => 12.7
}
CENTRAL_BONUS =
[1,2,3,4,5,4,3,2,1].freeze
CENTRAL_SCORE =
{
  1 => 0,
  2 => 2,
  3 => 1,
  4 => 2,
  5 => 1,
  6 => 2,
  7 => 2,
  8 => 2,
  9 => 2,
  10 => 2,
  11 => 2,
  12 => 2,
  13 => 2,
  14 => 0
}
EVAL_PST_MG =
[]

Class Method Summary collapse

Class Method Details

.eval(board) ⇒ Object



73
74
75
76
77
78
79
80
81
82
83
84
# File 'lib/ruby_shogi/eval.rb', line 73

def Eval.eval(board)
  score = 0
  board.brd.each_with_index do |p, i|
    score += case p
      when 1..14 then EVAL_PST_MG[p - 1][i]
      when -14..-1 then EVAL_PST_MG[-p - 1][i]
      else 
        0
      end
  end
  0.01 * score
end

.initObject



60
61
62
63
64
65
66
67
68
69
70
71
# File 'lib/ruby_shogi/eval.rb', line 60

def Eval.init
  return if EVAL_PST_MG.length > 0
  14.times do |i|
    arr = []
    81.times do |j|
      score = 0.1 * (MATERIAL_SCORE[i + 1] + 2 * CENTRAL_SCORE[i + 1] * (CENTRAL_BONUS[j % 9 ] + CENTRAL_BONUS[j / 9]))
      arr.push(score)
    end
    EVAL_PST_MG.push(arr)
  end
  EVAL_PST_MG.freeze
end

.material(board) ⇒ Object



108
109
110
111
112
113
114
115
116
117
118
119
120
121
# File 'lib/ruby_shogi/eval.rb', line 108

def Eval.material(board)
  score = 0
  board.brd.each do |p|
    score += case p
      when 1..14 then MATERIAL_SCORE[p]
      when -14..-1 then -MATERIAL_SCORE[-p]
      else 
        0
      end
  end
  board.white_pocket.each { |p| score += MATERIAL_HAND_SCORE[p] }
  board.black_pocket.each { |p| score -= MATERIAL_HAND_SCORE[-p] }
  score
end

.material2(board) ⇒ Object



86
87
88
89
90
91
92
# File 'lib/ruby_shogi/eval.rb', line 86

def Eval.material2(board)
  #board.print_board
  #puts Eval.material2(board)
  #puts Eval.material3(board)
  #fail if Eval.material2(board) != Eval.material3(board)
  0
end

.material3(board) ⇒ Object



94
95
96
97
98
99
100
101
102
103
104
105
106
# File 'lib/ruby_shogi/eval.rb', line 94

def Eval.material3(board)
  score = board.brd.inject do |sum, p|
    sum += case p
      when 1..14 then MATERIAL_SCORE[p]
      when -14..-1 then -MATERIAL_SCORE[-p]
      else 
        0
      end
  end
  board.white_pocket.each { |p| score += MATERIAL_HAND_SCORE[p] }
  board.black_pocket.each { |p| score -= MATERIAL_HAND_SCORE[-p] }
  score
end