Skip to content

Commit 02a8a94

Browse files
committed
詰み判定機能追加中
1 parent c27740b commit 02a8a94

File tree

4 files changed

+125
-23
lines changed

4 files changed

+125
-23
lines changed

board.rb

+121-8
Original file line numberDiff line numberDiff line change
@@ -19,10 +19,8 @@ class MissingPiece < StandardError; end
1919
class CannotMove < StandardError; end
2020
class Nifu < StandardError; end
2121

22-
# TODO: 二歩判定
2322
# TODO: ログ機能
2423
# TODO: 待った機能
25-
# TODO: 負けました機能
2624

2725
class Board
2826
include Singleton
@@ -171,14 +169,14 @@ def set pos, kind, id
171169
return
172170
end
173171

174-
if exist_column_fu? pos[0], order(id)
172+
if exist_column_fu?(pos[0], order(id))
175173
raise Nifu, "二歩です"
176174
end
177175

178176
piece = piece_incetance(kind, order(id), false)
179177

180178
if @data.on_stand? order(id), piece
181-
@data.del_piece order, piece
179+
@data.del_piece order(id), piece
182180
else
183181
raise MissingPiece, "駒台に指定の駒がありません"
184182
end
@@ -188,13 +186,13 @@ def set pos, kind, id
188186

189187
def exist_column_fu? column, order
190188
9.times do |row|
191-
pce = @data[column][row]
192-
if pce.player == order && pce.grow == false
193-
return false
189+
pce = @data[column, row]
190+
if pce.player == order && pce.grow == false && pce.class == Fu
191+
return true
194192
end
195193
end
196194

197-
return true
195+
return false
198196
end
199197

200198
def piece_incetance kind, order, grow
@@ -296,4 +294,119 @@ def move_list piece, pos
296294
end
297295
list
298296
end
297+
298+
def check_mate? id
299+
now_order = order id
300+
oute? now_order
301+
# 自分の王の場所を探す
302+
position = ou_enemy_pos now_order
303+
# 王手がかかっているか?
304+
oute_list = get_oute_list(position[:ou], position[:enemy])
305+
return false if oute_list == nil
306+
307+
# 王手をかけている駒を王以外で取れるか
308+
if oute_list.length == 1
309+
if remove_oute(oute_list, position[:friend])
310+
return false
311+
end
312+
end
313+
314+
# 合駒可能か?
315+
if can_guard? oute_list
316+
return false
317+
end
318+
319+
# 王の移動出来る場所を探す
320+
# 動かしてみてもう一度上の処理で撮れる状態か
321+
322+
end
323+
324+
def can_guard? now_order, pos_ou, oute_list
325+
if @data.piece_stand[now_order].length < 1
326+
return false
327+
end
328+
329+
oute_list.each do |enemy|
330+
pce = piece(enemy)
331+
if pce.kind == :fu ||
332+
pce.kind == :kyo ||
333+
pce.kind == :hi ||
334+
pce.kind == :kaku
335+
336+
rlist = road_list(pce, enemy, pos_ou)
337+
rlist.each do |fly_pos|
338+
if piece(fly_pos).kind == nil
339+
# TODO: 駒を置く事が可能か
340+
if exist_column_fu?(pos[0], order(id))
341+
end
342+
end
343+
end
344+
end
345+
end
346+
false
347+
end
348+
349+
def set_piece? pce, pos, now_order
350+
case pce.kind
351+
when :fu
352+
if exist_column_fu?(pos[0], now_order)
353+
false
354+
else
355+
true
356+
end
357+
when :kyo, :kaku, :hi
358+
rlist = road_list(pce, enemy, pos_ou)
359+
rlist.each do |fly_pos|
360+
if piece(fly_pos).kind == nil
361+
end
362+
end
363+
else
364+
true
365+
end
366+
end
367+
368+
def remove_oute oute_list, friend_list
369+
oute_list.each do |enemy|
370+
position[:friend].each do |friend|
371+
if piece(friend).move?(friend, enemy)
372+
return true
373+
end
374+
end
375+
end
376+
false
377+
end
378+
379+
def get_pos now_order
380+
ou = nil
381+
enemy = []
382+
friend = []
383+
9.times do |x|
384+
9.times do |y|
385+
pce = @data[x,y]
386+
if pce.player == now_order
387+
if pce.kind == :ou
388+
ou = [x, y]
389+
else
390+
friend << [x, y]
391+
end
392+
end
393+
394+
if pce.player != now_order
395+
enemy << [x, y]
396+
end
397+
end
398+
end
399+
400+
{ou: ou, friend: friend, enemy: enemy}
401+
end
402+
403+
def get_oute_list ou_pos, enemy_list
404+
oute_list = nil
405+
enemy_list.each do |enemy|
406+
if piece(enemy).move?(enemy, ou_pos)
407+
oute_list << enemy
408+
end
409+
end
410+
oute_list
411+
end
299412
end

board_data.rb

+2-2
Original file line numberDiff line numberDiff line change
@@ -98,9 +98,9 @@ def on_stand? order, piece
9898
end
9999

100100
def del_piece order, piece
101-
@piece_stand[order(id)].each_with_index do |p, i|
101+
@piece_stand[order].each_with_index do |p, i|
102102
if p == piece
103-
@piece_stand[order(id)].delete_at i
103+
@piece_stand[order].delete_at i
104104
break
105105
end
106106
end

pieces/piece.rb

-4
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,3 @@
1-
# TODO: 強制的駒を成る判定(行ける所がない判定)
2-
# TODO: 駒クラスに分けて行けるところ判定を駒クラスに入れる
3-
# initialize / == / to_s
4-
51
class Piece
62
attr_accessor :player, :grow
73

spec/board_spec.rb

+2-9
Original file line numberDiff line numberDiff line change
@@ -28,12 +28,6 @@ def init
2828
end
2929

3030
describe Board do
31-
#it "road_listの確認" do
32-
# pce = @board.piece [4,4]
33-
# #p @board.road_list pce, [4,7], [0,7]
34-
# p @board.move [4,7], [0,7], 1
35-
#end
36-
3731
describe "飛び駒の飛び越し判定" do
3832
describe "香車" do
3933
before do
@@ -160,12 +154,11 @@ def init
160154
9.times do |x|
161155
9.times do |y|
162156
init
163-
p "x:#{x} y:#{y}"
164157
if @nifu_result[x][y] == :success
165-
@board.set [@nifu_pos[0], @nifu_pos[1]], :fu, ID
158+
@board.set [x, y], :fu, ID
166159
else
167160
expect do
168-
@board.set [@nifu_pos[0], @nifu_pos[1]], :fu, ID
161+
@board.set [x, y], :fu, ID
169162
end.to raise_error( @nifu_result[x][y] )
170163
end
171164
end

0 commit comments

Comments
 (0)