このディレクトリの索引
このディレクトリの索引
http://sum2cha.blogpico.com/archives/2017 レス番号606
[1] 授業単元: プログラミング
[2] 問題文(含コード&リンク):
# 3.以下のプログラムを作成
# 3x3マスのマルバツゲームのボードを作成
# ○側と×側が交互に2次元座標上の位置を入力
# 入力後、毎回ボードを表示する
# たて、よこ、斜めのいずれかに○か×が3つ並んだ
# 時点でプログラムを終了

マルバツゲーム(L) :-
    length(L1,3),
    length(L2,3),
    length(L3,3),
    L = [L1,L2,L3],
    マルバツゲーム(まる,L).

マルバツゲーム(_,L) :- 変数がない(L),!.
マルバツゲーム(_,L) :- 三つならびがある(L),!.
マルバツゲーム(まる,L) :-
    ランダムに着手する(まる,L),
    マルバツゲーム(ばつ,L).
マルバツゲーム(ばつ,L) :-
    ランダムに着手する(ばつ,L),
    マルバツゲーム(まる,L).

ランダムに着手する(_種類,L) :-
    A is random // 9,
    _行 is // 3,
    _列 is mod 3,
    着手(_種類,_行,_列,L).
ランダムに着手する(_種類,_行,_列) :-
    ランダムに着手する(_種類,_行,_列).

着手(_種類,_行,_列,L) :-
    list_nth(_行,L,L1),
    list_nth(_列,L1,X),
    var(X),
    _種類=X,!.

変数がない(L) :- flat(L,L1),member(A,L1),\+(var(A)),!,fail.
変数がない(_).

全てがまる([]) :- !.
全てがまる([A|R]) :- A==まる,全てがまる(R).
全てがばつ([]) :- !.
全てがばつ([A|R]) :- A==まる,全てがまる(R).

三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),list_nth(N,L1,X),X==まる,!.
三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),list_nth(N,L1,X),X==ばつ,!.
三つ並びがある(L) :- member([M,N],[[1,3],[2,2],[3,1]]),list_nth(M,L,L1),list_nth(N,L1,X),X==まる,!.
三つ並びがある(L) :- member([M,N],[[1,3],[2,2],[3,1]]),list_nth(M,L,L1),list_nth(N,L1,X),X==ばつ,!.
三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),全てがまる(L1),!.
三つ並びがある(L) :- for(1,N,3),list_nth(N,L,L1),全てがばつ(L1),,!.
三つ並びがある(L) :- ならびの転置(L,L1),三つ並びがあるの二(L1).

三つ並びがあるの二(L) :- for(1,N,3),list_nth(N,L,L1),全てがまる(L1),!.
三つ並びがあるの二(L) :- for(1,N,3),list_nth(N,L,L1),全てがばつ(L1),!.