/*------------------------------------------------------------------*/ /* ■Prologでダイスゲーム */ /*------------------------------------------------------------------*/ /* 【ルール】20回繰り返します   */ /*   @ ゾロ目の 1 が出たら 50 点になります。 */ /*   A 1 以外の数字のゾロ目は、出た数字の8倍の点数になります。 */ /*   B 連続する数字の場合、合計した値の2倍が点数になります。 */ /*   C 上記以外は、サイコロで出た数字の合計が点数になります。 */ /*------------------------------------------------------------------*/ /* 述語 dice を実行することで開始します。 */ /* [ctrl}Z で停止します。 */ /* [ctrl}Z 以外の入力で、その時点のサイコロを判定します。 */ dice:-初期設定,repeat,実行. 実行:-d_keylength(0),!, 乱数(X1),乱数(X2),d_cursor(2,2), 削除と追加(目(A,B),目(X1,X2)),表示(X1,X2),s_sleep(100),!,fail. 実行:-d_keyin(X),!,実行(X). 初期設定:-d_clear,削除と追加(合計(A),合計(0)),削除と追加(得点(B),得点(0)), 削除と追加(回数(_),回数(0)). 削除(X):-retract(X),fail. 削除(X). 削除と追加(X,Y):-削除(X), assert(Y). 得点計算(PT):- 合計(X),XX is X+PT, 削除と追加(合計(A),合計(XX)),削除と追加(得点(B),得点(PT)), 回数(N), NN is N+1, 削除と追加(回数(N),回数(NN)), d_cursor(1,1),write(' 得点合計 : '), write(XX), write(' 直前の得点 : '),write(PT),write(' '), s_sleep(1000). 実行(26):-!. 実行(X):-!,目(X1,X2),判定(X1,X2,PT),得点計算(PT),!, 回数(20),d_cursor(1,23),write('ゲームオーバ'). 判定(1,1,50). 判定(1,6,14). 判定(6,1,14). 判定(X,X,PT):- PT is X * 8. 判定(X,Y,PT):- XX is X + 1, XX =:= Y ,!, PT is (X + Y)*2. 判定(X,Y,PT):- XX is X - 1, XX =:= Y ,!, PT is (X + Y)*2. 判定(X,Y,PT):- PT is X + Y. 乱数(X):-s_random(6,XX),X is XX+1. 表示(X1,X2):-表示(X1,X2,1). 表示(X1,X2,6). 表示(X1,X2,N):-サイコロ(X1,N,S1),サイコロ(X2,N,S2),nl,write(' '), write(S1),write(' '),write(S2),NN is N+1,表示(X1,X2,NN). サイコロ(1,1,'┏━━━┓'). サイコロ(1,2,'┃   ┃'). サイコロ(1,3,'┃ ● ┃'). サイコロ(1,4,'┃   ┃'). サイコロ(1,5,'┗━━━┛'). サイコロ(2,1,'┏━━━┓'). サイコロ(2,2,'┃  ●┃'). サイコロ(2,3,'┃   ┃'). サイコロ(2,4,'┃●  ┃'). サイコロ(2,5,'┗━━━┛'). サイコロ(3,1,'┏━━━┓'). サイコロ(3,2,'┃  ●┃'). サイコロ(3,3,'┃ ● ┃'). サイコロ(3,4,'┃●  ┃'). サイコロ(3,5,'┗━━━┛'). サイコロ(4,1,'┏━━━┓'). サイコロ(4,2,'┃● ●┃'). サイコロ(4,3,'┃   ┃'). サイコロ(4,4,'┃● ●┃'). サイコロ(4,5,'┗━━━┛'). サイコロ(5,1,'┏━━━┓'). サイコロ(5,2,'┃● ●┃'). サイコロ(5,3,'┃ ● ┃'). サイコロ(5,4,'┃● ●┃'). サイコロ(5,5,'┗━━━┛'). サイコロ(6,1,'┏━━━┓'). サイコロ(6,2,'┃● ●┃'). サイコロ(6,3,'┃● ●┃'). サイコロ(6,4,'┃● ●┃'). サイコロ(6,5,'┗━━━┛').