このディレクトリの索引
http://hibari.2ch.net/test/read.cgi/tech/1320365280/341
#  [1] 授業単元:C言語基礎 
#  [2] 問題文(含コード&リンク): 20×20程度のエリアを作り 
#  その中でキャラクターを動かすプログラムを作れ。 
#   
#  移動キーの割当 
#  ↑:ジャンプ 
#  →:右へ移動 
#   ← : 左へ移動 
#   [3.1] OS: windows7 32bit 
#   [3.2] コンパイラ名とバージョン: bcc5.11 
#   [3.3] 言語: C 
#  [4] 期限:2011年11月18日 
#  [5] その他の制限: できるだけ簡単なプログラムでお願いします。 
#   
#    例 
#  ■■■■■■■■■■■■■■■■■■■■ 
#   
#   
#   
#   
#   
#   
#   
#   
#   
#   
#   
#   
#   
#    (・∀・)   ←動かすキャラ 
#     | | 
#  ■■■■■■■■■■■■■■■■■■■■ 
# 
# 

'20×20程度のエリアを作りその中でキャラクターを動かす' :-
        '20×20程度のエリアを作り'(_エリア),
        その中でキャラクターを動かす(_エリア).

'20×20程度のエリアを作り'(_エリア) :-
        length(_エリア,20),
        findall(L,(
                    append(_,[L|_],_エリア),
                    length(L,20)),
                _エリア).

その中でキャラクターを動かす(_エリア,_終了時のエリア,_キャラクターの終了位置) :-
        最初にキャラクターを配置する(_エリア,_キャラクターの初期位置),
        コマンドの入手(_コマンド),
        キャラクターを動かす(_コマンド,_エリア,_キャラクターの初期位置,_キャラクターの終了時位置).

キャラクターを動かす(_コマンド,_終了時のエリア,_キャラクターの終了時位置,_終了時のエリア,_キャラクターの終了時位置) :-
        終了コマンド(_コマンド),!.
キャラクターを動かす(_コマンド,_エリア_1,_キャラクタの位置_1,_終了時のエリア,_キャラクターの終了時位置) :-
        キャラクターを動作する(_コマンド,_エリア_1,_キャラクターの位置_1,_エリア_2,_キャラクターの位置_2),
        コマンドの入手(_コマンド_2),
        キャラクターを動かす(_コマンド_2,_エリア_2,_キャラクターの位置_2,_終了時のエリア,_キャラクターの終了時位置).


キャラクターを動作する(_コマンド,_エリア_1,_キャラクターの位置_行_1,_キャラクターの位置_列_1,_エリア_2,_キャラクターの位置_2) :-
        コマンド解析(_コマンド,_キャラクターの位置_行_1,_キャラクターの位置_列_1,_キャラクターの位置_行_2,_キャラクターの位置_列_2),
        length(_エリア_2,20),
        findall(L,(
                    append(L0,[L|_],_エリア_2),
                    length([_|L0],Len),
                    キャラクタ描画(Len,_キャラクタの中心の行_2,_キャラクタの中心の列_2,L)),
                _エリア_2).

キャラクタ描画(_行,_キャラクタの中心の行,_キャラクタの中心の列,L) :-
        _行 + 1 =:= _キャラクタ中心の行,
        キャラクタ描画(1,_キャラクタの中心の列,L),!.
キャラクタ描画(_行,_キャラクタの中心の行,_キャラクタの中心の列,L) :-
        _行 =:= _キャラクタの中心の行,
        キャラクタ描画(2,_キャラクタの中心の列,L),!.
キャラクタ描画(_行,_キャラクタの中心の行,_キャラクタの中心の列,L) :-
        _行 - 1 =:= _キャラクタの中心の行,
        キャラクタ描画(3,_キャラクタの中心の列,L),!.
キャラクタ描画(_,_,_,L).

キャラクタ描画(_位置,_列,L) :-
        _列_3 is _列 - 3,
        length(L0,_列_3),
        length(_行,20),
        キャラクタパターン(_位置,L),
        append(L0,L,_行),!.

キャラクタパターン(1,[_,_,'A',_,_|_]).
キャラクタパターン(2,['A','A','A','A','A'|_]).
キャラクタパターン(3,[_,'A',_,'A',_|_]).

コマンドの解析(16,_キャラクターの中心の行_1,_キャラクターの中心の列,_キャラクターの中心の行,_キャラクターの中心の列) :-
        _キャラクターの中心の行_1 >= 3,
        _キャラクターの中心の行_2 is _キャラクターの中心の行_1 - 1,!.
コマンドの解析(14,_キャラクターの中心の行_1,_キャラクターの中心の列,_キャラクターの中心の行,_キャラクターの中心の列) :-
        _キャラクターの中心の行_1 =< 18,
        _キャラクターの中心の行_2 is _キャラクターの中心の行_1 + 1,!.
コマンドの解析(6,_キャラクターの中心の行,_キャラクターの中心の列_1,_キャラクターの中心の行,_キャラクターの中心の列_2) :-
        _キャラクターの中心の列 =< 17,
        _キャラクターの中心の列_2 is _キャラクターの中心の列_1 + 1,!.
コマンドの解析(2,_キャラクターの中心の行,_キャラクターの中心の列_1,_キャラクターの中心の行,_キャラクターの中心の列_2) :-
        _キャラクターの中心の列 >= 4,
        _キャラクターの中心の列_2 is _キャラクターの中心の列_1 - 1,!.