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