/*--------------------------------------------------------------------*/ /* ■ Prolog によるインベーダゲーム(漢字版)   */ /*--------------------------------------------------------------------*/ /* 述語 inv で開始します。inv.[enter] と入力してください。 */ /* 砲台は z で左へ,x で右にシフトします。大文字では動作しませんので */ /* [caps lock]を確認しておいてください。(z または x を押して小文字に */ /* なるかどうか確認します。) */ /* ミサイル発射はスペースキーを押します。連打もできますが、ミサイル */ /* が多いとミサイルの動きが鈍くなります。 */ /*--------------------------------------------------------------------*/ /*■メイン(inv)述語 */ inv:- 初期化, repeat, 実行. 初期化:-d_clear,全て削除(敵(A,B)),削除(終了),全て削除(弾丸(X, Y)), 削除と追加(得点(_),得点(0)),削除と追加(砲台(_),砲台(0)),砲台表示. 削除(X):-retract(X). 削除(_). 削除と追加(A,B):-削除(A), assert(B). 全て削除(X):-retract(X),fail. 全て削除(X). /*■実行関係述語 */ 実行:-d_keylength(0),!, 敵生成,敵(X,Y),敵移動(X,Y),!,弾丸移動, !, 終了,!,d_cursor(1,2),write('ゲームオーバ'). 実行:-d_keyin(X),!, 実行(X). 実行(122):-砲台(X), 砲台非表示,砲台左移動(X),砲台表示,!,fail. 実行(120):-砲台(X), 砲台非表示,砲台右移動(X),砲台表示,!,fail. 実行( 32):-砲台(X),!,発射(X). 実行(X):-!,fail. 砲台表示 :-砲台(X),文字表示(X,24,'■'). 砲台非表示:-砲台(X),文字表示(X,24,' '). 砲台左移動(0). 砲台左移動(X):- XX is X - 1, 削除と追加(砲台(X),砲台(XX)). 砲台右移動(19). 砲台右移動(X):- XX is X + 1, 削除と追加(砲台(X),砲台(XX)). /*■弾丸発射 */ 発射(X):-敵(X,23),!,爆破(X,23),!,fail. 発射(X):-assert(弾丸(X,23)),!,fail. /*■弾丸移動 */ /* ( Y だけで爆破をチェックするとすり抜けるケースが生じる) */ 弾丸移動:-retract(弾丸(X,Y)),!, 文字表示(X,Y,' '),弾丸移動(X,Y). 弾丸移動. 弾丸移動(X,1):-!. 弾丸移動(X,Y):-敵(X,Y),!,爆破(X,Y). 弾丸移動(X,Y):-YY is Y-1, 敵(X,YY),!, 爆破(X,YY). 弾丸移動(X,Y):-YY is Y-1, assert(弾丸(X,YY)),文字表示(X,YY,'Δ') . 弾丸移動(X,Y). /*■敵爆破 */ 爆破(X,YY):-retract(敵(X,YY)), 文字表示(X,YY,'☆'),s_sleep(50), retract(得点(N)),NN is N+1,assert(得点(NN)), d_cursor(2,1), write('得点 : '), write(NN), 文字表示(X,YY,' '). /*■敵移動 */ 敵移動(X,Y):-文字表示(X,Y,' '),敵移動1(X,Y). 敵移動(X,Y). 敵移動1(X,24):-!,retract(敵(X,24)). 敵移動1(X,Y ):-!,retract(敵(X, Y)),YY is Y+1, 敵設定(X, YY). 敵移動1(X,Y ). 敵設定(X,24):-砲台(X),!,ゲーム停止(X). 敵設定(X, YY):- assert(敵(X,YY)), 文字表示(X,YY,'Ж'), 敵生成, clause(敵,2,N), !, N=/=0, NN is integer(500/N), s_sleep(NN). 敵設定(_,_). ゲーム停止(X):-文字表示(X,24,'☆'),assert(終了). /*■共通的な処理 */ 敵生成:-clause(敵,2,5),!. 敵生成:-s_random(20,N), 敵生成(N). 敵生成(1):-!,s_random(20,X),assert(敵(X,1)). 敵生成(_). 文字表示(X,Y,C):-XX is X * 2+20, d_cursor(XX,Y), write(C).