#!ruby
=begin
※問題
c言語です。以下のプログラミングを教えてください。
五目並べとは,以下のルールをもつゲームである.
2人のプレイヤーが盤面の上に黒・白の石を 1つずつ交互に置く.
置く場所は自由(禁じ手はないもとする)であり,いったん置いた石は除かれない.
自らの色の石を 5個以上の直線(縦、横、もしくは 45度の斜め)に並べた方が勝ちとなる.
石が盤面の全て埋め尽くした時点で勝敗が決まっていない場合は引き分けとする.
盤面の大きさは 15x15 とする
【課題問題I】
五目並べのプログラムを作成せよ.ただし,以下の機能を有すること.
先手は o,後手は x として表示すると 最初に盤面の情報を表示し,次に,どちらかの番であるか表示し,石を置く位置を入力させること.
位置として置けない場所が入力された場合は再入力させること
勝敗が決まった場合は,どちらが勝利したかのメッセージを表示し終了すること
すべての升に石が置かれた状態で引き分けの場合は,引き分けのメッセージを表示し終了すること
=end
CharMap = [ '.', 'o', 'x' ]
$bord = Array.new(15){ Array.new(15){ 0 } }
Ruler = " " + (0...15).to_a.map{|x| '%X' % [x+1]}.join(' ')
$player = 1
$tesuu = 0
def printBoard
puts Ruler
rul = 'F'
15.times{|y| print " #{rul.succ!} ", (0...15).to_a.map{|x| CharMap[$bord[y][x] ] }.join(' '), " #{rul}\n" }
puts Ruler
end
def input_point
print " #{CharMap[$player]} : "
zahyou = gets&.strip&.upcase
exit if zahyou == nil
x = /[1-9A-F]/.match( zahyou ).to_a[0]
y = /[G-U]/.match( zahyou ).to_a[0]
return nil unless x && y
x = x.to_i(16) - 1
y = y.ord - 'G'.ord
return nil if $bord[y][x] != 0
[x,y]
end
def input_point_debug
kuu = []
15.times{|y|
15.times{|x| kuu << [x,y] if $bord[y][x] == 0 }
}
x, y = kuu[ rand( kuu.size ) ]
puts " #{CharMap[$player]} : #{'%X' % [x+1]} #{(y+'G'.ord).chr}\n\n"
sleep 0.1
[x,y]
end
def hantei( x, y )
$bord[y][x] = $player
$tesuu += 1
[ [1,0], [0,1], [1,1], [1,-1] ].each{|dx1,dy1|
ren = 1
[ [dx1,dy1], [-dx1,-dy1] ].each{|dx2,dy2|
xx = x + dx2
yy = y + dy2
while xx >= 0 && xx < 15 && yy >= 0 && yy < 15 && $bord[yy][xx] == $player
ren += 1
xx += dx2
yy += dy2
end
}
return true if ren >= 5
}
false
end
#####################################################################
loop do
printBoard()
x = y = nil
loop do
x, y = input_point()
# x, y = input_point_debug()
break if x
printBoard()
puts "retry"
end
if hantei( x, y )
printBoard()
puts "Winner '#{CharMap[$player]}'."
break
end
if $tesuu == 15*15
puts "\nDraw gaem."
break
end
$player = 3 - $player
puts
end
IyFydWJ5Cgo9YmVnaW4KCuKAu+WVj+mhjApj6KiA6Kqe44Gn44GZ44CC5Lul5LiL44Gu44OX44Ot44Kw44Op44Of44Oz44Kw44KS5pWZ44GI44Gm44GP44Gg44GV44GE44CCCuS6lOebruS4puOBueOBqOOBr++8jOS7peS4i+OBruODq+ODvOODq+OCkuOCguOBpOOCsuODvOODoOOBp+OBguOCi++8jgoy5Lq644Gu44OX44Os44Kk44Ok44O844GM55uk6Z2i44Gu5LiK44Gr6buS44O755m944Gu55+z44KSIDHjgaTjgZrjgaTkuqTkupLjgavnva7jgY/vvI4K572u44GP5aC05omA44Gv6Ieq55Sx77yI56aB44GY5omL44Gv44Gq44GE44KC44Go44GZ44KL77yJ44Gn44GC44KK77yM44GE44Gj44Gf44KT572u44GE44Gf55+z44Gv6Zmk44GL44KM44Gq44GE77yOCuiHquOCieOBruiJsuOBruefs+OCkiA15YCL5Lul5LiK44Gu55u057ea77yI57im44CB5qiq44CB44KC44GX44GP44GvIDQ15bqm44Gu5pac44KB77yJ44Gr5Lim44G544Gf5pa544GM5Yud44Gh44Go44Gq44KL77yOCuefs+OBjOebpOmdouOBruWFqOOBpuWfi+OCgeWwveOBj+OBl+OBn+aZgueCueOBp+WLneaVl+OBjOaxuuOBvuOBo+OBpuOBhOOBquOBhOWgtOWQiOOBr+W8leOBjeWIhuOBkeOBqOOBmeOCi++8jgrnm6TpnaLjga7lpKfjgY3jgZXjga8gMTV4MTUg44Go44GZ44KLCgrjgJDoqrLpoYzllY/poYzvvKnjgJEK5LqU55uu5Lim44G544Gu44OX44Ot44Kw44Op44Og44KS5L2c5oiQ44Gb44KI77yO44Gf44Gg44GX77yM5Lul5LiL44Gu5qmf6IO944KS5pyJ44GZ44KL44GT44Go77yOCuWFiOaJi+OBryBv77yM5b6M5omL44GvIHgg44Go44GX44Gm6KGo56S644GZ44KL44GoICDmnIDliJ3jgavnm6TpnaLjga7mg4XloLHjgpLooajnpLrjgZfvvIzmrKHjgavvvIzjganjgaHjgonjgYvjga7nlarjgafjgYLjgovjgYvooajnpLrjgZfvvIznn7PjgpLnva7jgY/kvY3nva7jgpLlhaXlipvjgZXjgZvjgovjgZPjgajvvI4K5L2N572u44Go44GX44Gm572u44GR44Gq44GE5aC05omA44GM5YWl5Yqb44GV44KM44Gf5aC05ZCI44Gv5YaN5YWl5Yqb44GV44Gb44KL44GT44GoCuWLneaVl+OBjOaxuuOBvuOBo+OBn+WgtOWQiOOBr++8jOOBqeOBoeOCieOBjOWLneWIqeOBl+OBn+OBi+OBruODoeODg+OCu+ODvOOCuOOCkuihqOekuuOBl+e1guS6huOBmeOCi+OBk+OBqArjgZnjgbnjgabjga7ljYfjgavnn7PjgYznva7jgYvjgozjgZ/nirbmhYvjgaflvJXjgY3liIbjgZHjga7loLTlkIjjga/vvIzlvJXjgY3liIbjgZHjga7jg6Hjg4Pjgrvjg7zjgrjjgpLooajnpLrjgZfntYLkuobjgZnjgovjgZPjgagKCj1lbmQKCgpDaGFyTWFwID0gWyAnLicsICdvJywgJ3gnIF0KJGJvcmQgPSBBcnJheS5uZXcoMTUpeyBBcnJheS5uZXcoMTUpeyAwIH0gfQpSdWxlciA9ICIgICAgIiArICgwLi4uMTUpLnRvX2EubWFwe3x4fCAnJVgnICUgW3grMV19LmpvaW4oJyAnKQokcGxheWVyID0gMQokdGVzdXUgPSAwCgpkZWYgcHJpbnRCb2FyZAogICAgcHV0cyBSdWxlcgogICAgcnVsID0gJ0YnCiAgICAxNS50aW1lc3t8eXwgcHJpbnQgIiAgI3tydWwuc3VjYyF9ICIsICgwLi4uMTUpLnRvX2EubWFwe3x4fCBDaGFyTWFwWyRib3JkW3ldW3hdIF0gfS5qb2luKCcgJyksICIgI3tydWx9XG4iIH0KICAgIHB1dHMgUnVsZXIKZW5kCgpkZWYgaW5wdXRfcG9pbnQKICAgIHByaW50ICIgI3tDaGFyTWFwWyRwbGF5ZXJdfSA6ICIKICAgIHphaHlvdSA9IGdldHMmLnN0cmlwJi51cGNhc2UKICAgIGV4aXQgaWYgemFoeW91ID09IG5pbAogICAgeCA9IC9bMS05QS1GXS8ubWF0Y2goIHphaHlvdSApLnRvX2FbMF0KICAgIHkgPSAvW0ctVV0vLm1hdGNoKCB6YWh5b3UgKS50b19hWzBdCiAgICByZXR1cm4gbmlsICB1bmxlc3MgeCAmJiB5CiAgICB4ID0geC50b19pKDE2KSAtIDEKICAgIHkgPSB5Lm9yZCAtICdHJy5vcmQKICAgIHJldHVybiBuaWwgIGlmICRib3JkW3ldW3hdICE9IDAKICAgIFt4LHldCmVuZAoKZGVmIGlucHV0X3BvaW50X2RlYnVnCiAgICBrdXUgPSBbXQogICAgMTUudGltZXN7fHl8CiAgICAgICAgMTUudGltZXN7fHh8IGt1dSA8PCBbeCx5XSBpZiAkYm9yZFt5XVt4XSA9PSAwIH0KICAgIH0KICAgIHgsIHkgPSBrdXVbIHJhbmQoIGt1dS5zaXplICkgXQogICAgcHV0cyAiICN7Q2hhck1hcFskcGxheWVyXX0gOiAjeyclWCcgJSBbeCsxXX0gI3soeSsnRycub3JkKS5jaHJ9XG5cbiIKICAgIHNsZWVwIDAuMQogICAgW3gseV0KZW5kCgpkZWYgaGFudGVpKCB4LCB5ICkKICAgICRib3JkW3ldW3hdID0gJHBsYXllcgogICAgJHRlc3V1ICs9IDEKICAgIFsgWzEsMF0sIFswLDFdLCBbMSwxXSwgWzEsLTFdIF0uZWFjaHt8ZHgxLGR5MXwKICAgICAgICByZW4gPSAxCiAgICAgICAgWyBbZHgxLGR5MV0sIFstZHgxLC1keTFdIF0uZWFjaHt8ZHgyLGR5MnwKICAgICAgICAgICAgeHggPSB4ICsgZHgyCiAgICAgICAgICAgIHl5ID0geSArIGR5MgogICAgICAgICAgICB3aGlsZSB4eCA+PSAwICYmIHh4IDwgMTUgJiYgeXkgPj0gMCAmJiB5eSA8IDE1ICYmICRib3JkW3l5XVt4eF0gPT0gJHBsYXllcgogICAgICAgICAgICAgICAgcmVuICs9IDEKICAgICAgICAgICAgICAgIHh4ICs9IGR4MgogICAgICAgICAgICAgICAgeXkgKz0gZHkyCiAgICAgICAgICAgIGVuZAogICAgICAgIH0KICAgICAgICByZXR1cm4gdHJ1ZSBpZiByZW4gPj0gNQogICAgfQogICAgZmFsc2UKZW5kCgojIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMjIyMKCiAgICBsb29wIGRvCiAgICAgICAgcHJpbnRCb2FyZCgpCiAgICAgICAgeCA9IHkgPSBuaWwKICAgICAgICBsb29wIGRvCiAgICAgICAgICAgIHgsIHkgPSBpbnB1dF9wb2ludCgpCiMgICAgICAgICAgIHgsIHkgPSBpbnB1dF9wb2ludF9kZWJ1ZygpCiAgICAgICAgICAgIGJyZWFrICAgaWYgeAogICAgICAgICAgICBwcmludEJvYXJkKCkKICAgICAgICAgICAgcHV0cyAicmV0cnkiCiAgICAgICAgZW5kCiAgICAgICAgaWYgaGFudGVpKCB4LCB5ICkKICAgICAgICAgICAgcHJpbnRCb2FyZCgpCiAgICAgICAgICAgIHB1dHMgIldpbm5lciAnI3tDaGFyTWFwWyRwbGF5ZXJdfScuIgogICAgICAgICAgICBicmVhawogICAgICAgIGVuZAogICAgICAgIGlmICR0ZXN1dSA9PSAxNSoxNQogICAgICAgICAgICBwdXRzICJcbkRyYXcgZ2FlbS4iCiAgICAgICAgICAgIGJyZWFrCiAgICAgICAgZW5kCiAgICAgICAgJHBsYXllciA9IDMgLSAkcGxheWVyCiAgICAgICAgcHV0cwogICAgZW5kCg==