このディレクトリの索引
http://pc12.2ch.net/test/read.cgi/tech/1269438098/416
# 数当てゲーム1 乱数当て
# プログラムで一つの整数乱数aを生成し、その値を当てさせる。
# 入力された値がaより小さい時は「もっと大きいよ」、aより小さい時は「もっと小さいよ」と出力し、当てるまで繰り返しをする。
# 
# プログラムの例
# Srand (time(NULL));
# a=rand();
# 
# プログラムの最初にRAND_MAXを出力したほうがわかりやすい
# 
# --------------------------------------------------------------------------------
# 
# 数当てゲーム2 0〜999の当て
# 先ほどのプログラムを更に改善し、0〜999までの整数乱数を生成せよ
# 
# ---------------------------------------------------------------------------------
#
# 数当てゲーム3 当て回数の制限
# さらに改善し、当てる回数に制限を付ける、例えば10回など
# 当てる度に残っている回数を表示する。回数に達するとプログラム終了

:- op(250,xf,より大きい).
:- op(250,xf,より小さい).

履歴を持った数当てゲームサーバ :-
      乱数を引き正解値を決める(_正解),
      当てずっぽの数をひとつ得る(_当てずっぽの数),
      履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,[]).

履歴を持った数当てゲームサーバ(_正解,_正解,_) :- write('正解です\n'),!.
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :-
      すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント),
      write_formatted('前に %tっていったでしょ!',[_既出のヒント]),
      当てずっぽの数をひとつ得る(_次の当てずっぽの数),
      履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴).
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :-
      \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)),
      _当てずっぽの数 < _正解,
      write('もっと大きいよ\n'),
      当てずっぽの数をひとつ得る(_次の当てずっぽの数),
      履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]).
履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :-
      \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)),
      _当てずっぽの数 > _正解,
      write('もっと小さいよ\n'),
      当てずっぽの数をひとつ得る(_次の当てずっぽの数),
      履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]).

乱数を引き正解値を決める(_正解) :- _正解 is random.

当てずっぽ数をひとつ得る(_当てずっぽ数) :-
      repeat,
      write('さあ、なににしますか? '),
      get_integer(_当てずっぽ数),!.

すでにヒントの中に含まれている(_当てずっぽの数,[N より大きい|R],Max より大きい) :-
      _当てずっぽの数 < _正解,
      \+(_当てずっぽの数 > N),
      findmax(M,member(M より大きい,[N より大きい|R]),Max),!.
すでにヒントの中に含まれている(_当てずっぽの数,[N より小さい|R],Min より小さい) :-
      _当てずっぽの数 > _正解,
      \+(_当てずっぽの数 < N),
      findmin(M,member(M より小さい,[N より小さい|R]),Min),!.
すでにヒントの中に含まれている(_当てずっぽの数,[_|R],X) :-
      すでにヒントの中に含まれている(_当てずっぽの数,R,X).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
'乱数を引き正解値(0〜999)を決める'(_正解値) :-
      _乱数値 is random,
      乱数の範囲を0〜999に絞り込む(_乱数値,_正解値).

乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :-
      _絞り込まれた乱数値 is _乱数値 mod 1000.

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
:- op(250,xf,より大きい).
:- op(250,xf,より小さい).

ゲームオーバーとなる解答限界数(10).

履歴を持った回数制限付き数当てゲームサーバ :-
      ゲームオーバーとなる解答限界数(Max),
      乱数を引き正解値(0〜999)を決める(_正解),
      当てずっぽの数をひとつ得る(_当てずっぽの数),
      履歴を持った数当てゲームサーバ(1,Max,_当てずっぽの数,_正解,[]).
履歴を持った回数制限付き数当てゲームサーバ :- 履歴を持った回数制限付き数当てゲームサーバ.

履歴を持った回数制限付き数当てゲームサーバ(M,Max,_,_,_) :-
      M > Max,
      write_formatted('選択した数が%t個を越えました ゲームオーバー!!\n'),!.
履歴を持った回数制限付き数当てゲームサーバ(_,_,_正解,_正解,_) :- write('正解です\n'),!.
履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :-
      すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント),
      write_formatted('前に %tっていったでしょ!',[_既出のヒント]),
      当てずっぽの数をひとつ得る(_次の当てずっぽの数),
      M2 is M + 1,
      履歴を持った数当てゲームサーバ(M2,Max,_当てずっぽの数,_正解,_履歴).
履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :-
      \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)),
      _当てずっぽの数 < _正解,
      write('もっと大きいよ\n'),
      当てずっぽの数をひとつ得る(_次の当てずっぽの数),
      M2 is M + 1,
      履歴を持った回数制限付き数当てゲームサーバ(M2,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]).
'履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :-
      \+(すでにヒントの中に含まれてる(_当てずっぽの数,_履歴)),
      _当てずっぽの数 > _正解,
      write('もっと小さいよ\n'),
      当てずっぽの数をひとつ得る(_次の当てずっぽの数),
      M2 is M + 1,
      履歴を持った回数制限付き数当てゲームサーバ(M,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]).

%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%
当てずっぽクライアント :-
      Maxint is maxint,
      ある範囲の乱数を得る(1,Maxint,Random),
      当てずっぽクライアント(1,Maxint,Random).

当てずっぽクライアント(M,Maxint,Random) :-
      write('選択値 = %t\n',[Random]),
      get_line(Line),
      当てずっぽクライアント(Line,M,Maxint,Random),
      当てずっぽクライアント(Random,Maxint,Random2).

当てずっぽクライアント('もっと大きいよ',M,Maxint,Random,Maxint,Random,Random2) :-
      ある範囲の乱数を得る(Random,Maxint,Random2),!.
当てずっぽクライアント('もっと小さいよ',M,Maxint,M,Random,Random,Random2) :-
      ある範囲の乱数を得る(M,Random,Random2),

ある範囲の乱数を得る(_下限,_上限,_乱数) :-
      J is _上限 - _下限 + 1,
      _乱数 is random mod J + _下限.