@@ -19,10 +19,8 @@ class MissingPiece < StandardError; end
19
19
class CannotMove < StandardError ; end
20
20
class Nifu < StandardError ; end
21
21
22
- # TODO: 二歩判定
23
22
# TODO: ログ機能
24
23
# TODO: 待った機能
25
- # TODO: 負けました機能
26
24
27
25
class Board
28
26
include Singleton
@@ -171,14 +169,14 @@ def set pos, kind, id
171
169
return
172
170
end
173
171
174
- if exist_column_fu? pos [ 0 ] , order ( id )
172
+ if exist_column_fu? ( pos [ 0 ] , order ( id ) )
175
173
raise Nifu , "二歩です"
176
174
end
177
175
178
176
piece = piece_incetance ( kind , order ( id ) , false )
179
177
180
178
if @data . on_stand? order ( id ) , piece
181
- @data . del_piece order , piece
179
+ @data . del_piece order ( id ) , piece
182
180
else
183
181
raise MissingPiece , "駒台に指定の駒がありません"
184
182
end
@@ -188,13 +186,13 @@ def set pos, kind, id
188
186
189
187
def exist_column_fu? column , order
190
188
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
194
192
end
195
193
end
196
194
197
- return true
195
+ return false
198
196
end
199
197
200
198
def piece_incetance kind , order , grow
@@ -296,4 +294,119 @@ def move_list piece, pos
296
294
end
297
295
list
298
296
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
299
412
end
0 commit comments