このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1274827528/43
#  [1] 授業単元:C言語プログラミング  
#  [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10627.txt  
# 問題:2人のプレーヤーが1台のパソコンの前に座って、五目並べをするプログラムを
# 次のステップ([1]〜[4])に従って作成しなさい。
# 
# [step1]'十','−’,'|’などの文字を使って五目並べをするための10行10列の格子枠をキャラク
#    タモードで表示する。関数化(関数名waku)しておく。(注意:この格子枠を表示するのが
#    難しければ、列を表す最上端の数字1〜1Oと、各行の左端に行を現す数字1〜10を表示
#    すること)
# 	1	 2    ・・・・・10
#      +−−−+−−−+・・・
#   1  |      
#      +
#   2  |
#   ・
#  ・
#  10
# [step2]メイン関数で”Aさん次の手を入力しなさい”とモニタに表示し、次の手を3_4↓のよ
#   うに入力する。入力データを引数で関数wakuに渡し、関数側で格子枠の3行目4列目に’A’
#   を埋め込み,[step 1 ]で作成した格子枠とともに表示する。
#                3   4
# 		    ・    ・   ・ 
#           ・  +−−−+−−−+
#           3    |      |  B |
#                +−−−+−−−+
# 
# 
# [step3]AさんとBさんが交互に次の手を入力しながら、Aさんの手は'A'を、Bさんの手は'B'を
#  枠内に埋め込み格子枠とともに表示する。この時、既に打たれた枠に入力した場合は再度入力
#  を促すようにする。
# [step4]更に、AさんとBさんが次の手を打つ毎に、そのデータを5個並んだか調べる関数(関数
#  名narabi)に渡し、縦、横、斜め方向に5個並んでいるか調べ、結果をメイン関数に返す。 5
#  個並んでいたらメイン関数側で”Aさんの勝ぢまたぱBさんの勝ぢと表示する。並んで
#  いなければゲームを続ける。
# 
# 質問1
# :このプログラムは人間同士がディスプレイを単なる碁盤として使用し、五目並べを行う
# プログラムである。このプログラムを修正して人間とコンピュータが対戦するようにするに
# はどのような改良を加えなければならないか、考えて答えなさい。

初期盤面[
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],
[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']].

五目並べ :-
        初期盤面(_盤面),
        五目並べ(A,_盤面).

五目並べ(A,_盤面) :-
        次の手を入力する(A,_盤面,_行,_列,_更新された盤面),
        五目並べ表示(_更新された盤面),
        五目並べ評価(A,_行,_列,_更新された盤面).
五目並べ(B,_盤面) :-
        次の手を入力する(B,_盤面,_行,_列,_更新された盤面),
        五目並べ表示(_更新された盤面),
        五目並べ評価(B,_行,_列,_更新された盤面).

五目並べ評価(_棋士,_盤面) :-
        五目並べ完成(_棋士,_行,_列,_盤面),
        write_formatted('%tさんの勝ちです!\n',[_棋士]),!.
五目並べ評価(A,_,_,_盤面) :- 五目並べ(B,_盤面),!.
五目並べ評価(B,_,_,_盤面) :- 五目並べ(A,_盤面),!.

五目並べ完成(_棋士,_行,_列,_盤面) :-
        五目並んだ状態とは(_棋士,_五目並んだ状態),
        五目並んでいる(_五目並んだ状態,_行,_列,_盤面),!.

五目並んでいる(_五目並んだ状態,_行,_列,_盤面) :-
        五目(_行,_列,L),
        findall(X,(member((A,B),L),I is A,J is B,list_nth(I,_盤面,L1),list_nth(J,L1,X)),_五目並んだ状態),!.

五目(_行,_列,[(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3),(_行-4,_列+4)]).
五目(_行,_列,[(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3)]).
五目(_行,_列,[(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2)]).
五目(_行,_列,[(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1)]).
五目(_行,_列,[(_行+4,_列-4),(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列)]).
%
五目(_行,_列,[(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3),(_行+4,_列+4)]).
五目(_行,_列,[(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3)]).
五目(_行,_列,[(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2)]).
五目(_行,_列,[(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1)]).
五目(_行,_列,[(_行-4,_列-4),(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列)]).
%
五目(_行,_列,[(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列),(_行+4,_列)]).
五目(_行,_列,[(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列)]).
五目(_行,_列,[(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列)]).
五目(_行,_列,[(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列)]).
五目(_行,_列,[(_行-4,_列),(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列)]).
%
五目(_行,_列,[(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3),(_行,_列+4)]).
五目(_行,_列,[(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3)]).
五目(_行,_列,[(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2)]).
五目(_行,_列,[(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1)]).
五目(_行,_列,[(_行,_列-4),(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列)]).

五目並んだ状態とは(_棋士,[_棋士,_棋士,_棋士,_棋士,_棋士]).

次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :-
        write_formatted('%tさん次の手を入力しなさい : ',[_棋士]),
        get_split_line([' '],[_行,_列]),
        盤面更新(_棋士,_行,_列,_盤面,_更新された盤面),!.
次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :-
        write('その手は既に石があり打てませんもう一度入力してください\n'),
        次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面).

盤面更新(_棋士,_行,_列,_盤面,_更新された盤面) :-
        list_nth(_行,_盤面,L),
        要素番号によるならびの置換(_列,_棋士,L,L1),
        要素番号によるならびの置換(_行,L1,_盤面,_更新された盤面),!.

五目並べ盤面表示(_盤面) :-
        五目並べ横罫,
        五目並べ表示(1,_盤面),!.

五目並べ横罫 :- write('  +−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+\n').

五目並べ表示(_,[]) :- !.        
五目並べ表示(N,[_行|R]) :-
        半角全角数字変換(N,NS),
        write_formatted('%t',[NS]),
        五目並べ行表示(_行),
        五目並べ横罫,
        N2 is N + 1,
        五目並べ表示(N2,R).

五目並べ行表示([]) :- write('|\n'),!.
五目並べ行表示([A|R]) :- write('| %t ',[A]),五目並べ行表示(R).

半角全角数字変換(1,' 1').
半角全角数字変換(2,' 2').
半角全角数字変換(3,' 3').
半角全角数字変換(4,' 4').
半角全角数字変換(5,' 5').
半角全角数字変換(6,' 6').
半角全角数字変換(7,' 7').
半角全角数字変換(8,' 8').
半角全角数字変換(9,' 9').
半角全角数字変換(10,'10').