このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1308749241/763
#  ・授業:ネットワークプログラミング  
#  ・問題文:以下のプログラムを改編し、ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする。このときサーバーは2つクライアントから入力をうけ、同時に入力結果を返すこととする。  
#  ・プログラムURL:http://ideone.com/pGnkt  
#  ・環境  
#  ・OS: Linux  
#   コンパイル:端末 gcc -o  
#  ・言語:C  
#  ・期限: 2011年07月19日15:30まで  
#   その他の制限: この課題に取り組んでいますが、サーバーとクライアントの間でうまく動作するものが作れません。よろしくお願いいたします。 
#
%  
%  参加者がそれぞれサーバとして振舞う ジャンケンゲーム
%  条件として、サーバ上に表示し、それに対して文字入力応答ができること。
%  
%  ジャンケン胴元によって勝負は制御される。参加者サーバに拳を何にするか
%  質問して、その解答を取りまとめるのがジャンケン胴元の役割だ。
%  
%  胴元側述語

'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび) :-
        member([(_参加者,_),3],_参加者勝数ならび),!,
        writef('%t が3勝しました。勝者は %t です\n',[_参加者,_参加者]),!.
'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび) :-
        ジャンケン(_参加者勝数ならび1),
        ポン(_参加者勝数ならび1,_拳ならび),
        判定(_拳ならび,_判定),
        同報分生成(_参加者勝負ならび,_拳ならび,_同報文),
        同報(_参加者勝負ならび,_同報文),
        成績更新(_判定,_拳ならび,_参加者勝数ならび1,_参加者勝数ならび2),
        'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび2).

ジャンケン([]).
ジャンケン([[(_参加者:_ポート)|_]|R]) :-
        (_参加者:_ポート) :: ジャンケン表示,
        ジャンケン(R).

ポン([[_参加者|_]|R1],[_拳|R2]) :-
        (_参加者:_ポート) :: ポン入力(_拳),
        ポン(R1,R2).

判定(_拳ならび,あいこ) :-
        all(_拳ならび,V),!.
判定(_拳ならび,あいこ) :-
        member(グー,_拳ならび),
        member(パー,_拳ならび),
        member(チョキ,_拳ならび),!.
判定(_拳ならび,パー) :-
        member(グー,_拳ならび),
        member(パー,_拳ならび),!.
判定(_拳ならび,チョキ) :-
        member(パー,_拳ならび),
        member(チョキ,_拳ならび),!.
判定(_拳ならび,グー) :-
        member(チョキ,_拳ならび),
        member(グー,_拳ならび),!.

成績更新(あいこ,_,_参加者勝数ならび,_参加者勝数ならび) :- !.
成績更新(_拳,[_拳|R1],[[(_参加者,_ポート),_勝数1]|R2],[[(_参加者,_ポート),_勝数2]|R3]) :-
        _勝数2 is _勝数1 + 1,
        成績更新(_拳,R1,R2,R3).
成績更新(_拳,[_拳2|R1],[L|R2],[L|R3]) :-
        \+(_拳 = _拳2),
        成績更新(_拳,R1,R2,R3).

同報文生成(_参加者勝数ならび,_拳ならび,_同報文) :-
        参加者付き拳ならび(_参加者勝数ならび,_拳ならび,_参加者付き拳ならび),
        concat_atom(_参加者付き拳ならび,',',_同報文).

参加者付き拳ならび([[],[],[]) :- !.
参加者付き拳ならび([[(_参加者:_)|_]|R1],[_拳|R2],[_参加者:_拳|R3]) :-
        参加者付き拳ならび(R1,R2,R3).

同報([],_) :- !.
同報([[(_参加者:_ポート番号),_]|R1],_同報文) :-
        (_参加者:_ポート) :: writef('%t\n',[_同報文]),
        同報(R1,_同報文).

%  参加者(サーバ)側述語

ジャンケン表示 :-
        write('ジャン\n'),
        write('ケン\n').

ポン入力(_拳) :-
        write('ポン'),
        readln([_拳]),!.