このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1354070278/49
#  [1] 授業単元:計算機実習  
#  [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/eMHdX9DL 
#  上記のプログラムを変更して,キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい. 
#  入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい. 
#  
#  #include
#  int plot[8][8];
#  char state[3][5] = {" ","○ ","● "};
#  
#  
#  void print_board(){
#      int x,y;
#      printf("\033[2J");
#      printf("\033[%d;%dH",0,0);
#      for(y = 0;y < 8;y++){
#          for (x = 0;x < 8;x++){
#              printf("%s|",state[plot[x][y]]);
#          }
#          printf("\n");
#          printf("--+--+--+--+--+--+--+--+\n");
#      }
#  }
#  
#  int main(){
#      int x,y;
#  
#      for(y = 0;y < 8;y++)for(x = 0;x < 8;x++)plot[x][y] = 0;
#      plot[3][3] = plot[4][4] = 1;
#      plot[3][4] = plot[4][3] = 2;
#  
#      print_board();
#  }
#  
#     1  2  3  4  5  6  7  8
#    +--+--+--+--+--+--+--+--+
#  1 | | | | | | | | |
#    +--+--+--+--+--+--+--+--+
#  2 | | | | | | | | |
#    +--+--+--+--+--+--+--+--+
#  3 | | | | | | | | |
#    +--+--+--+--+--+--+--+--+
#  4 | | | |○|●| | | |
#    +--+--+--+--+--+--+--+--+
#  5 | | | |●|○| | | |
#    +--+--+--+--+--+--+--+--+
#  6 | | | | | | | | |
#    +--+--+--+--+--+--+--+--+
#  7 | | | | | | | | |
#    +--+--+--+--+--+--+--+--+
#  8 | | | | | | | | |
#    +--+--+--+--+--+--+--+--+
#  

:- dynamic(ボード保存/1).

'キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい.入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい.' :-
        ボードの初期状態(_ボート),
        ボードゲーム(_ボード).

ボードの初期状態(_ボート) :-
        findall(L,(
                    between(1,8,_),
                    length(L,8),
                    all(L,' ')),
                _ボード).

ボードゲーム(_現在のボード) :-
        ボード(_現在のボード,_一手進んだボード),
        ボードゲーム(_一手進んだボード),!.
ボードゲーム(_現在のボード) :-
        ボード表示(_現在のボード),
        write('ゲーム終了です。\n'),
        終了時点のボードを保存する(_現在のボード).

ボード(_現在のボード) :-
        着手するべきマスが残っている(_現在のボード),
        'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y),
        ボードを更新する(X,Y,_現在のボード,_一手進んだボード),
        ボードを表示する(_一手進んだボード),!.

着手するべきマスが残っている([L|R]) :-
        member(' ',L),
        着手するべきマスが残っている(R),!.

'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y,_マスの状態) :-
        整数を得る('x(0は終了)',between(0,8,X),X),
        \+(X = 0),
        整数を得る('y',between(1,8,Y),Y),
        マスの状態を得る(_マスの状態).

マスの状態を得る(_マスの状態) :-
        write(' ..0か●..1か○..2を着手してください : '),
        get_Line(Line),
        '診断: マスの状態を得る'(Line,_マスの状態),!.
マスの状態を得る(_マスの状態) :-
        マスの状態を得る(_マスの状態).

'診断: マスの状態を得る'('0',' ') :- !.
'診断: マスの状態を得る'('1','○') :- !.
'診断: マスの状態を得る'('2','●') :- !.

ボードを更新する(X,Y,_着手,_現在のボード,_一手進んだボード) :-
        '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび),
        対象行を更新する(X,_着手,_対象行,_更新された対象行),
        append(_前の行ならび,[_更新された対象行|_後の行ならび],_一手進んだボード).

'前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび) :-
        append(_前の行ならび,[_対象行|_後の行ならび],_現在のボード),
        length([_|_前の行ならび],Y).

対象行を更新する(X,_着手,_対象行,_更新された対象行) :-
        append(L0,[_|R],_対象行),
        length([_|L0],X),
        append(L0,[_着手|R],_更新された対象行).

ボード表示(_ボード) :-
        append(L0,[L|R],_ボード),
        ボードの一行を表示する(L0,L),
        R = [],
        writef('  +--+--+--+--+--+--+--+--+\n'),!.

ボードの一行を表示する(L0,L) :-
        length([_|L0],N),
        writef('  +--+--+--+--+--+--+--+--+\n'),
        atomic_list_concat(L,'|',S),
        writef('%t %t|\n',[N,S]).

終了時点のボードを保存する(_現在のボード) :-
        asserta(ボード保存(終了時点のボードを保存する(_現在のボード)).