このディレクトリの索引
http://toro.2ch.net/test/read.cgi/tech/1339338438/39
#  [1] 授業単元: c言語  
#  [2] 問題文(含コード&リンク):  
#   
#  4×4のマス目のうち1ヶ所を選び、そこに爆弾をおいておく。 
#  マス目の座標は左上が(0,0),右下が(3,3)である。 
#  実行を開始するとプレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)、 
#  爆弾の置かれたマス目であった場合は”wham!”と表示する。 
#  このプログラムを、以下のように改良せよ。  
#  (a)15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。  
#  (b)1度選んだマス目は再度選べないようにする(試行の回数には含めない)。  
#  (c)マス目の範囲(0,1,2,3のいずれか)から外れた数値を打ち込んだ場合に警告を出すようにする(試行の回数には含めない)。  
#  (d)1度選んだマス目が分かるように、下の表示を行う。  
#  0 0 0 0  
#  0 0 0 0  
#  0 1 0 0  
#  0 0 0 0  
#  マス目[1,2]を選んで爆弾に当たらなかった場合、その場所に1を表示  
#  

'4×4のマス目のうち1ヶ所を選び、そこに爆弾をおいておく'(_表) :-
        length(_表,4),
        findall(L,(
                    member(_,表),
                    length(L,4)),
                _表),
        爆弾をおいておく(_表).

爆弾をおいておく(_表) :-
        _x座標 is random(4),
        _y座標 is random(4),
        座標を得る(_表,_x座標,_y座標,爆弾),!.

'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標) :-
        表を表示する(_表),
        座標の入力(_x座標,_y座標),
        座標範囲検査(_x座標,_y座標),
        座標を入力済みとする(_表,_x座標,_y座標),!.
'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標) :-
        'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_表,_x座標,_y座標).

座標の入力(_x座標,_y座標) :-
        write('x座標(0..3),y座標(0..3)をカンマ区切りで入力してください : '),
        readln([_x座標,_y座標]).

座標範囲検査(_x座標,_y座標) :-
        between(0,3,_x座標),
        between(0,3,_y座標).

座標を入力済みとする(_表,_x座標,_y座標) :-

        座標を得る(_表,_x座標,_y座標,V),
        座標を評価する(V),!.

座標を得る(_表,_x座標,_y座標,V) :-
        length(Ln_y,_y座標),
        append(Ln_y,[L|_],_表),
        length(Ln_x,_x座標),
        append(Ln_x,[V|_],L),!.

座標を評価する(V) :-
        \+(var(V)),
        V = 爆弾,!.
座標を評価する(V) :-
        var(V),
        V = 1.

'実行を開始するとプレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)、爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(_表) :-
        Ln = [_,_,_,_,_,_,_,_,_,_,_,_,_,_,_],
        'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_x座標,_y座標),
        '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(Ln,_表,_x座標,_y座標).

'爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'([],_表,_x座標,_y座標) :-
        write('You Win!\n').
'爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(R,_表,_x座標,_y座標) :-
        '爆弾の置かれたマス目であった場合はWham!と表示する'(_表,_x座標,_y座標),!.
'爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'([_|Ln],_表,_x座標,_y座標) :-
        座標を入力済みとする(_表,_x座標,_y座標),
        'プレーヤーにマス目の1ヶ所を選ばせ(x座標とy座標を入力)'(_x座標_2,_y座標_2),
        '爆弾の置かれたマス目であった場合は”wham!”と表示する。15回試行して爆弾を見つけられなかった場合は、”You Win!”と表示してプログラムを終了する。'(Ln,_表,_x座標_2,_y座標_2).

'爆弾の置かれたマス目であった場合は爆弾の置かれたマス目であった場合はWham!と表示する'(_表,_x座標,_y座標) :-
        length(Ln_y,_y座標),
        append(Ln_y,[L|_],_表),
        length(Ln_x,_x座標),
        append(Ln_x,[爆弾|_],L),
        write('Wham!\n').

表を表示する([]).
表を表示する([_行|R]) :-
        行を表示する(_行),
        表を表示する(_表).

行を表示する([]) :-
        write('\n').
行を表示する([A|R]) :-
        変数と爆弾は0表示それ以外は1表示(A,N),
        write('%t ',[N]),
        行を表示する(R).

変数と爆弾は0表示それ以外は1表示(A,0) :-
        var(A),!.
変数と爆弾は0表示それ以外は1表示(爆弾,0) :- !.
変数と爆弾は0表示それ以外は1表示(_,1).