このディレクトリの索引

% 以下のサイトは animal(sparrow, [1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 1, 1]). animal(bear, [1, 0, 0, 1, 0, 1, 0, 0, 0, 1, 0, 0]). animal(tiger, [1, 0, 0, 0, 1, 1, 0, 0, 0, 1, 1, 0]). animal(ostrich, [1, 0, 1, 0, 0, 0, 0, 0, 1, 1, 0, 1]). animal(salmon, [0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 1]). animal(goldfish, [0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1, 0]). animal(snake, [0, 0, 0, 1, 1, 1, 0, 1, 0, 1, 1, 0]). animal(cow, [1, 0, 0, 0, 0, 0, 0, 1, 1, 0, 0, 1]). animal(eagle, [1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0]). animal(duck, [1, 1, 1, 1, 0, 1, 1, 1, 0, 0, 1, 1]). animal(goose, [1, 1, 1, 0, 0, 0, 0, 1, 1, 1, 1, 1]). question(1,'Does the animal have legs?'). question(2,'Can the animal fly?'). question(3,'Does the animal have wings?'). question(4,'Does the animal live in the woods?'). question(5,'Does the animal live in the jungle?'). question(6,'Does the animal live in the sea?'). question(7,'Does the animal live in rivers?'). question(8,'Can the animal swim?'). question(9,'Does the animal eat grass?'). question(10,'Is the animal dangerous?'). question(11,'Can the animal be a pet?'). question(12,'Can the animal be ordered in a restaurant?'). 動物当てゲーム :- 解答候補の動物を得る(_候補動物), ヒントを表示しその真偽を示す(_候補動物,_ヒントの解ならび), 全問が真となる動物を探し出す(_ヒントの解ならび,_動物ならび), 全問が真となる動物を表示する(_動物ならび). 解答候補の動物を得る(_候補動物) :- 全解収集(_動物,animal(_動物,_),_動物ならび), 表示('Pick a number from 1 to 11 '), 読む(_選択番号), 表示('OK, I am thinking of an animal!\n'), _選択番号 = _動物のならび順, n番目のリストの要素は(_動物のならび順,_動物ならび,_候補動物). ヒントを表示しその真偽を示す(_候補動物,_ヒントの解ならび) :- 全解収集([_質問文番号,_0または1],( for(1,N,3), 質問文番号を得る(N,_質問文番号), 候補動物だとするとそれは真か偽か(_候補動物,_質問文番号,_0または1), 真偽表示(_0または1)), _ヒントの解ならび). 全問が真となる動物を探し出す(_回答ならび,_動物ならび) :- 全解収集(_動物,( animal(_動物,L), 全問正解(_回答ならび,L)), _動物ならび). 全問が真となる動物を表示する(_動物ならび) :- 解答を示す前の遅延(3), 動物の表示(_動物ならび). 質問文番号を得る(N,_質問文番号) :- _残りの質問数 is 3 - N + 1, 表示('You have %t questions to guess it.\nWhat do you pick: ',[_残りの質問数]), 質問文番号と質問文の表示, 読む(_質問文番号). 質問文番号と質問文の表示 :- question(_質問文番号,_質問文), 表示('%t: %t\n',[_質問文番号,_質問文]), 後戻り. 質問文番号と質問文の表示. 候補動物だとするとそれは真か偽か(_候補動物,_質問文番号,_0または1) :- animal(_候補動物,_真偽値ならび), _質問文番号 = _要素位置, n番目のリストの要素は(_要素位置,_真偽値ならび,_0または1). 真偽表示(_0または1) :- 真偽表示句(_表示句,_0または1), 表示('%t\n',[_表示句]). 真偽表示句('yes!',1), 真偽表示句('no...',0). 解答を示す前の遅延(0) :- !. 解答を示す前の遅延(N) :- 表示('The answer will appear in %t seconds!\n',[N]), sleep(1), M is N - 1, 解答を示す前の遅延(M). 全問正解([],_). 全問正解([[_質問文番号,_0または1]|R],_真偽値ならび), n番目のリストの要素は(_質問文番号,_真偽値ならび,_0または1), 全問正解(R,L), 動物の表示([]). 動物の表示([_動物|R]), 表示('The answer was %t!\n',[_動物]), 動物の表示(R). %%%% <ユーザ定義> :- <組込み述語> %%%%% 全解収集(_解,_質問,_解ならび) :- findall(_解,_質問,_解ならび). 後戻り :- fail. 表示(S,L) :- write_formatted(S,L). 表示(S) :- write(S). 読む(X) :- read(X). n番目のリストの要素は(A,B,C) :- list_nth(A,B,C). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1247438792/160 # [1]プログラミング # [2] 課題 # 言語: C もしくは C++ 言語 # # (1)以下のプログラムを作成しなさい(数当てゲーム) # # *画面上に「好きな数字を入力してください」と表示して、キーボードからの入力を # 待つ。 # 変数aを定義して、10までの乱数を発生させて変数aに代入する。 # キーボードからの入力があれば、先に発生させた乱数と一致しているならば # 「あたり!!」と表示する。 # 一致していなければ「残念乱数はxxです」と表示する(xxには変数aの中身を # 表示する) 数当てゲーム :- repeat, _a is ramdom mod 10 + 1, write('好きな数字を入力してください '), get_line(Line), atom_to_term(Line,N,_), 数当てゲーム診断(_a,N), Line = end_of_file. 数当てゲーム診断(A,A) :- write('あたり!!\n'). 数当てゲーム診断(_,B) :- not(integer(B)), write('入力されたのは整数ではありません\n'). 数当てゲーム診断(A,N) :- not(A == N), write_formatted('残念乱数は%tです\n',[A]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1153585095/904 # [課題] # ・23本のマッチ棒からなる山があり,2人のプレーヤが山から交互にマッチ棒を # 取り除く # ・一度に取ることのできるマッチ棒は1から3本 # ・山を空にしたプレーヤが勝ち # 人間2人でこのゲームを行なうプログラムを作成せよ. # # プログラムでは各プレーヤの手がルールに反していないかどうかのチェックと, # 勝負がついたかどうかのチェックを行なうこと。 # また,最初に山にある本数と,各回に取ることができる最大の本数をプログラムの # 最初に変数にセットしておき,そこを変えるだけで本数の変化に対応できるような # プログラムにすること。 プレーヤ(1,山下). プレーヤ(2,太田). プレーヤのデバイス(1,入力,'/dev/tty1'). プレーヤのデバイス(2,入力,'/dev/tty2'). プレーヤのデバイス(1,出力,'/var/tmp/player1'). プレーヤのデバイス(2,出力,'/var/tmp/player2'). マッチ棒の山([_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_,_]). マッチ棒('|'). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% マッチ棒の山崩し :- プレーヤ(1,_プレーヤ1), プレーヤ(2,_プレーヤ2), マッチ棒の山(L), デバイスを開く(Instream1,Instream2,Outstream1,Outstream2), ゲームの案内(Outstream1,Outstream2), マッチ棒の山崩し(_プレーヤ1,_プレーヤ2,Instream1,Instream2,Outstream1,Outstream2,L), デバイスを閉じる(Insteam1,Instream2,Outstream1,Outstream2). マッチ棒の山崩し(_,_プレーヤ,_,_,OutstreamA,OutstreamB,[]) :- concat_atom([_プレーヤ,さんの勝ちです,'\n'],S), 同報(OutstreamA,OutstreamB,S),!. マッチ棒の山崩し(_プレーヤA,_プレーヤB,InstreamA,InstreamB,OutstreamA,OutstreamB,L) :- 取り棒の案内(_マッチ棒,L,_取り棒の案内), write_formatted(OutstreamA,'君の番だよ( %t ) : ',[_取り棒の案内]), マッチ棒を取る(InstreamA,OutstreamA,L,L1,L2), マッチ棒の山の変化を同報する(OutstreamA,OutstreamB,L,L1,L2), マッチ棒の山崩し(_プレーヤB,_プレーヤA,InstreamB,InstreamA,OutstreamB,OutstreamA,L2),!. マッチ棒を取る(Instream,_,L,L1,L2) :- get_line(Instream,S), 変数ならびに変換(S,L1), 取ったマッチ棒の診断(L,L1,L2),!. マッチ棒を取る(Instream,Outstream,L,L1,L2) :- マッチ棒を取る(Instream,Outstream,L,L1,L2). 取ったマッチ棒の診断(L,L1,L2) :- append(L1,L2,L2),!. 取ったマッチ棒の診断(L,L1,L2) :- 取り棒の案内(L,_取り棒の案内), write(Outstream,'入力形式が正しくありません。\n'), write(Outstream,'(%t) : ',[_取り棒の案内]), fail. 変数ならびに変換(S,L) :- マッチ棒(_マッチ棒), 変数ならびに変換(_マッチ棒,Chars,L), atom_chars(S,Chars). 変数ならびに変換(_マッチ棒,[_マッチ棒],[_]). 変数ならびに変換(_マッチ棒,[_マッチ棒|R1],[_|R2]) :- 変数ならびに変換(_マッチ棒,R1,R2). 取り棒の案内(L,_取り棒の案内) :- マッチ棒(_マッチ棒), 取り棒の案内(_マッチ棒,L,_取り棒の案内). 取り棒の案内(_マッチ棒,[_],_マッチ棒). 取り棒の案内(_マッチ棒,[_,_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒],S). 取り棒の案内(_マッチ棒,[_,_,_|_],S) :- concat_atom([_マッチ棒,' or ',_マッチ棒,' or ',_マッチ棒],S). マッチ棒の山の変化を同報する(Outstream1,Outstream2,L0,L1,L) :- マッチ棒(_マッチ棒), all(L0,_マッチ棒),concat_atom(L0,' ',S0), all(L1,_マッチ棒),concat_atom(L1,' ',S1), all(L,_マッチ棒),concat_atom(L,' ',S), concat_atom([S1,'\n','↑\n',S,'\n現在の山は ',S,'\n'],S2), 同報(Outstream1,Outstream2,S2), fail. マッチ棒の山の変化を同報する(_,_,_,_,_). all([],_). all([V|R],V) :- all(R,V). ゲームの案内(Outstream1,Outstream2) :- 同報(Outstream1,Outstream2,'マッチの本数の入力は\n1本 -> |<改行>\n'), 同報(Outstream1,Outstream2,'2本 -> ||<改行>\n'), 同報(Outstream1,Outstream2,'3本 -> |||<改行> という表現でお願いします\n'). 同報(Outsteam1,Outstream2,_項) :- write(Outstream1,_項), write(Outstream2,_項),!. デバイスを開く(Instream1,Instream2,Outstream1,Outstream2) :- プレーヤのデバイス(1,入力,Indevice1), プレーヤのデバイス(2,入力,Indevice2), プレーヤのデバイス(1,出力,Outdevice1), プレーヤのデバイス(2,出力,Outdevice2), open(Indevice1,read,Instream1), open(Outdevice1,append,Outstream1), open(Indevice2,read,Instream2), open(Outdevice2,append,Outstream2),!. デバイスを閉じる(Instream1,Instream2,Outstream1,Outstream2) :- close(Insteam1), close(Outstream1), close(Instream2), close(Outstream2),!. マッチ棒の山の初期状態の設定(N) :- integer(N), retract(マッチ棒の山(_)), length(L,N), asserta(マッチ棒の山(L)). プレーヤの入出力デバイスの設定(_プレーヤ1の入力デバイス,_プレーヤ2の入力デバイス,_プレーヤ1の出力デバイス,_プレーヤ2の出力デバイス) :- abolish(プレーヤのデバイス/3), assertz(プレーヤのデバイス(1,入力,_プレーヤ1の入力デバイス)), assertz(プレーヤのデバイス(2,入力,_プレーヤ2の入力デバイス)), assertz(プレーヤのデバイス(1,出力,_プレーヤ1の出力デバイス)), assertz(プレーヤのデバイス(2,出力,_プレーヤ2の出力デバイス)),!. プレーヤの設定(_プレーヤ1,_プレーヤ2) :- abolish(プレーヤ/2), assertz(プレーヤ(1,_プレーヤ1)), assertz(プレーヤ(2,_プレーヤ2)),!. get_line(Instream,X) :- get_char(Instream,C), get_line_3(Instream,C,Chars), atom_chars(X,Chars). get_line_3(_,'\n',[]) :- !. get_line_3(Instream,end_of_file,[e,n,d,'_',o,f,'_',f,i,l,e]) :- !. get_line_3(Instream,C,[C|R]) :- get_char(Instream,C2), get_line_3(Instream,C2,R). % 以下のサイトは 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),!. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/118 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10132.txt # # コンピューターに関数randを使用して0〜99の整数を作らせ、 # キーボードより数を入力し、 # コンピューターの作った数の方が大きければ「もっと大きいです」と表示し、再入力 # コンピューターの作った数の方が小さければ「もっと小さいです」と表示し、再入力 # コンピューターの作った数と一致すれば「当たりです」と表示し、終了 # 入力時には、何回目のトライかも表示すること。 # # 実行例 # コンピュータが作った0〜99の数を当てて下さい。 # 1回目です。いくつだと思いますか?70 # もっと小さいです # 2回目です。いくつだと思いますか?60 # もっと大きいです # 3回目です。いくつだと思いますか?63 # 当たりです c132_118 :- コンピューターに関数randを使用して0〜99の整数を作らせ(_乱数), キーボードより数を入力し(1,_数), c132_118(1,_数,_乱数). c132_118(N,_数,_数) :- !. c132_118(N,_数,_乱数) :- コンピューターの作った数の方が大きければ「もっと大きいです」と表示し(_数,_乱数), N2 is N + 1, 再入力(N2,_新しく入力された数), c132_118(N2,_新しく入力された数,_乱数). c132_118(N,_数,_乱数) :- コンピューターの作った数の方が小さければ「もっと小さいです」と表示し(_数,_乱数), N2 is N + 1, 再入力(N2,_新しく入力された数), c132_118(N2,_新しく入力された数,_乱数). c132_118(N,_数,_乱数) :- コンピューターの作った数と一致すれば「当たりです」と表示し(_数,_乱数,_新しく入力された数), 終了. コンピューターに関数randを使用して0〜99の整数を作らせ(_乱数) :- _整数 is random mod 100. キーボードより数を入力し(N,_数) :- write_formatted('%t回目のトライです。いくつだと思いますか。整数(0~99)を入力してください : ',[N]), get_integer(_数). コンピューターの作った数の方が大きければ「もっと大きいです」と表示し(_数,_乱数) :- _乱数 > _数, 「もっと大きいです」と表示. コンピューターの作った数の方が小さければ「もっと小さいです」と表示し(_数,_乱数) :- _乱数 < _数, 「もっと小さいです」と表示. コンピューターの作った数と一致すれば「当たりです」と表示し(_数,_数) :- 「当たりです」と表示. 「もっと大きいです」と表示 :- write('もっと大きいです\n'). 「もっと小さいです」と表示 :- write('もっと小さいです\n'). 「当たりです」と表示 :- write('当たりです\n'). 再入力(N,_新しく入力された数) :- キーボードより数を入力し(N,_新しく入力された数). 終了. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258320456/47 # 【 課題 】四人一首問題。「かるた部」の練習の一環として、 # 百人一首の中から第一文字が「や」の四枚を選んで、徹底的に練習することに # しました。四枚とは、 # やすらはでねなましものをさよふけてかたぶくまでのつきをみしかな # やへむぐらしげれるやどのさびしきにひとをもみをみうらみざらまし # やまざとはふゆぞさびしさまさりけるひとめもくさもかれぬとおもへば # やまがはにかぜのかけたるしがらみはながれもあへぬもみぢなりけり # ルールは、 # 1) 二人ゲームである。 # 2) 四枚のなかから無作為に二枚を選び自分と相手の札とする。 # 3) 読み手は四枚全部読み上げる。いたがって空札(取る札がない)が二枚含まれる。 # 4) 一枚取った時点で勝負はつくが、残りの一枚も競うこととする。 # # [問題] 乱数を使ってそれぞれの持ち札を決め、それを表示します。 # つぎに、読み札の順番を決めます。これはこの段階では表示しません。 # 一首、読み、それを表示し、 # 1) 空札 : 何文字目まで読まれてそれがわかったか # 2) 相手札 : 同上 # 3) 自分札 : 同上 # を表示しなさい。これを繰り返し、取り札がなくなったらゲームオーバー。 # 4) 二つのモードで作りなさい #  1) 読まれた札を二人とも記憶している。 #  2) 読まれた札は忘れてしまう。 # 実際には取り札には下の句が書かれていますが、ここでは一首全体をお互い理解しているものとします。 # # 歌([や,す,ら,は,で,ね,な,ま,し,も,の,を,さ,よ,ふ,け,て,か,た,ぶ,く,ま,で,の,つ,き,を,み,し,か,な]). 歌([や,へ,む,ぐ,ら,し,げ,れ,る,や,ど,の,さ,び,し,き,に,ひ,と,を,も,み,を,み,う,ら,み,ざ,ら,ま,し]). 歌([や,ま,ざ,と,は,ふ,ゆ,ぞ,さ,び,し,さ,ま,さ,り,け,る,ひ,と,め,も,く,さ,も,か,れ,ぬ,と,お,も,へ,ば]). 歌([や,ま,が,は,に,か,ぜ,の,か,け,た,る,し,が,ら,み,は,な,が,れ,も,あ,へ,ぬ,も,み,ぢ,な,り,け,り]). 四人一首(_) :- findall(X,歌(X),_歌ならび), 一枚読む(_歌ならび, _歌ならび, _自分の手持ち札ならび, _相手の手持ち札ならび, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか), 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび, _自分の手持ち札, _相手の手持ち札, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 間を取る, 現在の決まり字(_まだ読ませていない札ならび,_自分の手持ち札ならび,_相手の手持ち札ならび,_決まり字ならび), 間を取る, 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか), 決まり字はどこにある(_どんな札か,_自分の手持ち札ならび,_相手の手持ち札ならび,_どちら). 一枚読む([_読み札|_残り読み札], _まだ読まれていない札ならび1, _自分の手持ち札1, _相手の手持ち札1, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか) :- 現在の決まり字(_まだ読まれていない札ならび,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_決まり字ならび1), 決まり字で空札または札を取る(_読み札,_決まり字ならび1,_どんな札か1,_何字目でそれがわかったか1), 決まり字はどこにある(_どんな札か1,_自分の手持ち札ならび1,_相手の手持ち札ならび1,_どちら1), ならびから削除(_読み札,_まだ読まれていない札ならび,_まだ読まれていない札ならび2), ならびから削除(_読み札,_自分の手持ち札1,_自分の手持ち札2), ならびから削除(_読み札,_相手の手持ち札1,_相手の手持ち札2), 一枚読む(_残り読み札, _まだ読まれていない札ならび2, _自分の手持ち札2, _相手の手持ち札2, _読み札, _どちら, _どんな札か, _何字目でそれがわかったか). 現在の決まり字(_まだ読まれていない札ならび,_自分の手元札ならび,_相手の手元札ならび,_決まり字ならび) :- append(_自分の手持ち札ならび,_相手の手持ち札ならび,_手持ち札として存在する札ならび), 決まり字判断(_手持ち札として存在する札ならび,_まだ読まれていない札ならび,_決まり字ならび). 決まり字判断([],_,[]) :- !. 決まり字判断([_手持ち札|R1],_まだ読まれていない札ならび,[[_手持ち札,Len,_決まり字]|R2]) :-   先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字),   決まり字判断(R1,_まだ読まれていない札ならび,R2). 先頭から共通部分の次の文字までで最長のもの(_手持ち札,_まだ読まれていない札ならび,Len,_決まり字) :-   findmax([Len,_決まり字],     (  member(_札,_まだ読まれていない札ならび),       \+(_札=_手持ち札),       先頭から共通部分の次の文字まで(1,_手持ち札,_札,_決まり字,Len)),[Len,_決まり字]),!. 先頭から共通部分の次の文字までで最長のもの([_決まり字|_],_,[1,_決まり字]). 先頭から共通部分の次の文字まで(N,[A|R1],[A|R2],[A|R3],Len) :-   N2 is N + 1,   先頭から共通部分の次の文字まで(R1,R2,R3,Len),!. 先頭から共通部分の次の文字まで(Len,[A|R1],_,[A],Len). 決まり字で空札または札を取る(_読み札,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- atom_chars(_読み札,Chars1), append(L1,[_文字|L2],Chars1), 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか). 札をとるか(L1,_文字,_決まり字ならび,_どんな札か,_何字目でそれがわかったか) :- append(L1,[_文字],_決まり字), member([_どんな札か,_何字目でそれがわかったか,_決まり字],_決まり字ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,自分の手持ち札) :- member(_札,_自分の札ならび). 決まり字はどこにある(_札,_自分の手持ち札ならび,相手の手持ち札) :- member(_札,_相手の手持ち札ならび). 間を取る. 四人一首表示(_自分の手持ち札ならび, _相手の手持ち札ならび), _読み札, _どちら, _何字目でそれがわかったか) :- write('私の札は\n'), writeAln(_自分の手持ち札ならび), write('相手の札は\n'), writeAln(_相手の手持ち札ならび), write('読み札は\n'), writeAn(_読み札), write_formatted('どこにあるか %t\n何字目でそれがわかったか %t字目\n',[_どちら,_何字目でそれがわかったか]),!. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% writeAln([]). writeAln([L|R]) :- concat_atom(L,A),write_formatted('%t\n',[A]),writeAln(R). writeAn(L) :- concat_atom(L,A),write_formatted('%t\n',[A]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1258158172/610 # >>606さん # # 問題 # A さんと B さんがゲームで対戦した.対戦は N 回にわたって行った.各回の対戦において, # より高い点数を獲得した人がその回の勝者となる. # すなわち,第 i 回目の対戦で # A さんの点数が B さんの点数より大きければ第 i 回目は A さんの勝ち, # B さんの点数が A さんの点数より大きければ B さんの勝ち, # 同点の場合はどちらの勝ちにもならない. # N 回の対戦における A さんと B さんの点数が与えられたとき, # A さんと B さんがそれぞれ何回勝ったかを出力するプログラムを作成せよ. # # 入力 # 入力は 1+N 行からなる. # 1 行目には対戦の回数 N (1 ≦ N ≦ 1000000) が書かれている. # 2 行目以降の i+1 行目 (1 ≦ i ≦ N) には i 回目の対戦における A さんと B さんの点数が空白区切りで書かれている. # 各々の点数は 0 以上 100 以下の整数である. # # 出力 # 出力は 1 行からなる. A さんが勝った回数と B さんが勝った回数をこの順に空白で区切って出力せよ. # # # # となっています # 入力データ2までとかならまだ件数が少ないので良いのですが、 # 入力データ5になると1万件の入力データがあるのでファイルを読み込む以外は無いと思いました # # そのサイトに行ってもどうすればいいか良く解りませんでした # ですので、書き方ではなくてソースを書いてください お願いします # # program :-   user_parameters([_ファイル名]),   get_split_lines(_ファイル名,[':',' ',','],L),   二数のどちらが大きいか(L,0,0,_カウンタA,_カウンタB),   write_formatted('A : %t,B : %t\n',[_カウンタA,_カウンタB]). 二数のどちらが大きいか([],_カウンタA,_カウンタB,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   _先の方 > _後の方,   A2 is A + 1,   二数のどちらが大きいか(R1,A2,B,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   _先の方 < _後の方,   二数のどちらが大きいか(R1,A,B2,_カウンタA,_カウンタB). 二数のどちらが大きいか([[_,_先の方,_,_後の方]|R1],A,B,_カウンタA,_カウンタB) :-   二数のどちらが大きいか(R1,A,B,_カウンタA,_カウンタB). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1248012902/815 # 【 課題 】http://ime.nu/rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/915.txt# 【 形態 】1. Javaアプリケーション(main()で開始) # # しりとりゲームをするプログラム # 第一段階ーShiritori.javaを次に掲載する。 #      これをEclipseに入力する #    ー与えられた単語の可否を判定するためのクラスReferee.javaを作成する # # 第二段階ーReferee.javaをしりとりのルールにのっとった判定をさせるように改善 # # 第一段階のRefereeの使用 # ・直前に入力された単語の末尾の文字を記憶するchar型のフィールド #    lastChar # ・次の単語がどの文字で始まらなければならないかをchar型で返すメソッド # mustBeginWith() # ・引数として与えられた単語の可否を判定し、可ならtrueを返すとともにlastCharを更新し、否ならfalseを返すメソッド #    isOK(String newWord) # とりあえずは何でもかんでも「可」とするように作る 馬名しりとり :- write('最初の馬名は :'), get_line(_語1), sub_atom(_語1,0,1,_,_最初の文字), 馬名しりとり(_最初の文字,_語1,_語,[]). 馬名しりとり(_次の文字,_語,_語,_) :- \+(sub_atom(_語,0,1,_,_次の文字)), write_formatted('ゲームオーバー %t-%t はしりとりになっていません\n',[_次の文字,_語]), fail,!. 馬名しりとり(_次の文字,_語,_語,_履歴) :- member(_語,_履歴),!, write_formatted('ゲームオーバー %tは既出です\n',[_語]), fail. 馬名しりとり(_次の文字,_語,_,_) :- 五代血統書(_語), fail. 馬名しりとり(_次の文字,_語,_語,_履歴) :- sub_atom(_語,0,1,_,_次の文字), write_formatted('%t-%t\n',[_次の文字,_語]). 馬名しりとり(_,_語1,_語,_履歴) :- 馬名しりとりルール(_語1,_次の文字1), write('次の馬名は :'), get_line(_語2), 馬名しりとり(_次の文字1,_語2,_語,[_語1|_履歴]). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ン), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,ー), Len2 is Len + 1, sub_atom(_語,0,Len2,_,_語2), 馬名しりとり次の文字(_語2,_次の文字). 馬名しりとりルール(_語,_次の文字) :- sub_atom(_語,Len,1,0,_次の文字),!. % *** user: jbis / 2 *** 五代血統書(_馬名) :- jbis(_馬名,L), 五代血統表表示(L). jbis(_馬名,_血統書) :- このサイトの馬名はSJISが使われている(_馬名,_馬名sjis), 'url述語表現'(_馬名sjis,URL1), '%27を切り取る'(URL1,URL2), concat(['http://www.jbis.or.jp/navi_search/?sid=horse&keyword=',URL2],URL), jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび), 馬名による血統検索(_血統サイトの正確なURLならび,_血統書). jbis馬名サイト検索(URL,_馬名,_血統サイトの正確なURLならび) :- w3c(URL,X), concat_atom(X,X2), sjis2euc(X2,X3), split(X3,['\n','\r'],X4), findall(URL2,( member(A,X4), この行には検索対象の馬名が存在する(A,_馬名), 血統サイトの正確なURLを構成する(A,URL2)),_血統サイトの正確なURLならび), !. 馬名による血統検索(_血統サイトの正確なURLならび,_血統書) :- member(URL,_血統サイトの正確なURLならび), w3c(URL,X), 取れたならびすべての行をEUCに変換(X,_EUC行ならび), findall(_先祖馬名,( member(_馬名を含む行,_EUC行ならび), 血統書の中の馬名を切り取る(_馬名を含む行,_先祖馬名)), _血統書). このサイトの馬名はSJISが使われている(_馬名,_馬名sjis) :- euc2sjis(_馬名,_馬名sjis),!. '%27を切り取る'(URL1,URL2) :- replace_all(URL1,'%27','',URL2),!. 取れたならびすべての行をEUCに変換(Y,Y4) :- concat_atom(Y,Y2), sjis2euc(Y2,Y3), split(Y3,['\n','\r'],Y4),!. この行には検索対象の馬名が存在する(_行,_馬名) :- sub_atom(_行,_,_,_,'cell-br-no sort-02'), split(_行,['','(',')','>'],L), 馬名は最後の二要素のうちのどちらかにある(L,_馬名),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名],L),!. 馬名は最後の二要素のうちのどちらかにある(L,_馬名) :- append(_,[_馬名,_],L),!. 血統サイトの正確なURLを構成する(_行,URL) :- split(_行,['"'],L), append(_,[U,_],L), concat_atom(['http://www.jbis.or.jp',U,'pedigree/'],URL),!. 血統書の中の馬名を切り取る(_行,_先祖馬名) :- 先祖馬名を含む行はmaleという文字列を含む(_行), sub_atom(_行,Start,Len,_,''), sub_atom(_行,0,Start,_,_行1), split_patern_1(_split_patern_1), split(_行1,_split_patern_1,L), last(L,_先祖馬名),!. 先祖馬名を含む行はmaleという文字列を含む(_行) :- sub_atom(_行,_,_,_,male),!. 血統クロス(_馬名,_クロスならび) :- jbis(_馬名,L), length(L1,31),length(L2,31),append(L1,L2,L), 積集合(L1,L2,_積集合), 血統クロス(_積集合,L1,L2,_クロスならび). 血統クロス([],L1,L2,[]) :- !. 血統クロス([H|R1],L1,L2,[[_世代1,_世代2]|R2]) :- list_nth(N,L1,H), list_nth(N1,L2,H), N2 is N1 + 31, 第何世代か(N,_世代ならび1), min(_世代ならび1,_世代1), 第何世代か(N2,_世代ならび2), min(_世代ならび2,_世代2), 血統クロス(R1,L1,L2,R2). 第何世代か(N,_世代ならび) :- findall(_世代,( 五代血統表表示テーブル(_五代血統表表示テーブル), member(N,_五代血統表表示テーブル), list_nth(_世代,_五代血統表表示テーブル,N)),_世代ならび). 五代血統表表示(L) :- 五代血統表表示テーブル(L1), 五代血統表一行表示(L,L1), fail. 五代血統表表示(_). 五代血統表一行表示(_,[]) :- wr('\n'),!. 五代血統表一行表示(L,[N|R]) :- \+(N=0), list_nth(N,L,_馬名), wr('%t',[_馬名]), 五代血統表一行表示(L,R),!. 五代血統表一行表示(L,[0|R]) :- wr('%15s',[' ']), 五代血統表一行表示(L,R),!. % *** user: 五代血統表表示テーブル / 1 *** 五代血統表表示テーブル([0,0,0,0,5]). 五代血統表表示テーブル([0,0,0,4,0]). 五代血統表表示テーブル([0,0,0,0,6]). 五代血統表表示テーブル([0,0,3,0,0]). 五代血統表表示テーブル([0,0,0,0,8]). 五代血統表表示テーブル([0,0,0,7,0]). 五代血統表表示テーブル([0,0,0,0,9]). 五代血統表表示テーブル([0,2,0,0,0]). 五代血統表表示テーブル([0,0,0,0,12]). 五代血統表表示テーブル([0,0,0,11,0]). 五代血統表表示テーブル([0,0,0,0,13]). 五代血統表表示テーブル([0,0,10,0,0]). 五代血統表表示テーブル([0,0,0,0,15]). 五代血統表表示テーブル([0,0,0,14,0]). 五代血統表表示テーブル([0,0,0,0,16]). 五代血統表表示テーブル([1,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,20]). 五代血統表表示テーブル([0,0,0,19,0]). 五代血統表表示テーブル([0,0,0,0,21]). 五代血統表表示テーブル([0,0,18,0,0]). 五代血統表表示テーブル([0,0,0,0,23]). 五代血統表表示テーブル([0,0,0,22,0]). 五代血統表表示テーブル([0,0,0,0,24]). 五代血統表表示テーブル([0,17,0,0,0]). 五代血統表表示テーブル([0,0,0,0,27]). 五代血統表表示テーブル([0,0,0,26,0]). 五代血統表表示テーブル([0,0,0,0,28]). 五代血統表表示テーブル([0,0,25,0,0]). 五代血統表表示テーブル([0,0,0,0,30]). 五代血統表表示テーブル([0,0,0,29,0]). 五代血統表表示テーブル([0,0,0,0,31]). 五代血統表表示テーブル([0,0,0,0,36]). 五代血統表表示テーブル([0,0,0,35,0]). 五代血統表表示テーブル([0,0,0,0,37]). 五代血統表表示テーブル([0,0,34,0,0]). 五代血統表表示テーブル([0,0,0,0,39]). 五代血統表表示テーブル([0,0,0,38,0]). 五代血統表表示テーブル([0,0,0,0,40]). 五代血統表表示テーブル([0,33,0,0,0]). 五代血統表表示テーブル([0,0,0,0,43]). 五代血統表表示テーブル([0,0,0,42,0]). 五代血統表表示テーブル([0,0,0,0,44]). 五代血統表表示テーブル([0,0,41,0,0]). 五代血統表表示テーブル([0,0,0,0,46]). 五代血統表表示テーブル([0,0,0,45,0]). 五代血統表表示テーブル([0,0,0,0,47]). 五代血統表表示テーブル([32,0,0,0,0]). 五代血統表表示テーブル([0,0,0,0,51]). 五代血統表表示テーブル([0,0,0,50,0]). 五代血統表表示テーブル([0,0,0,0,52]). 五代血統表表示テーブル([0,0,49,0,0]). 五代血統表表示テーブル([0,0,0,0,54]). 五代血統表表示テーブル([0,0,0,53,0]). 五代血統表表示テーブル([0,0,0,0,55]). 五代血統表表示テーブル([0,48,0,0,0]). 五代血統表表示テーブル([0,0,0,0,58]). 五代血統表表示テーブル([0,0,0,57,0]). 五代血統表表示テーブル([0,0,0,0,59]). 五代血統表表示テーブル([0,0,56,0,0]). 五代血統表表示テーブル([0,0,0,0,61]). 五代血統表表示テーブル([0,0,0,60,0]). 五代血統表表示テーブル([0,0,0,0,62]). split_patern_1([A1,A2,A3,A4]) :- atom_codes(A1,[82]), atom_codes(A2,[62]), atom_codes(A3,[60,47,97,62,60,47,116,100,62]), atom_codes(A4,[60,47,97,62,60,117,108,32,99,108,97,117,115,101,61,34,108,105,115,116,45,105,99,111,110,45,48,49,34,62]). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260922392/22 # 次のゲームを考える # ・二人のプレイヤーA、Bにそれぞれ持ち点m点を与える # ・コイントスをして表が出たらAからBへ、裏が出たらBからAへ、1点渡す # ・コイントスをくりかえして先に持ち点がなくなったほうが負け # # 一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲーム繰り返して、 # 平均何回のコイントスで勝負がつくか、シュミレーションして求めるプログラムを作成してください。 # ただしコイントスを10000回繰り返しても勝負がつかない場合があるかもしれないので、それは回数オーバーとして別にカウントしてください。 # 一個の自然数mをキーボード入力から読み取ってこのゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか、シュミレーションして求める(_平均コイントス数) :- 催促付き整数入力('A,Bが持つコイン数を入力してください :',M), このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか(1,M,_無効ゲーム数,_平均コイントス数),!. このゲームをたとえば1000ゲーム繰り返して、平均何回のコイントスで勝負がつくか(M,_無効ゲーム数,_平均コイントス数) :- このゲーム(1,M,_有効コイントス総数,_無効ゲーム数), \+(_無効ゲーム数 = 1000), _平均コイントス数 is _有効コイントス総数 / (1000 - _無効ゲーム数). このゲーム(N,_,0,0) :- N > 1000,!. このゲーム(N,_,Sum1,Sum2) :- コイントスシミュレーション(M,M,_トス数), N2 is N + 1, このゲーム(N,_,Sum11,Sum2), Sum1 is Sum11 + _トス数,!. 表が出たらAからBへ、裏が出たらBからAへ、1点渡す(表,A1,B1,A2,B2) :- A2 is A1 - 1,B2 is B1 + 1,!. 表が出たらAからBへ、裏が出たらBからAへ、1点渡す(裏,A1,B1,A2,B2) :- B2 is B1 - 1,A2 is A1 + 1,!. コイントスをくりかえして先に持ち点がなくなったほうが負け(0,_,'Aの負け'). コイントスをくりかえして先に持ち点がなくなったほうが負け(_,0,'Bの負け'). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260532772/94 # [1] 授業単元: 通信プロトコル # [2] 問題文(含コード&リンク): # http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10268.txt # tcpを用いて21個石がある中から1〜3個の石をServer、Clientで取り合い、 # 最後の1つを取った方が負けとなる石取りゲームを作りなさい。 # server、clientの処理、および使用するポートは自由に決めて構わない。 クライアント一般型(Server,Port,_述語名,_受け取った情報) :- socket(internet, stream, Socket), socket_connect(Socket, Server : Port), open(Socket,read,Input), open(Socket,write,Output), クライアント一般型_1(Input,Output,_述語名,Line). クライアント一般型_1(_,Input,Output,_述語名,_受け取った情報) :- get_line(Line), クライアント一般型_2(Input,Output,Line,_述語名,_受け取った情報). クライアント一般型_1(Socket,Input,Output,_,_) :- close(Input), close(Output), socket_shutdown(Socket),!. クライアント一般型_2(Input,Output,_,end_of_file,end_of_file) :- !. クライアント一般型_2(Input,Output,_,_受け取った情報,_受け取った情報). クライアント一般型_2(Input,Output,_述語名,Line1,_受け取った情報) :- functor(P,_述語名,Arg), arg(1,P,Line1), arg(2,P,Message), call(P), write_formatted(Output,%t\n,[Message]), flush_output(Output), get_line(Line2), クライアント一般型_2(Input,Output,_述語名,Line2,_受け取った情報). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1268003943/6 # 同じく1977年11月号 "マイクロコンピュータそのII プログラミングの基礎(まとめ)" から # <<本として出版されていたら御免なさい。>> # 数あてゲーム # 1) 出題者は適当な4桁の数字(a)を決める。 # 2) 解答者は出題者の決めた数字を予想して出題者に数字(b)を示す。 # 3) 出題者は解答者の提示した数字を見て、次のヒントを出題者に知らせる。 #  a,bの両方に含まれる数字の数(c) #  aとbの対応する桁の数字が一致した数(d) # 4) 解答者は出題者が示したヒントからbを訂正して 2) に戻る。 # # ゲームは正解を得るまでに何回のヒントを得たかによって判定されるので # ヒントを得る回数が最少になるように努力するプログラムを作りなさい。 出題者が適当に決めた4桁の数字(_出題者が適当に決めた4桁の数字ならび) :- N is random mod 10000, number_chars(N,L1), 頭部零補正(L1,_出題者が適当に決めた4桁の数字ならび). 解答者から4桁の数字を得る(_解答者の提示した4桁の数字ならび) :- 催促付き整数入力('4桁の数字を入力してください : ',N), N >= 0,N =< 9999, number_chars(N,L1), 頭部零補正(L1,_解答者の提示した4桁の数字ならび). 出題者は解答者の提示した数字を見て、次のヒントを出題者に知らせる(_出題者が適当に決めた4桁の数字ならび,_解答者の提示した4桁の数字ならび) :- '両方に含まれる数字の数'(_出題者が適当に決めた4桁の数字ならび,_解答者の提示した4桁の数字ならび,_両方に含まれる数字の数), '対応する桁の数字が一致した数'(_出題者が適当に決めた4桁の数字ならび,_解答者の提示した4桁の数字ならび,対応する桁の数字が一致した数), write_formatted('ヒント: 両方に含まれる数字の数は%tです\n',[_両方に含まれる数字の数]), write_formatted('ヒント: 対応する桁の数字が一致した数%tです\n',[_対応する桁の数字が一致した数]),!. 両方に含まれる数字の数(L1,L2,_両方に含まれる数字の数) :- 積集合(L1,L2,L3), length(L3,_両方に含まれる数字の数). 対応する桁の数字が一致した数([],_,0) :- 対応する桁の数字が一致した数(_,[],0) :- 対応する桁の数字が一致した数([A|R1],[A|R2],X) :- 対応する桁の数字が一致した数(R1,R2,Y), X is Y + 1,!. 対応する桁の数字が一致した数([_|R1],[_|R2],X) :- 対応する桁の数字が一致した数(R1,R2,X). % 以下のサイトは コンピュータオリンピアード(優勝賞金,500万円). コンピュータオリンピアード('URL','http://www.jaist.ac.jp/ICGA-events-2010/olympiad/'). コンピュータオリンピアード(歴史,第1回目,ロンドン,1989). コンピュータオリンピアード(開催,毎年). コンピュータオリンピアード(主催,'国際コンピュータゲーム協会(ICGA)'). コンピュータオリンピアード(出場者,コンピュータゲームプレイヤー同士). コンピュータオリンピアード(競技部門,アマゾン). コンピュータオリンピアード(競技部門,バックギャモン). コンピュータオリンピアード(競技部門,ブリッジ). コンピュータオリンピアード(競技部門,コンピュータプール). コンピュータオリンピアード(競技部門,六目並べ). コンピュータオリンピアード(競技部門,象棋). コンピュータオリンピアード(競技部門,ドッツアンドボックス). コンピュータオリンピアード(競技部門,国際ドローツ). コンピュータオリンピアード(競技部門,囲碁). コンピュータオリンピアード(競技部門,'9路盤囲碁'). コンピュータオリンピアード(競技部門,ヘックス). コンピュータオリンピアード(競技部門,ハバナ). コンピュータオリンピアード(競技部門,ラインズオブアクション). コンピュータオリンピアード(競技部門,X) :- 新しい競技種目になった(X). コンピュータオリンピアード(開催予定,第15回,金沢市内,'2010年','9月25日'-'10月2日'). コンピュータオリンピアード(第15回大会開催形態,共同エベント). コンピュータオリンピアード(第15回大会共同エベント,主催,'ICGA'). コンピュータオリンピアード(第15回大会共同エベント,主催,'JAIST'). コンピュータオリンピアード(第15回大会,競技日程,後日決定). コンピュータオリンピアード(参加申し込みなどの詳細,後日お知らせ致します). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1269438098/416 # 数当てゲーム1 乱数当て # プログラムで一つの整数乱数aを生成し、その値を当てさせる。 # 入力された値がaより小さい時は「もっと大きいよ」、aより小さい時は「もっと小さいよ」と出力し、当てるまで繰り返しをする。 # # プログラムの例 # Srand (time(NULL)); # a=rand(); # # プログラムの最初にRAND_MAXを出力したほうがわかりやすい # # -------------------------------------------------------------------------------- # # 数当てゲーム2 0〜999の当て # 先ほどのプログラムを更に改善し、0〜999までの整数乱数を生成せよ # # --------------------------------------------------------------------------------- # # 数当てゲーム3 当て回数の制限 # さらに改善し、当てる回数に制限を付ける、例えば10回など # 当てる度に残っている回数を表示する。回数に達するとプログラム終了 :- op(250,xf,より大きい). :- op(250,xf,より小さい). 履歴を持った数当てゲームサーバ :- 乱数を引き正解値を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,[]). 履歴を持った数当てゲームサーバ(_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). 履歴を持った数当てゲームサーバ(_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), 履歴を持った数当てゲームサーバ(_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). 乱数を引き正解値を決める(_正解) :- _正解 is random. 当てずっぽ数をひとつ得る(_当てずっぽ数) :- repeat, write('さあ、なににしますか? '), get_integer(_当てずっぽ数),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より大きい|R],Max より大きい) :- _当てずっぽの数 < _正解, \+(_当てずっぽの数 > N), findmax(M,member(M より大きい,[N より大きい|R]),Max),!. すでにヒントの中に含まれている(_当てずっぽの数,[N より小さい|R],Min より小さい) :- _当てずっぽの数 > _正解, \+(_当てずっぽの数 < N), findmin(M,member(M より小さい,[N より小さい|R]),Min),!. すでにヒントの中に含まれている(_当てずっぽの数,[_|R],X) :- すでにヒントの中に含まれている(_当てずっぽの数,R,X). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% '乱数を引き正解値(0〜999)を決める'(_正解値) :- _乱数値 is random, 乱数の範囲を0〜999に絞り込む(_乱数値,_正解値). 乱数の範囲を0〜999に絞り込む(_乱数値,_絞り込まれた乱数値) :- _絞り込まれた乱数値 is _乱数値 mod 1000. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% :- op(250,xf,より大きい). :- op(250,xf,より小さい). ゲームオーバーとなる解答限界数(10). 履歴を持った回数制限付き数当てゲームサーバ :- ゲームオーバーとなる解答限界数(Max), 乱数を引き正解値(0〜999)を決める(_正解), 当てずっぽの数をひとつ得る(_当てずっぽの数), 履歴を持った数当てゲームサーバ(1,Max,_当てずっぽの数,_正解,[]). 履歴を持った回数制限付き数当てゲームサーバ :- 履歴を持った回数制限付き数当てゲームサーバ. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_,_,_) :- M > Max, write_formatted('選択した数が%t個を越えました ゲームオーバー!!\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(_,_,_正解,_正解,_) :- write('正解です\n'),!. 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- すでにヒントの中に含まれている(_当てずっぽの数,_履歴,_既出のヒント), write_formatted('前に %tっていったでしょ!',[_既出のヒント]), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った数当てゲームサーバ(M2,Max,_当てずっぽの数,_正解,_履歴). 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれている(_当てずっぽの数,_履歴)), _当てずっぽの数 < _正解, write('もっと大きいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M2,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より大きい|_履歴]). '履歴を持った回数制限付き数当てゲームサーバ(M,Max,_当てずっぽの数,_正解,_履歴) :- \+(すでにヒントの中に含まれてる(_当てずっぽの数,_履歴)), _当てずっぽの数 > _正解, write('もっと小さいよ\n'), 当てずっぽの数をひとつ得る(_次の当てずっぽの数), M2 is M + 1, 履歴を持った回数制限付き数当てゲームサーバ(M,Max,_次の当てずっぽの数,_正解,[_当てずっぽの数 より小さい|_履歴]). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 当てずっぽクライアント :- Maxint is maxint, ある範囲の乱数を得る(1,Maxint,Random), 当てずっぽクライアント(1,Maxint,Random). 当てずっぽクライアント(M,Maxint,Random) :- write('選択値 = %t\n',[Random]), get_line(Line), 当てずっぽクライアント(Line,M,Maxint,Random), 当てずっぽクライアント(Random,Maxint,Random2). 当てずっぽクライアント('もっと大きいよ',M,Maxint,Random,Maxint,Random,Random2) :- ある範囲の乱数を得る(Random,Maxint,Random2),!. 当てずっぽクライアント('もっと小さいよ',M,Maxint,M,Random,Random,Random2) :- ある範囲の乱数を得る(M,Random,Random2), ある範囲の乱数を得る(_下限,_上限,_乱数) :- J is _上限 - _下限 + 1, _乱数 is random mod J + _下限. % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1274827528/43 # [1] 授業単元:C言語プログラミング # [2] 問題文(含コード&リンク):http://ime.nu/kansai2channeler.hp.infoseek.co.jp/cgi-bin/joyful/img/10627.txt # 問題:2人のプレーヤーが1台のパソコンの前に座って、五目並べをするプログラムを # 次のステップ([1]〜[4])に従って作成しなさい。 # # [step1]'十','−’,'|’などの文字を使って五目並べをするための10行10列の格子枠をキャラク #    タモードで表示する。関数化(関数名waku)しておく。(注意:この格子枠を表示するのが #    難しければ、列を表す最上端の数字1〜1Oと、各行の左端に行を現す数字1〜10を表示 #    すること) # 1 2 ・・・・・10 # +−−−+−−−+・・・ # 1 | # + # 2 | # ・ #  ・ # 10 # [step2]メイン関数で”Aさん次の手を入力しなさい”とモニタに表示し、次の手を3_4↓のよ #   うに入力する。入力データを引数で関数wakuに渡し、関数側で格子枠の3行目4列目に’A’ #   を埋め込み,[step 1 ]で作成した格子枠とともに表示する。 #                3   4 # ・    ・   ・  #           ・  +−−−+−−−+ #           3 | | B | #             +−−−+−−−+ # # # [step3]AさんとBさんが交互に次の手を入力しながら、Aさんの手は'A'を、Bさんの手は'B'を #  枠内に埋め込み格子枠とともに表示する。この時、既に打たれた枠に入力した場合は再度入力 #  を促すようにする。 # [step4]更に、AさんとBさんが次の手を打つ毎に、そのデータを5個並んだか調べる関数(関数 #  名narabi)に渡し、縦、横、斜め方向に5個並んでいるか調べ、結果をメイン関数に返す。 5 #  個並んでいたらメイン関数側で”Aさんの勝ぢまたぱBさんの勝ぢと表示する。並んで #  いなければゲームを続ける。 # # 質問1 # :このプログラムは人間同士がディスプレイを単なる碁盤として使用し、五目並べを行う # プログラムである。このプログラムを修正して人間とコンピュータが対戦するようにするに # はどのような改良を加えなければならないか、考えて答えなさい。 初期盤面[ [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' '], [' ',' ',' ',' ',' ',' ',' ',' ',' ',' '],[' ',' ',' ',' ',' ',' ',' ',' ',' ',' ']]. 五目並べ :- 初期盤面(_盤面), 五目並べ(A,_盤面). 五目並べ(A,_盤面) :- 次の手を入力する(A,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(A,_行,_列,_更新された盤面). 五目並べ(B,_盤面) :- 次の手を入力する(B,_盤面,_行,_列,_更新された盤面), 五目並べ表示(_更新された盤面), 五目並べ評価(B,_行,_列,_更新された盤面). 五目並べ評価(_棋士,_盤面) :- 五目並べ完成(_棋士,_行,_列,_盤面), write_formatted('%tさんの勝ちです!\n',[_棋士]),!. 五目並べ評価(A,_,_,_盤面) :- 五目並べ(B,_盤面),!. 五目並べ評価(B,_,_,_盤面) :- 五目並べ(A,_盤面),!. 五目並べ完成(_棋士,_行,_列,_盤面) :- 五目並んだ状態とは(_棋士,_五目並んだ状態), 五目並んでいる(_五目並んだ状態,_行,_列,_盤面),!. 五目並んでいる(_五目並んだ状態,_行,_列,_盤面) :- 五目(_行,_列,L), findall(X,(member((A,B),L),I is A,J is B,list_nth(I,_盤面,L1),list_nth(J,L1,X)),_五目並んだ状態),!. 五目(_行,_列,[(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3),(_行-4,_列+4)]). 五目(_行,_列,[(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2),(_行-3,_列+3)]). 五目(_行,_列,[(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1),(_行-2,_列+2)]). 五目(_行,_列,[(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列),(_行-1,_列+1)]). 五目(_行,_列,[(_行+4,_列-4),(_行+3,_列-3),(_行+2,_列-2),(_行+1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3),(_行+4,_列+4)]). 五目(_行,_列,[(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2),(_行+3,_列+3)]). 五目(_行,_列,[(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1),(_行+2,_列+2)]). 五目(_行,_列,[(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列),(_行+1,_列+1)]). 五目(_行,_列,[(_行-4,_列-4),(_行-3,_列-3),(_行-2,_列-2),(_行-1,_列-1),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列),(_行+4,_列)]). 五目(_行,_列,[(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列),(_行+3,_列)]). 五目(_行,_列,[(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列),(_行+2,_列)]). 五目(_行,_列,[(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列),(_行+1,_列)]). 五目(_行,_列,[(_行-4,_列),(_行-3,_列),(_行-2,_列),(_行-1,_列),(_行,_列)]). % 五目(_行,_列,[(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3),(_行,_列+4)]). 五目(_行,_列,[(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2),(_行,_列+3)]). 五目(_行,_列,[(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1),(_行,_列+2)]). 五目(_行,_列,[(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列),(_行,_列+1)]). 五目(_行,_列,[(_行,_列-4),(_行,_列-3),(_行,_列-2),(_行,_列-1),(_行,_列)]). 五目並んだ状態とは(_棋士,[_棋士,_棋士,_棋士,_棋士,_棋士]). 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write_formatted('%tさん次の手を入力しなさい : ',[_棋士]), get_split_line([' '],[_行,_列]), 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面),!. 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面) :- write('その手は既に石があり打てませんもう一度入力してください\n'), 次の手を入力する(_棋士,_盤面,_行,_列,_更新された盤面). 盤面更新(_棋士,_行,_列,_盤面,_更新された盤面) :- list_nth(_行,_盤面,L), 要素番号によるならびの置換(_列,_棋士,L,L1), 要素番号によるならびの置換(_行,L1,_盤面,_更新された盤面),!. 五目並べ盤面表示(_盤面) :- 五目並べ横罫, 五目並べ表示(1,_盤面),!. 五目並べ横罫 :- write('  +−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+−−−+\n'). 五目並べ表示(_,[]) :- !. 五目並べ表示(N,[_行|R]) :- 半角全角数字変換(N,NS), write_formatted('%t',[NS]), 五目並べ行表示(_行), 五目並べ横罫, N2 is N + 1, 五目並べ表示(N2,R). 五目並べ行表示([]) :- write('|\n'),!. 五目並べ行表示([A|R]) :- write('| %t ',[A]),五目並べ行表示(R). 半角全角数字変換(1,' 1'). 半角全角数字変換(2,' 2'). 半角全角数字変換(3,' 3'). 半角全角数字変換(4,' 4'). 半角全角数字変換(5,' 5'). 半角全角数字変換(6,' 6'). 半角全角数字変換(7,' 7'). 半角全角数字変換(8,' 8'). 半角全角数字変換(9,' 9'). 半角全角数字変換(10,'10'). % 以下のサイトは http://pc12.2ch.net/test/read.cgi/tech/1260532772/834 # [2010/01/15 19:27:07] リュック: 【質問テンプレ】 # [1] 授業単元: プログラミング演習 # [2] 問題文(含コード&リンク): http://ime.nu/www.dotup.org/uploda/www.dotup.org563734.zip.html # # 課題8 # # 以下の機能を持った丁半ゲームのプログラムを作成せよ. # なお,丁半ゲームとは,2つのサイコロをツボと呼ばれる篭に # 入れて振り,出たサイコロの目の合計が丁(偶数)か半(奇数) # かを当てる昔のギャンブルである. # # - 半と丁のどちらに賭けるかを入力する機能 # - 2つのサイコロを振り,出た目を表示する機能(もちろん出る目はランダム) # - 賭けに勝ったか負けたかを判定して結果を表示する機能 # ゲームを続行するかどうかを入力する機能 # # # # # 課題9 # # # - メニュー画面から操作を選ぶ機能.図1参照.今回は,「1:はじめから」 # 「0:終了する」を実行できるようにする.「1:はじめから」を選ぶと,ゲーム # がスタートし,プレーヤーが「続行しない」旨の入力を行うまでゲームを # 続行する.「続行しない」旨の入力があれば,メニュー画面に戻る. # 「0:終了する」を選ぶと,プログラムを終了する. # - お金を賭ける機能.初期の所持金は4000文で,一回の賭け金は1文 # 以上所持金以下とする.所持金が無くなればゲームオーバーであり, # メ画面に戻る現在の所持金がいくらであるかは必要なタイミングでプレーヤーに示 される必要がある. # - 不正な入力を検知し,プレーヤーにフィードバックする機能.たとえば, # 1または0の入力のみが期待される場合に,文字列や,1,0以外の数字 # などが入力されれば,エラーメッセージを出力した上で再度の入力を # 求める.図3参照. # - プレーヤーに入力を促すためのプロンプト("> ")を表示する機能. # # # # # 課題10 # # # 演習課題9で作成した丁半ゲームのプログラムに,以下の機 # 能を追加せよ. # - コンピュータが自動で操作を行う博打打(以降では自動プレーヤーと呼ぶ)を3名 # 参加させる機能.図1,図2参照.3名にはそれぞれ,名前,初期の所持金,1回あ # たりの最大の賭け金(現在の所持金における割合として表される)があらかじめ設 # 定されている.設定値はゲームバランスを考慮して決定すること.ゲームを開始す # ると,自動プレーヤーは自らの所持金が尽きるまで連続して賭けに参加する.半, # 丁に賭ける確率はそれぞれ1/2であり,1文以上最大賭け金以下の範囲でランダ # ムな金額を賭ける. # # ゲームデータをセーブ・ロードする機能図3参照ゲームデータとは自動プレーヤ― # を含む全プレーヤーの現在の所持金,賭けに勝った回数と負けた回数で # ある.プレーヤーはゲームを終了してメニューに戻る際に,それまでの内容を保存 # するかどうか選択することができる.また,メニューから「2:つづきから」を選択する # と,前回保存した内容を反映してゲームを開始する.ゲームデータは2つ以上作 # 成しないものとする.ゲームデータのファイルフォーマットは特に指定しない. # # # # # 課題11 # # # 演習課題10で作成した丁半ゲームのプログラムに,以下の # 機能を追加せよ. # - 成績を評価する機能.メニューから「3: 成績」を選択すると,ゲームデータをロード # して各プレーヤーの(1) 勝ち負けの回数,(2) 現在の所持金,(3) 稼いだ金額, # (4) 初期設定の所持金に対する(3)の割合を表示する.そして(4)によってプレー # ヤーの順位を明らかにし,その順位によってA〜Dの4段階評価を表示する.つま # り,プレーヤーの(4)の大きさが1番であればA,2番であればB,3番であればC,4 # 番であればDである.以上を表示した後,メニューに戻る.ゲームデータが存在し # ない場合については,その旨表示してメニューに戻る. # # # 長くなりましたが、どうかよろしくお願いします。 # 途中までは作成しているのですが、よくわかりません。 # どなたか、よろしくお願いします。 # 難易度設定はいらないそうです。 # # 賭場 :- 壷, サイコロを振る(_壷), 丁か半か, 壷を開く(_壷,_出目), 勝負の表示(_出目). 壷 :- write('入ります\n'),音楽スタート. サイコロを振る(_壷) :- _ひとつ目の賽の目 is random(6) + 1, _ふたつ目の賽の目 is random(6) + 1, サイコロの目を描く(_ひとつ目の賽の目,_ふたつ目の賽の目), _壷 = ([_ひとつ目の賽の目,_ふたつ目の賽の目],_サイコロ表示),!. サイコロの目を描く(_ひとつ目の賽の目,_ふたつ目の賽の目,_サイコロ表示) :- N1 is (random(6) + 1) * 2, N2 is (random(6) + 1) * 2, atomic_list_concat(['%',N1,'s%t\n%',N2,'s%t\n'],_表示パターン), swritef(_サイコロ表示,_表示パターン,[' ',_ひとつ目の賽の目,' ',_ふたつ目の賽の目]). 丁か半か :- write('丁か半か\n'), sleep(3), 張る, 'よろしいですか、よろしいですね'. 張る :- findall(_,( 丁か半か(_行), ( _行 = '',!,fail;丁か半か(_行))), _). 丁か半か(_行) :- get_line(_行), split(_行,[' '],[_客,_丁か半か,_金額]), assertz(賭け(_客,_丁か半か,_金額)). 丁か半か(_行) :- 丁か半か(_行). 'よろしいですか、よろしいですね' :- write('よろしいですか\n'), sleep(5), write('よろしいですね\n'), sleep(2). 壷を開く(_壷,_ひとつ目の賽の目,_ふたつ目の賽の目,_丁か半か) :- _壷 = ([_ひとつ目の賽の目,_ふたつ目の賽の目],_サイコロ表示), writef('%t',[_サイコロ表示]), sleep(2), writef('%t %tの%t\n',[_ひとつ目の賽の目,_ふたつ目の賽の目,_丁か半か]),!. 丁半判定(_ひとつ目の賽の目,_ふたつ目の賽の目,丁) :- 0 is (_ひとつ目の賽の目 + _ふたつ目の賽の目) mod 2. 丁半判定(_ひとつ目の賽の目,_ふたつ目の賽の目,半) :- 1 is (_ひとつ目の賽の目 + _ふたつ目の賽の目) mod 2. 勝負の表示(_出目) :- 賭け(_客,_丁か半か,_金額), 勝負判定(_出目,_丁か半か,_勝ち負け), writef('%t,%t,%t円\n',[_客,_勝ち負け,_金額]), fail. 勝負の表示(_) :- 賭け金の分配については知識がないから省略. 勝負判定(_目,_目,勝ち). 勝負判定(_出目,_丁か半か,負け) :- \+(_出目=_丁か半か). 音楽スタート. 賭け金の分配については知識がないから省略. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1267796762/451 # 【 課題 】ttp://rg550.hp.infoseek.co.jp/cgi-bin/joyful/img/1040.zip # 【 形態 】Javaアプリケーション(main()で開始)/ # 【 期限 】10/15 # 【 Ver  】"1.6.0_21" # 【 補足 】丸投げですがよろしくお願いします。 # # [問3] # [ファイル名] Lesson1_3.java # Lesson1_2 で作成したTrumpCard を拡張します.トランプでゲームを行う場合,そのカードが表を向いているか裏を向いているかという要素は重要なので,それを表現できるようにします. # この場合の表とはマークや数値が表示されている側,裏はその逆で絵柄が付いている側を指すこととします.サンプルプログラムが動作するように,以下の実装を付け加えなさい. # 1. クラスTrumpCard は,インスタンス変数として,boolean openStat を持ちます.そのインスタンスが表の場合はtrue,裏の場合はfalse の値を持つものとします. # 2. クラスTrumpCard は,コンストラクタTrumpCard(String mark, int number, booleanopen)を持ちます.open によって,インスタンスの初期状態での表裏の値(openStat の値)を決めることができるものとします.また,指定されない場合の初期値はfalse(裏向き)とします. # 3. クラスTrumpCard は,メソッドとしてpublic void setOpened(boolean open)を持ちます.このメソッドが呼ばれた場合そのインスタンスが持つopenStat の値をopen の値に置き換えます. # 4. クラスTrumpCard は,メソッドとしてpublic boolean getOpened()を持ちます.このメソッドが呼ばれた場合そのインスタンスが持つopenStat の値を返り値として返します. # トランプのカード初期状態(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- 0 is random mod 2, append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,表,_位置]|R],_トランプ_後状態). トランプのカード初期状態(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- 1 is random mod 2, append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,裏,_位置]|R],_トランプ_後状態). 表にする(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,表,_位置]|R],_トランプ_後状態). 裏にする(_マーク,_数字,_トランプ_前状態,_トランプ_後状態) :- append(L0,[[_マーク,_数字,_,_位置]|R],_トランプ_前状態), append(L0,[[_マーク,_数字,裏,_位置]|R],_トランプ_後状態). 表である(_マーク,_数字,_トランプ) :- append(L0,[[_マーク,_数字,表,_]|R],_トランプ),!. 裏である(_マーク,_数字,_トランプ) :- append(L0,[[_マーク,_数字,裏,_]|R],_トランプ),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # # /* ヒント: この関数を使うと、 判定が簡単かも */ # void distrib(struct card h[], int dist[]){ # int i; # for(i = 0; i < 14; i++){ # dist[i] = 0;} # for(i = 0; i < 5; i++){ # dist[h[i].pips]++;}} # # int is_straight(struct card h[]){ # /* 課題1 */ # return 0;} # # int is_flush(struct card h[]){ # /* 課題1 */} # # int is_fullhouse(struct card h[]){ # /* 課題1 */ # return 0;} # # card h[] は手札のカード # h[].pips は手札のカードの番号 # h[].suit は手札のカードのマークのことです ポーカーの役(_手札ならび,フラッシュ) :- all(_手札ならび,[_,_共通マーク]), \+(ポーカーの役(_手札ならび,ストレート)),!. ポーカーの役(_手札ならび,ストレート) :- sort(_手札ならび,L), L = [Min|R], Max is Min + 4, findall(N,for(Min,N,Max),L), \+all(_手札ならび,[_,_共通マーク])),!. ポーカーの役(_手札ならび,フルハウス) :- findsetof(_番号,append(_,[[_番号,_]|_],_手札ならび),[_番号1,_番号2]), count(append(_,[[_番号1,_]|_],_手札ならび),Count1), Count1 >= 2, count(append(_,[[_番号2,_]|_],_手札ならび),Count2), Count2 >= 2,!. ポーカーの役(_手札ならび,フルハウス) :- sort(_手札ならび,L), フルハウス(L). フルハウス([[_A,_],[_A,_],[_B,_],[_B,_],[_B,_]]) :- \+(A = B),!. フルハウス([[_A,_],[_A,_],[_A,_],[_B,_],[_B,_]]) :- \+(A = B),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # ポーカーの役(_手札ならび,フラッシュ) :- すべての手札のマークが共通である(_手札ならび), ストレートではない(_手札ならび,ストレート),!. ポーカーの役(_手札ならび,ストレート) :- 並べ直して、番号は連続したカードは5枚あることを確認する(_整列した手札ならび), '同一マークではない'(_整列した手札ならび),!. ポーカーの役(_手札ならび,フルハウス) :- 並べ直して、同一番号の2枚、3枚組になっているか確認する(_手札ならび). すべての手札のマークが共通である(_手札ならび) :- all(_手札ならび,[_,_共通マーク]),!. ストレートではない(_手札ならび) :- \+(ポーカーの役(_手札ならび,ストレート)). 並べ直して(_手札ならび,_整列した手札ならび) :- sort(_手札ならび,_整列した手札ならび). 並べ直して、番号は連続したカードは5枚あることを確認する(_手札ならび) :- 並べ直して(_手札ならび,_整列した手札ならび), _整列した手札ならび = [_最小値|R], _最大値 is _最小値 + 4, findall(_番号,for(_最小値,_番号,_最大値),_整列した手札ならび), 同一マークではない(_整列した手札ならび) :- \+(all(_整列した手札ならび,[_,_共通マーク])),!. 並べ直して、同一番号の2枚、3枚組になっているか確認する(_手札ならび) :- 並べ直して(_手札ならび,_整列した手札ならび), 同一番号の2枚、3枚組になっている(_整列した手札ならび). 同一番号の2枚、3枚組になっている([[A,_],[A,_],[B,_],[B,_],[B,_]]) :- \+(A = B),!. 同一番号の2枚、3枚組になっている([[A,_],[A,_],[A,_],[B,_],[B,_]]) :- \+(A = B),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289913298/83 # ポーカーゲームを作るプログラムの課題を教えてください。 # [1] プログラムまとめ # [2] 課題1のストレート、フラッシュ、フルハウスをヒントを使って判定する関数を作る。 # ポーカーの役(_手札ならび,フラッシュ) :- フラッシュとは5枚の手札が全部同じマークになること。ただし、番号が連続している場合はストレートフラッシュといって別の役となる(_手札ならび). ポーカーの役(_手札ならび,ストレート) :- ストレートとは5枚の手札が連続した番号になること。ただし、マークが全部同じ場合はストレートフラッシュといって別の役となる(_手札ならび). ポーカーの役(_手札ならび,フルハウス) :- フルハウスとは3枚が同一番号で、別の番号の残り2枚も同一番号であるもの(_手札ならぴ). フラッシュとは5枚の手札が全部同じマークになること。ただし、番号が連続している場合はストレートフラッシュといって別の役となる(_手札ならび) :- 全部同じマーク(_手札ならび), ストレートフラッシュになるものを除外する(_手札ならび). 全部同じマーク(_手札ならび) :- all(_手札ならび,[_,_共通マーク]),!. ストレートフラッシュになるものを除外する(_手札ならび) :- 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび), \+(番号が連続している(_番号順に整列した手札ならび)),!. ストレートとは5枚の手札が連続した番号になること。ただし、マークが全部同じ場合はストレートフラッシュといって別の役となる(_手札ならび) :- 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび), 番号が連続している(_番号順に整列した手札ならび), \+(全部同じマーク(_手札ならび)). 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび) :- sort(_手札ならび,_番号順に整列した手札ならび). 番号が連続している(_番号順に整列した手札ならび) :- 番号が連続していることを再帰的に確かめる(_番号順に整列した手札ならび). 番号が連続していることを再帰的に確かめる([[_カード番号1,_],[_カード番号2,_]|R]) :- _カード番号2 is _カード番号1 + 1, 番号が連続していることを再帰的に確かめる([_カード番号2|R]). 番号が連続していることを再帰的に確かめる([_]). フルハウスとは3枚が同一番号で、別の番号の残り2枚も同一番号であるもの(_手札ならぴ) :- 判断しやすいように番号順に並べ直す(_手札ならび,_番号順に整列した手札ならび), それぞれ同一番号の二枚、三枚組(_番号順に整列した手札ならび). それぞれ同一番号の二枚・三枚組([[_A,_],[_A,_],[_A,_],[_B,_],[_B,_]]) :- \+(A=B),!. それぞれ同一番号の二枚・三枚組([[_A,_],[_A,_],[_B,_],[_B,_],[_B,_]]) :- \+(A=B),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1289913298/654 # 内容: # 1] 授業単元:cプログラミング # [2] クイズゲームを作成する。 # ファイル入出力についてどれだけ理解しているかを確かめる。 # # 画面上に問題を一文ずつ表示し、番号を入力させ答えさせる。 # 結果をtxtファイルで出力する。 # なお、問題文はtxtファイルを作成しそれを読み込んで表示させる。 '画面上に問題を一文ずつ表示し、番号を入力させ答えさせる。結果をtxtファイルで出力する。'(_問題ファイル名,_解答ファイル名) :- open(_問題ファイル,read,Instream), open(_解答ファイル,write,Outstream), '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream), close(Outstream), close(Instream). '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream) :- 一問読み込む(Instream,_問題), '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,_問題). '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,end_of_file) :- !. '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,_問題) :- 問題を提示して解答を得る(_問題,_解答), 問題と解答を書き込む(Outstream,_問題,_解答), 一問読み込む(Instream,_問題2), '出題して、解答を得る。それを解答を解答ファイルに書き込む(問題ファイルが終了するまで繰り返す)'(Instream,Outstream,_問題2). 一問読み込む(Instream,_問題) :- get_line(Instream,Line), 一問読み込む(Instream,Line,_問題行ならび), concat_atom(_問題行ならび,'\n',_問題),!. 一問読み込む(_,'',[]) :- !. 一問読み込む(Instream,Line,[Line|R]) :- get_line(Instream,Line2), 一問読み込む(Instream,Line,R). 問題を提示して解答を得る(_問題,_解答) :- write_formatted('%t\n',[_問題]), 解答を得る(_解答). 解答を得る(_解答) :- get_line(_解答),!. 問題と解答を書き込む(Outstream,_問題,_解答) :- write_formatted(Outstream,'%t\n%t\n\n',[_問題,_解答]),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1267796762/603 # 【 課題 】http://ime.nu/www.geocities.jp/lang_lang_true/Pp.txt # 【 形態 】 Javaアプリケーション(main()で開始) # 【 期限 】12/8 # 【 Ver  】1.6.0_22 # 【 補足 】伏字がなくなるか、一文字も伏字が起き変わらない入力を6回 # 行うと、ゲームが終了する。という部分を どう作っていいのかわかりません。 #      お願いします。 # 一文字ずつアルファベットを入力していきながら、隠された英単語を推定するゲームのプログラムを # 作成しなさい。 # ・はじめは隠された単語のすべての文字が伏字(*)で表示されている。 # ・一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に # 置き換えられて表示される。 # ・伏字がなくなるか、一文字も伏字が起き変わらない入力を6回行うと、ゲームが終了する。 一文字ずつアルファベットを入力していきながら、隠された英単語を推定するゲーム(_ファイル) :- get_chars(_ファイル,Chars1), length(Chars1,Len), length(_伏せ字ならび,Len), 伏せ字ならびに英数文字以外を設定する(Chars1,_伏せ字ならび), 伏せ字を表示する(Chars1), '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'([],Chars1,_伏せ字ならび). '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'(_,Chars,_伏せ字ならび) :- \+(伏せ字がある(_伏せ字ならぴ)), write('伏せ字がなくなりました。あなたの勝ちです。\n'), concat_atom(Chars,_文字列), write_formatted('文は %t でしたね。\n',[_文字列]),!. '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'([_,_,_,_,_,_],Chars,_伏せ字ならび) :- write('Game Over!\n'),!. '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'(Ln,Chars,_伏せ字ならび) :- 伏せ字を表示する(_伏せ字ならび), write(': '), get_char(Char), 伏せ字の置き換え(Char,Chars,_伏せ字ならび), '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'(Ln,Chars,_伏せ字ならび). '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'(Ln,Chars,_伏せ字ならび) :- '一文字を入力すると、その文字がつかわれている単語中のすべての箇所の伏字がその文字に置き換えられて表示される。'([_|Ln],Chars,_伏せ字ならび). 伏せ字がある([V|_]) :- var(V),!. 伏せ字がある([_|R]) :- 伏せ字がある(R). 伏せ字の置き換え(Char,[],_) :- !,fail. 伏せ字の置き換え(Char,[Char|R1],[Char|R2]) :- 伏せ字の置き換え(Char,R1,R2),!. 伏せ字の置き換え(Char,[_|R1],[_|R2]) :- 伏せ字の置き換え(Char,R1,R2),!. 伏せ字を表示する([]) :- !. 伏せ字を表示する([V|R]) :- var(V), put_char('*'), 伏せ字を表示する(R),!. 伏せ字を表示する([A|R]) :- put_char(A), 伏せ字を表示する(R),!. 伏せ字ならびに英数文字以外を設定する([],[]) :- !. 伏せ字ならびに英数文字以外を設定する([A|R1],[A|R2]) :- \+((A @>= 'A',A @=< 'Z')), \+((A @>= 'a',A @=< 'z')), \+((A @>= '0',A @=< '9')), 伏せ字ならびに英数文字以外を設定する(R1,R2),!. 伏せ字ならびに英数文字以外を設定する([_|R1],[_|R2]) :- 伏せ字ならびに英数文字以外を設定する(R1,R2),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/277 # [1] 授業単元:プログラミング言語(C) # [2] 問題文(含コード&リンク): # Cプログラミングの基礎[新訂版]発行:サイエンス社 著:蓑原隆より # P48 3.1 3.2 3.3 3.4 P55 4.1 P88 5.1 P104 6.1 6.2 # http://ime.nu/upload.jpn.ph/upload/img/u72273.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72276.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72274.jpg # http://ime.nu/upload.jpn.ph/upload/img/u72275.jpg # # 3.3 乱数を使って計算機とジャンケンをするゲームを作成せよ。 # 人間の入力はグーは0、チョキは1、パーは2などとし、勝ち、負け、 # 引き分けの判定をすること。 '乱数を使って計算機とジャンケンをするゲームを作成せよ。人間の入力はグーは0、チョキは1、パーは2などとし、勝ち、負け、引き分けの判定をする'(_判定) :- repeat, 人間の入力(_人間の拳), 乱数を使って計算機と(_計算機の拳), 判定(_人間の拳,_計算機の拳,_判定). 人間の入力(_人間の拳) :- write('拳を入力してください 0..グー 1..チョキ 2..パー : '), get_integer(_整数), 拳に変換(_整数,_人間の拳). 拳に変換(0,グー). 拳に変換(1,チョキ). 拳に変換(2,パー). 乱数を使って計算機と(_計算機の拳) :- _計算機が生成した整数 is random mod 3, 拳に変換(_計算機が生成した整数,_計算機の拳). 判定(_拳,_拳,引き分け). 判定(グー,チョキ,勝ち). 判定(チョキ,パー,勝ち). 判定(パー,グー,勝ち). 判定(チョキ,グー,負け). 判定(パー,チョキ,負け). 判定(グー,パー,負け). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/710 # [1] プログラミング実習(ゲーム科課題) # [2] http://ime.nu/www.dotup.org/uploda/www.dotup.org1373468.txt.html # # [2] 入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに # 保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ # 例:規定値Nには「x=1000,y=1500,z=2000」 # 要素名A「x=100,y=200,z=300」B「x=50,y=60,z=70」C「x=10,y=20,z=30」という内容を持ったデータを # 予め作成し保存 # 入力するのはx,y,zの数値ではなくA、B、Cといった要素名 # # 動作例: # 要素名入力:A # 内部動作 # N=N‐A # (x=1000-100 y=1500-200 z=2000-300) # (= x=900 y=1300 z=1700) # これを任意の回数繰り返し、Nを入力すると終了する等にてループを抜け # 最終的にNの中の値とA,B,Cより値よち最も近い要素名を出力する(複数可) # 例えばNの中身がx=200 y=300 z=300となった時に終了すると「近似要素名出力:A」 # と出力されるようにせよ # # /*追加評価 # APIを利用し、UIを作る # よりわかりやすいインターフェースにする # 等、その他、鋭意工夫を期待しています # (と書いてありましたが、そこまでは必要ないと思います。) # パワーポイントに長々と書いてあったのを要約したのですが、それでも長くなってすみません*/ '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_規定値ならび) :- 催促付き文字列入力('要素名を入力してください : ',_要素名), '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_要素名,_規定値ならび). '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_要素名,_規定値ならび) :- '入力した要素名からその要素がもっている数値を規定値Nより引き'(_要素名,_規定値ならび,_値の差), write_formatted('入力された要素と規定値の差は %t です\n',[_値の差]), 催促付き文字列入力('要素名を入力してください : ',_要素名_2), \+(_要素名_2 = q), '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_要素名_2,_規定値ならび),!. '入力した要素名からその要素がもっている数値を規定値Nより引き、最終的に予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_直前の要素名,_規定値ならび) :- '予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_直前の要素名,_規定値ならび),!. '入力した要素名からその要素がもっている数値を規定値Nより引き'(_要素名,_規定値ならび,_値の差) :- 要素名(_要素名,_値ならび), 値の差を取る(_規定値,_値ならび,_値の差), 値の差を取る([],_,Y,X) :- X is abs(sqrt(Y)),!. 値の差を取る([A|R1],[B|R2],S1,X) :- C is (A - B) * (A - B), S2 is S1 + C, 値の差を取る(R1,R2,S2,X). '予めテキストに保存した要素の中よりNにもっとも近い(近似値)要素名を探しだし出力せよ'(_直前の要素名,_規定値ならび) :- findmin([_値の差,_要素名],( 要素名(_要素名,_値ならび), 値の差を取る(_規定値ならび,_値ならび,_値の差)), [_最も近い値,_要素名]), write_formatted('あなたの選択した要素名は %t ,最も近い要素名は %t です\n',[_直前の要素名,_要素名]). % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1294061094/823 # [1] 授業単元:ネットワークプログラミング # [2] 問題文(含コード&リンク): # ネットワーク対戦型ゲームを実装せよ # 宛先ホスト,ポート番号をコマンドライン引数として扱う. # serverとclientの1対1通信でOK # getaddrinfo()を使用すること # localhost内で動作すればOK # ゲームに関して # じゃんけん # ○×ゲーム # などなど・・・ # 提出物 # サーバ側,クライアント側のプログラム # 碁盤サーバ :- socket(internet,stream,Socket), socket_bind(Socket,Port), socket_listen(Socket), socket_accept(Socket,Host:Port2,NewSocket), open(NewSocket,read,Instream), open(NewSocket,write,Outstream), get_line(Instream,Line), ゲーム(Instream,Outstream,Line), close(Instream), close(Outstream), socket_shutdown(Socket), socket_shutdown(NewSocket). ゲーム(_,_,ありません) :- !. ゲーム(Instream,Outstream,Line) :- exception_handler(atom_to_term(Line,Term,Varlist),Ex, Term = Ex), call(Term), 自分の手番(_次の手), write_formatted(Outstream,'着手(%q). ',[_次の手]), flush_output(Outstream), get_line(Instream,Line2), ゲーム(Instream,Outstream,Line2). 着手((A,B)) :- write_formatted('相手の着手は%t%tです\n',[A,B]), 盤面表示(A,B),!. 自分の手番(_次の手) :- write('次の手をカンマ区切りで入力してください : '), get_line(Line), 自分の着手診断(Line,_次の手),!. 自分の手番(_次の手) :- 自分の手番(_次の手). 自分の着手診断(Line,(A,B)) :- split(Line,[',',' '],[A,B]), A @>= 'A', A @=< 'S', B >= 0, B =< 19,!. 自分の着手診断(Line,_次の手) :- write_formatted('%t は適切な盤面表現ではありません。再入力をお願いします。\n',[Line]), fail. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1301553333/483 # [1] 授業単元:プログラミング # [2] 問題文(含コード&リンク): # ttp://www.dotup.org/uploda/www.dotup.org1575096.jpg # 'ヒット&ブロー' :- コンピュータが四桁の整数を決める(_数字ならびの一), 遊び手が数字を入力する(_数字ならびのニ), 'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ). コンピュータが四桁の整数を決める(_数字ならび) :- M is random mod 10000, number_chars(M,L), 頭部に零を詰める(L,_数字ならび). 頭部に零を詰める(L,_数字ならび) :- length(_数字ならび,4), append(L0,L,_数字ならび), all(L0,'0'). 遊び手が数字を入力する(_数字ならび) :- get_line(Line), findall(A,( append(_,[A|_],Line)), _数字ならび). 'ヒット&ブロー診断'(_数字ならびの一,_数字ならびのニ) :- ヒット数(_数字ならびの一,_数字ならびのニ,_ヒット数), ブロー数(_数字ならびの一,_数字ならびのニ,_ブロー数), 'ヒット&ブロー表示'(_ヒット数,_ブロー数),!. ヒット数(L1,L2,_ヒット数) :- count(( append(L0_1,[A|_],L1), append(L0_2,[A|_],L2), length(L0_1,N), length(L0_2,N)), _ヒット数). ブロー数(L1,L2,_ブロー数) :- count(( append(L0_1,[A|R_1],L1), append(L0_2,[A|R_2],L2), length(L0_1,N_1), length(L0_2,N_2), \+(N_1 == N_2)), _ブロー数). 'ヒット&ブロー表示'(4,_) :- writef('ゲームオーバー\n',[]),!. 'ヒット&ブロー表示'(_ヒット数,_ブロー数) :- writef('%tH%tB\n',[_ヒット数,_ブロー数]), fail. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1308749241/763 # ・授業:ネットワークプログラミング # ・問題文:以下のプログラムを改編し、ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする。このときサーバーは2つクライアントから入力をうけ、同時に入力結果を返すこととする。 # ・プログラムURL:http://ideone.com/pGnkt # ・環境 # ・OS: Linux #  コンパイル:端末 gcc -o # ・言語:C # ・期限: 2011年07月19日15:30まで #  その他の制限: この課題に取り組んでいますが、サーバーとクライアントの間でうまく動作するものが作れません。よろしくお願いいたします。 # % % 参加者がそれぞれサーバとして振舞う ジャンケンゲーム % 条件として、サーバ上に表示し、それに対して文字入力応答ができること。 % % ジャンケン胴元によって勝負は制御される。参加者サーバに拳を何にするか % 質問して、その解答を取りまとめるのがジャンケン胴元の役割だ。 % % 胴元側述語 'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび) :- member([(_参加者,_),3],_参加者勝数ならび),!, writef('%t が3勝しました。勝者は %t です\n',[_参加者,_参加者]),!. 'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび) :- ジャンケン(_参加者勝数ならび1), ポン(_参加者勝数ならび1,_拳ならび), 判定(_拳ならび,_判定), 同報分生成(_参加者勝負ならび,_拳ならび,_同報文), 同報(_参加者勝負ならび,_同報文), 成績更新(_判定,_拳ならび,_参加者勝数ならび1,_参加者勝数ならび2), 'ジャンケンゲームを作成せよ。勝敗判定は先に3勝したほうを勝ちとする'(_参加者勝数ならび2). ジャンケン([]). ジャンケン([[(_参加者:_ポート)|_]|R]) :- (_参加者:_ポート) :: ジャンケン表示, ジャンケン(R). ポン([[_参加者|_]|R1],[_拳|R2]) :- (_参加者:_ポート) :: ポン入力(_拳), ポン(R1,R2). 判定(_拳ならび,あいこ) :- all(_拳ならび,V),!. 判定(_拳ならび,あいこ) :- member(グー,_拳ならび), member(パー,_拳ならび), member(チョキ,_拳ならび),!. 判定(_拳ならび,パー) :- member(グー,_拳ならび), member(パー,_拳ならび),!. 判定(_拳ならび,チョキ) :- member(パー,_拳ならび), member(チョキ,_拳ならび),!. 判定(_拳ならび,グー) :- member(チョキ,_拳ならび), member(グー,_拳ならび),!. 成績更新(あいこ,_,_参加者勝数ならび,_参加者勝数ならび) :- !. 成績更新(_拳,[_拳|R1],[[(_参加者,_ポート),_勝数1]|R2],[[(_参加者,_ポート),_勝数2]|R3]) :- _勝数2 is _勝数1 + 1, 成績更新(_拳,R1,R2,R3). 成績更新(_拳,[_拳2|R1],[L|R2],[L|R3]) :- \+(_拳 = _拳2), 成績更新(_拳,R1,R2,R3). 同報文生成(_参加者勝数ならび,_拳ならび,_同報文) :- 参加者付き拳ならび(_参加者勝数ならび,_拳ならび,_参加者付き拳ならび), concat_atom(_参加者付き拳ならび,',',_同報文). 参加者付き拳ならび([[],[],[]) :- !. 参加者付き拳ならび([[(_参加者:_)|_]|R1],[_拳|R2],[_参加者:_拳|R3]) :- 参加者付き拳ならび(R1,R2,R3). 同報([],_) :- !. 同報([[(_参加者:_ポート番号),_]|R1],_同報文) :- (_参加者:_ポート) :: writef('%t\n',[_同報文]), 同報(R1,_同報文). % 参加者(サーバ)側述語 ジャンケン表示 :- write('ジャン\n'), write('ケン\n'). ポン入力(_拳) :- write('ポン'), readln([_拳]),!. % 以下のサイトは http://hibari.2ch.net/test/read.cgi/tech/1312201995/981 # [1] 授業単元:基礎C # [2] 問題文(含コード&リンク):下のAAを縦20横30くらいのマップ上でこいつを # キーボードのAを押せばジャンプして地面まで落下、Sを押せばマップ上を右へ、 # Dを押せば左へ行くプログラムを作成せよ。 # # ↓AA # # (^ω^) # (   ) #  l  l # # ゲーム(_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置,LL1,LL2) :- length(LL1,_行数), [L|_] = LL1, length(L,_列数), _下側余り is _行数 - _画面の右下の行位置, _上側余り is _行数 - _画面の左上の行位置, _右側余り is _列数 - _画面の右下の列位置, _左側余り is _列数 - _画面の左上の列位置, rawmode, ゲーム(LL1,_下側余り,_上側余り,_下側余り,_右側余り,_左側余り,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置), norawmode. ゲーム(LL1,_下側余り,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置) :- 画面を消去してカーソルを先頭に移動, 画面表示(LL1,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置), get_char(_文字), 機能(_文字,LL1,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2), ゲーム(LL2,_下側余り,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置). ゲーム(_,_,_,_,_,_,_,_,_,_) :- write('game over !!\n'). 機能('q',_,_,_,_,_,_,_,_,_,_,_) :- !,fail. 機能('s',LL1,_,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2) :- 右に行く(LL1,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2),!. 機能('d',LL1,_,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2) :- 左に行く(LL1,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2),!. 機能('a',LL1,_下側余り,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2) :- 地面まで落下(LL1,_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り_2,_左側余り_2),!. 地面まで落下(LL,_下側余り,_上側余り,_下側余り,_右側余り,_左側余り,LL,_上側余り,_下側余り,_右側余り,_左側余り) :- !. 地面まで落下(LL1,_下側余り,_上側余り_1,_下側余り_1,_右側余り,_左側余り,LL2,_上側余り_2,_下側余り,_右側余り,_左側余り) :- _下へ is _下側余り_1 - _下側余り, _下へ >= 0, _上側余り_2 is _上側余り_1 - _下へ, length(LL3,_下へ), append(LL4,LL3,LL1), append(LL3,LL4,LL2),!. 地面まで落下(LL1,_下側余り,_上側余り_1,_下側余り_1,_右側余り,_左側余り,LL2,_上側余り_2,_下側余り,_右側余り,_左側余り) :- _上へ is _下側余り - _下側余り_1, _上側余り_2 is _上側余り_1 - _上へ, length(LL3,_上へ), append(LL3,LL4,LL1), append(LL4,LL3,LL2),!. 左に行く(LL,_上側余り,_下側余り,_右側余り,0,LL,_上側余り,_下側余り,_右側余り,0) :- !. 左に行く(LL1,_上側余り,_下側余り,_右側余り_1,_左側余り_1,LL2,_上側余り,_下側余り,_右側余り_2,_左側余り_2) :- findall(L,( append(_,[[A|L1]|_],LL1), append(L1,[A],L)), LL2), _右側余り_2 is _右側余り_1 + 1, _左側余り_2 is _左側余り_1 - 1,!. 右に行く(LL,_上側余り,_下側余り,0,_左側余り,LL,_上側余り,_下側余り,0,_左側余り) :- !. 右に行く(LL1,_上側余り,_下側余り,_右側余り_1,_左側余り_1,LL2,_上側余り,_下側余り,_右側余り_2,_左側余り_2) :- findall([A|L],( append(_,[L1|_],LL1), append(L,[A],L1)), LL2), _右側余り_2 is _右側余り_1 - 1, _左側余り_2 is _左側余り_1 + 1,!. 上に行く(LL,0,_下側余り,_右側余り,_左側余り,LL,0,_下側余り,_右側余り,_左側余り) :- !. 上に行く([L0|LL1],_上側余り_1,_下側余り_1,_右側余り_1,_左側余り_1,LL2,_上側余り_2,_下側余り_2,_右側余り,_左側余り) :- append(LL1,[L0],LL2), _上側余り_2 is _上側余り_1 - 1, _下側余り_2 is _下側余り_2 + 1,!. 下に行く(LL,_上側余り,0,_右側余り,_左側余り,LL,_上側余り,0,_右側余り,_左側余り) :- !. 下に行く(LL1,_上側余り_1,_下側余り_1,_右側余り,_左側余り,LL2,_上側余り_2,_下側余り_2,_右側余り,_左側余り) :- append(LL0,[L1],LL1), LL2 = [L1|LL0], _上側余り_2 is _上側余り_1 + 1, _下側余り_2 is _下側余り_2 - 1,!. 画面表示(LL1,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置) :- 画面表示(LL1,1,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置). 画面表示(_,M,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置) :- M > _画面の右下の行位置,!. 画面表示([_|R],M,_画面の左上行位置,_画面の左上の列位置,_画面の右下の行位置,_画面の右下の列位置) :- M < _画面の左上行位置, M_2 is M + 1, 画面表示(R,M_2,_画面の左上行位置,N2,_画面の左上の列位置,N3,_画面の右下の行位置,N4,_画面の右下の列位置). 画面表示([_行|R],M,_画面の左上行位置,N2,_画面の左上の列位置,N3,_画面の右下の行位置,N4,_画面の右下の列位置) :- M >= _画面の左上行位置, M =< _画面の右下行位置, 列表示(L,1,_画面の左上の列位置,_画面の右下の列位置), M_2 is M + 1, 画面表示(R,M_2,_画面の左上行位置,_画面の左上の列位置,N3,_画面の右下の行位置,N4,_画面の右下の列位置). 画面表示([],_,_,_,_). 列表示([],_,_,_) :- !. 列表示(_,N,_,_画面の右下の列位置) :- N > _画面の右下の列位置, write('\n'),!. 列表示([_|R],N,_画面の左上の列位置,_画面の右下の列位置) :- N < _画面の左上の列位置, N_2 is N + 1, 列表示(R,N_2,_画面の左上の列位置,_画面の右下の列位置). 列表示([A|R],N,_画面の左上の列位置,_画面の右下の列位置) :- N >= _画面の左上の列位置, N =< _画面の右下の列位置, write(A), N_2 is N + 1, 列表示(R,N_2,_画面の左上の列位置,_画面の右下の列位置). 画面を消去してカーソルを先頭に移動 :- 画面全体を消去, カーソルを画面の先頭に移動. 画面全体を消去 :- write('\E[2J'). カーソルを画面の先頭に移動 :- write('\E[1;1H'). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1335517816/334 # {1] 授業単元:プログラミング演習 # [2] 問題文: # http://ime.nu/codepad.org/4r1e9DdC # 上記のransuu関数を用いて、以下のような数当てゲームプログラムを作成せよ。 # このプログラムはmain関数とransuu関数からなるプログラム。 # 1) 1から100までの整数乱数を1つ発生させる。 # 2) 利用者に1から100までのある整数を入力してもらう。 # 3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。 # 4) 数を当てることができなかった場合には、もう一度数を入力してもらう。 # 5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。 # 数当てゲームプログラム :- '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数), 数当てゲームプログラム([],_1から100までの整数乱数,_). 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_診断) :- \+(var(_診断)), '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_試行回数,_診断),!. 数当てゲームプログラム(_試行回数,_1から100までの整数乱数,_) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数), '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_1から100までの整数乱数,_利用者が入力する1から100までの整数), '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数), 数当てゲームプログラム([_|_試行回数],_1から100までの整数乱数,_診断), '1) 1から100までの整数乱数を1つ発生させる。'(_1から100までの整数乱数) :- _1から100までの整数乱数 is random(100) + 1. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- write('1から100までの整数を入力してください : '), get_line(Line), '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数),!. '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- atom_to_term(Line,_利用者が入力する1から100までのある整数,_), integer(_利用者が入力する1から100までのある整数), _利用者が入力する1から100までのある整数 >= 1, _利用者が入力する1から100までのある整数 =< 100,!. '1から100までの整数入力診断'(Line,_利用者が入力する1から100までのある整数) :- writef('入力された %t からは1から100までの整数が得られません。\n',[Line]), fail. '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_数,_数) :- write('当り\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 > _入力した数, write('もっと大きい\n'). '3) 発生した乱数と入力した数が同じなら"当り"、乱数の方が入力した数よりも大きければ"もっと大きい"、乱数の方が入力した数よりも小さければ"もっと小さい"、と表示する。'(_発生した乱数,_入力した数) :- _発生した乱数 < _入力した数, write('もっと小さい\n'). '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(当り,_) :- !. '4) 数を当てることができなかった場合には、もう一度数を入力してもらう。'(_診断,_利用者が入力する1から100までのある整数) :- \+(_診断 = 当り), fail. 'もう一度数を入力してもらう。'(_利用者が入力する1から100までのある整数) :- '2) 利用者に1から100までのある整数を入力してもらう。'(_利用者が入力する1から100までのある整数). '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'(_,当り) :- write('あなたの勝ち\n'),!. '5) 6回以内に当たった場合には"あなたの勝ち"と表示して終了。6回続けて外れた場合には"あなたの負け"と表示して終了。'([_,_,_,_,_,_],_) :- write('あなたの負け\n'),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1339338438/880 # [1]授業単元:C言語 # [2]問題文 # マインスイーパのような爆弾ゲームプログラムを作成する。 # 1. マス目を8× 8に設定する。 # 2. 爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)。 # 3.まだ指定していないマス目には数字の0の代わりに記号'-'を表示する。 # 4.爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を # 表示する(最小で0、最大で8)。 # 5. 爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字 # の'x'を表示し、\Bomb!"と表示して終了する。 # # [3]環境 # [3.1]windows7 # [3.2]gcc # [3.3]C/C++ # [4]7月20日 # よろしくお願いします。 # マインスイーパ :- 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面), '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面). マインスイーパ(_平坦なならびで表現された盤面) :- count((member(A,_平坦なならびで表現された盤面),atom(A)),64),!. マインスイーパ(_平坦なならびで表現された盤面) :- 爆弾を除いて盤面を表示する(_平坦なならびで表現された盤面), マス目を選択させる(_行位置,_列位置), マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面). マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面), マインスイーパ(_平坦なならびで表現された盤面),!. マインスイーパ(_行位置,_列位置,_平坦なならびで表現された盤面) :- ゲームオーバー('You are Win!!!\n'). '爆弾が置かれていないマス目が指定された場合、ヒントとして「周囲のマス目にある爆弾の総数」を示す'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 平坦化した位置に変換(_行位置,_列位置,_nth1), nth1(_nth1,_平坦なならびで表現された盤面,0), 爆弾は周囲にいくつあるか(N,_平坦なならびで表現された盤面,_個数), writef('周囲に爆弾は %t 個あります\n',[_個数]),!. '爆弾が置かれたマス目を指定した場合、そのマス目も含めて爆弾の置かれたすべてのマス目に小文字の x を表示し、Bomb!"と表示して終了する'(_行位置,_列位置,_平坦なならびで表現された盤面) :- 得点は(_平坦なならびで表現された盤面,_得点), すべてのマス目に小文字のxを表示し(_平坦なならびで表現された盤面), write('\n Bomb! \n\n\n あなたの得点は %t です\n',[_得点]). 得点は(_平坦なならびで表現された盤面,_得点) :- count((member(A,_平坦なならびで表現された盤面),\+(var(A)),A==0),_得点). '爆弾が置かれたすべてのマス目に小文字のxを表示し'([]) :- !. '爆弾が置かれたすべてのマス目に小文字のxを表示し'([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を含むマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), '爆弾が置かれたすべてのマス目に小文字のxを表示し'(R). 爆弾を含むマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を含むマス目表示(A,_表示文字), writef('%t',[_表示文字]), R = [], write('\n'),!. 爆弾を含むマス目表示(V,'-') :- var(V),!. 爆弾を含むマス目表示(x,x) :- !. 爆弾を含むマス目表示(_,0). 爆弾を除いて盤面を表示する([]). 爆弾を除いて盤面を表示する([_1,_2,_3,_4,_5,_6,_7,_8|R]) :- 爆弾を除くマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を除いて盤面を表示する(R). 爆弾を除くマス目の行表示([_1,_2,_3,_4,_5,_6,_7,_8]) :- append(_,[A|R],[_1,_2,_3,_4,_5,_6,_7,_8]), 爆弾を除くマス目表示文字(A,_表示文字), write('%t',[_表示文字]), R = [], write('\n'),!. 爆弾を除くマス目表示(V,'-') :- var(V),!. 爆弾を除くマス目表示(x,'-') :- !. 爆弾を除くマス目表示(_,0). 平坦化した位置に変換(_行位置,_列位置,_nth1) :- _nth1 is (_行位置-1) * 8 + _列位置. 'マス目を8× 8に設定する'(_平坦なならびで表現された盤面) :- length(_平坦なならびで表現された盤面,64). '爆弾を10個にし、同じマス目に重ならないようにランダムに配置する(試行の最大回数は54回となる)'(_盤面,_転置された盤面) :- 爆弾は10個にし(Lp), 同じマス目に重ならないようにランダムに配置する'(Lp,L). 爆弾は10個にし(Lp) :- length(Lp,10), all(Lp,+). 同じマス目に重ならないようにランダムに配置する([],L) :- !. 同じマス目に重ならないようにランダムに配置する([+|R1],L) :- 同じマス目に重ならないようにランダムに(L), 同じマス目に重ならないようにランダムに配置する'(R1,L). 同じマス目に重ならないようにランダムに(L) :- repeat, _nth0 is random(64), nth0(_nth0,L,V), var(V), V = (+),!. 爆弾は周囲にいくつあるか(N,L,_個数) :- count(( member(_式,[N-9,N-8,N-7,N-1,N,N+1,N+7,N+8,N+9]), _nth1 is _式, nth1(_nth1,L,+)),_個数). マス目を選択させる(_行位置,_桁位置) :- 整数を得る('マス目の行位置(1-8)',(_行位置>=1,_行位置=<8),_行位置), 整数を得る('マス目の桁位置(1-8)',(_桁位置>=1,_桁位置=<8),_桁位置),!. % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/400 # [1] 授業単元:C言語 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/QdOnaWYm # # /* # ビンゴゲームを作る # # 仕様 # ・5×5のビンゴカードをint型の2次元配列として宣言する # ・ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用 # ・最初にビンゴカード作成に使うための重複しない100個の乱数を見やすい形で表示 # ・値を交換する処理は関数化する # ・実際のビンゴゲームのようにガラガラで1つずつ数字が出てくる # ・ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である # ・ビンゴカード作成用の乱数とガラガラ用の乱数はヒープ領域に確保した配列に格納 # ・カードの縦、横、斜めのいずれかがそろったらゲーム終了 # */ # :- dynamic(賞品/1). ビンゴ参加者(ケイスケ). ビンゴ参加者(ユウヤ). ビンゴ参加者(タダシ). ビンゴ参加者(マッチ). ビンゴ参加者(トオル). 賞品('フェラーリ(模型)'). 賞品('コルト45(模型)'). 賞品(ティー野球セット). 賞品(武豊の使っていた鞭). 賞品(ビンゴセット). ビンゴゲーム :- findall(_ビンゴ参加者,ビンゴ参加者(_ビンゴ参加者),_ビンゴ参加者ならび), ビンゴゲーム(_ビンゴ参加者ならび). ビンゴゲーム(_ビンゴ参加者ならび) :- ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび), 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴカードならび,_ガラガラで使う乱数列). 参加者全員がビンゴとなるまでガラガラを繰り返す([],_) :- write('ビンゴ終了\nご苦労さまでした\n'),!. 参加者全員がビンゴとなるまでガラガラを繰り返す(_参加者ビンゴカードならび,L2) :- ガラガラ(L1,_数,L2), ビンゴになったカードを探し賞品を渡してそのカードを削除(_参加者ビンゴカードならび,_ビンゴになった人をを削除した参加者ビンゴカードならび), 参加者全員がビンゴとなるまでガラガラを繰り返す(_ビンゴになった人をを削除した参加者ビンゴカードならび,L2). '5×5のビンゴカードをint型の2次元配列として宣言する'(_ビンゴカード) :- length(_ビンゴカード,5), findall(L,( member(L,_ビンゴカード), length(L,5)), _ビンゴカード). ゲーム参加者のビンゴカード(_ビンゴ参加者ならび,_ビンゴカードならび) :- findall([_ビンゴ参加者,_ビンゴカード],( member(_ビンゴ参加者,_ビンゴ参加者ならび), 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード)), _ビンゴカードならび). 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_ビンゴカード) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り、それから先頭の25個をビンゴカードに適用'(_重複しない乱数ならび), length(_ビンゴカードの乱数列,25), append(_ビンゴカードの乱数列,_,_重複しない100個の乱数ならび), ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(L) :- findall(N,between(1,100,N),L1), 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(0,L1,L). 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(0,_,[]) :- !. 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth,L1,[N|R2]) :- '重複しない1〜100の乱数'(Nth,L1,N,L2), Nth_1 is Nth - 1, 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(Nth_1,L2,R2). '重複しない1〜100の乱数'(Nth,L1,N,L2) :- Nth0 is random(Nth), length(L0,Nth0), append(L0,[N|R1],L1), append(L0,R1,L2),!. ビンゴカード(_重複しない100個の乱数ならび,_ビンゴカード) :- _ビンゴカード=[[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_],[_,_,_,_,_]], flatten(_ビンゴカード,_重複しない100個の乱数ならび). 'ガラガラは1〜100までの重複しない乱数を作る機械であり、ビンゴカード作成に用いた乱数列とガラガラで使う乱数列は別物である'(_ガラガラで使う乱数列) :- 'ビンゴカードの数字は重複しない1〜100の乱数を作り'(_ガラガラで使う乱数列),!. ビンゴになったカードを探し商品を渡してそのカードを削除(_数字,[[_ビンゴ参加者,_ビンゴカード_1]|R1],L2) :- 一致した数字があったら穴をあける(_数字,_ビンゴ参加者,_ビンゴカード_1,_ビンゴカード_2), ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード_2,_ビンゴ参加者,L2,R2), ビンゴになったカードを探し賞品を渡してそのカードを削除(_数字,R1,R2),!. ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード,_ビンゴ参加者,R,R) :- ビンゴ(_ビンゴカード), 賞品を渡す(_参加者),!. ビンゴだったら賞品を渡してその人は上がり(_ビンゴカード,_ビンゴ参加者,[[_ビンゴ参加者,_ビンゴカード]|R],R) :- \+(ビンゴ(_ビンゴカード)). 一致した数字があったら穴をあける(_数字,_ビンゴカード_1,_ビンゴカード_2) :- findall(L2,( member(L,_ビンゴカード_1), 一致した場合だけ穴を開ける(_数字,L,L2)), _ビンゴカード_2). 一致した場合だけ穴を開ける(_数字,L,L2) :- append(L0,[_数字|R],L), append(L0,[穴|R],L2),!. 一致した場合だけ穴を開ける(_,L,L). ビンゴ([穴,_,_,_,_],[_,穴,_,_,_,_],[_,_,穴,_,_],[_,_,_,穴,_],[_,_,_,_,穴]) :- !. ビンゴ([_,_,_,_,穴],[_,_,_,穴,_],[_,_,穴,_,_],[_,穴,_,_,_,_],[穴,_,_,_,_]) :- !. ビンゴ(_ビンゴカード) :- member(L,_ビンゴカード), all(L,穴),!. ビンゴ(_ビンゴカード) :- 転置(_ビンゴカード,_ビンゴカード_2), member(L,_ビンゴカード_2), all(L,穴),!. 賞品を渡す(_参加者) :- retract(賞品(_賞品)), writef('%t君はビンゴになりました。賞品は %t です!\n',[_参加者,_賞品]),!. all([],_). all([A|R],A) :- all(R,A). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1349527750/872 # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): # whileを用いて数当てゲームを作りなさい # ・コンピュータが乱数で1から1000までの数を用意する. # ・プレイヤがキーボードから数を入れる. # ・コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する. # ・コンピュータの数とプレイヤの数が同じでなければ,繰り返す. # 「何回で当てられたか」を表示させる. # 'whileを用いて数当てゲームを作りなさい ・コンピュータが乱数で1から1000までの数を用意する. ・プレイヤがキーボードから数を入れる. ・コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する. ・コンピュータの数とプレイヤの数が同じでなければ,繰り返す. 「何回で当てられたか」を表示させる.' :- コンピュータが乱数で1から1000までの数を用意する(_1から1000までの乱数), プレイヤがキーボードから数を入れる(0,_何回目,_数), 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する'(_1から1000までの乱数,_数,_診断), 'コンピュータの数とプレイヤの数が同じでなければ,繰り返す'(_診断), writef('%t回で当てることができました。おめでとうございます。\n',[_何回目]). コンピュータが乱数で1から1000までの数を用意する(_1から1000までの乱数) :- _1から1000までの乱数 is random(1000) + 1. プレイヤがキーボードから数を入れる(N_1,N,_数) :- N is N_1 + 1, 整数を得る(数,(_数 >= 1,_数 =< 1000),_,_数). プレイヤがキーボードから数を入れる(N_1,N,_数) :- N_2 is N_1 + 1, プレイヤがキーボードから数を入れる(N_2,N,_数). 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と画面に表示する'(_1から1000までの乱数,_数,大きい) :- 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,_診断), 画面に表示する(_診断). writef('%t\n',[_診断]). 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,大きい) :- _1から1000までの乱数 < _数. 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,小さい) :- _1から1000までの乱数 > _数. 'コンピュータの数より大きければ「大きい」,小さければ「小さい」と'(_1から1000までの乱数,_数,コンピュータの数とプレイヤの数が同じ) :- _1から1000までの乱数 = _数. 'コンピュータの数とプレイヤの数が同じでなければ,繰り返す'(コンピュータの数とプレイヤの数が同じ). 画面に表示する(_診断) :- writef('%t\n',[_診断]). % 以下のサイトは http://toro.2ch.net/test/read.cgi/tech/1354070278/49 # [1] 授業単元:計算機実習 # [2] 問題文(含コード&リンク): http://ime.nu/codepad.org/eMHdX9DL # 上記のプログラムを変更して,キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい. # 入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい. # # #include # int plot[8][8]; # char state[3][5] = {" ","○ ","● "}; # # # void print_board(){ # int x,y; # printf("\033[2J"); # printf("\033[%d;%dH",0,0); # for(y = 0;y < 8;y++){ # for (x = 0;x < 8;x++){ # printf("%s|",state[plot[x][y]]); # } # printf("\n"); # printf("--+--+--+--+--+--+--+--+\n"); # } # } # # int main(){ # int x,y; # # for(y = 0;y < 8;y++)for(x = 0;x < 8;x++)plot[x][y] = 0; # plot[3][3] = plot[4][4] = 1; # plot[3][4] = plot[4][3] = 2; # # print_board(); # } # # 1 2 3 4 5 6 7 8 # +--+--+--+--+--+--+--+--+ # 1 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 2 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 3 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 4 | | | |○|●| | | | # +--+--+--+--+--+--+--+--+ # 5 | | | |●|○| | | | # +--+--+--+--+--+--+--+--+ # 6 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 7 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # 8 | | | | | | | | | # +--+--+--+--+--+--+--+--+ # :- dynamic(ボード保存/1). 'キーボードから(x, y)の座標とマスの状態を入力し,反映するようにしなさい.入力の際には座標や状態が範囲を超えていないか確認し,越えているときにはもう一度入力するようにしなさい.' :- ボードの初期状態(_ボート), ボードゲーム(_ボード). ボードの初期状態(_ボート) :- findall(L,( between(1,8,_), length(L,8), all(L,' ')), _ボード). ボードゲーム(_現在のボード) :- ボード(_現在のボード,_一手進んだボード), ボードゲーム(_一手進んだボード),!. ボードゲーム(_現在のボード) :- ボード表示(_現在のボード), write('ゲーム終了です。\n'), 終了時点のボードを保存する(_現在のボード). ボード(_現在のボード) :- 着手するべきマスが残っている(_現在のボード), 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y), ボードを更新する(X,Y,_現在のボード,_一手進んだボード), ボードを表示する(_一手進んだボード),!. 着手するべきマスが残っている([L|R]) :- member(' ',L), 着手するべきマスが残っている(R),!. 'キーボードから(x, y)の座標とマスの状態を入力し'(X,Y,_マスの状態) :- 整数を得る('x(0は終了)',between(0,8,X),X), \+(X = 0), 整数を得る('y',between(1,8,Y),Y), マスの状態を得る(_マスの状態). マスの状態を得る(_マスの状態) :- write(' ..0か●..1か○..2を着手してください : '), get_Line(Line), '診断: マスの状態を得る'(Line,_マスの状態),!. マスの状態を得る(_マスの状態) :- マスの状態を得る(_マスの状態). '診断: マスの状態を得る'('0',' ') :- !. '診断: マスの状態を得る'('1','○') :- !. '診断: マスの状態を得る'('2','●') :- !. ボードを更新する(X,Y,_着手,_現在のボード,_一手進んだボード) :- '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび), 対象行を更新する(X,_着手,_対象行,_更新された対象行), append(_前の行ならび,[_更新された対象行|_後の行ならび],_一手進んだボード). '前の行ならび、対象行、後の行ならび'(Y,_現在のボード,_前の行ならび,_対象行,_後の行ならび) :- append(_前の行ならび,[_対象行|_後の行ならび],_現在のボード), length([_|_前の行ならび],Y). 対象行を更新する(X,_着手,_対象行,_更新された対象行) :- append(L0,[_|R],_対象行), length([_|L0],X), append(L0,[_着手|R],_更新された対象行). ボード表示(_ボード) :- append(L0,[L|R],_ボード), ボードの一行を表示する(L0,L), R = [], writef(' +--+--+--+--+--+--+--+--+\n'),!. ボードの一行を表示する(L0,L) :- length([_|L0],N), writef(' +--+--+--+--+--+--+--+--+\n'), atomic_list_concat(L,'|',S), writef('%t %t|\n',[N,S]). 終了時点のボードを保存する(_現在のボード) :- asserta(ボード保存(終了時点のボードを保存する(_現在のボード)). % 以下のサイトは # 【 課題 】マス取りゲーム # 【 形態 】1. Javaアプリケーション(main()で開始) # 【 期限 】11/27 24:00 # 【 Ver  】"1.7.0_45" # 【 補足 】3×3のマスに『○』と『×』を交互に入力して9マス埋まったら終了です。 # 勝ち負けはいりません 戦略なしマス取りゲーム(_手順) :- 戦略なしマス取りゲーム(○,[a1,a2,a3,b1,b2,b3,c1,c2,c3],_手順). 戦略なしマス取りゲーム(_手番,[],[]). 戦略なしマス取りゲーム(_手番,_残りマスならび,[[_手番,_マス]|_手順]) :- 手番がマスをひとつ取る(_手番,_残りマスならび,_マス,_ひとつマスを取られた残りマスならび), 次の手番(_手番,_次の手番), 戦略なしマス取りゲーム(_次の手番,_ひとつマスを取られた残りマスならび,_手順). 手番がマスをひとつ取る(_手番,_残りマスならび,_マス,_ひとつマスを取られた残りマスならび) :- length(_残りマスならび,_残りマス数), _乱順数 is random(_残りマス数), nth0(_乱順数,_残りマスならび,_マス), select(_マス,_残りマスならび,_ひとつマスを取られた残りマスならび). 次の手番(○,×). 次の手番(×,○). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # 勝ち((1,1),(1,2),(1,3)). 勝ち((2,1),(2,2),(2,3)). 勝ち((3,1),(3,2),(3,3)). 勝ち((1,1),(2,1),(3,1)). 勝ち((1,2),(2,2),(3,2)). 勝ち((1,3),(2,3),(3,3)). 勝ち((1,1),(2,2),(3,3)). 勝ち((1,3),(2,2),(3,1)). '○×ゲーム'(_勝ち,_着手ならび) :- 交互着手([(1,1),(1,2),(1,3),(2,1),(2,2),(2,3),(3,1),(3,2),(3,3)],○,×,[],[],_勝ち,_着手ならび). 交互着手(_,_,_手番,_,L2,_手番,[]) :- 勝ち(L2),!. 交互着手(_着手可能点,_手番,_次の手番,L1,L2,_勝ち,[_着手|_着手ならび]) :- select(_着手,_着手可能点,_残り着手可能点), 交互着手(_残り着手可能点,_次の手番,_手番,L2,[_着手|L1],_勝ち,_着手ならび). 勝ち(L) :- 勝ち(A,B,C), member(A,L), member(B,L), member(C,L). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲーム'(_勝ち,_着手ならび) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_着手ならび). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ち(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ち(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- 全ての第一引数の実行に対して第二引数の実行が必ず成立する(副文字列(_文字列,_,1,_,文字),含まれる(_文字,_着手ならび)). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). 全ての第一引数の実行に対して第二引数の実行が必ず成立する(_第一引数,_第二引数) :- forall(_第一引数,_第二引数). % 以下のサイトは # 出典: プログラミングのお題スレ Part3 #729 # # お題:○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。 # # 列者臨 # 在皆兵 # 前陣闘 # 勝ち(列者臨). 勝ち(在皆兵). 勝ち(前陣闘). 勝ち(列在前). 勝ち(者皆陣). 勝ち(臨兵闘). 勝ち(列皆闘). 勝ち(臨皆前). '○×ゲームで○が勝つ局面までの手順を深さ優先探索ですべて探し出して出力。手順の重複は認めない。' :- すべて('○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順),出力(_手順)). '○×ゲームで○が勝つ局面までの手順を深さ優先探索で探し出して'(_手順) :- 交互着手(臨兵闘者皆陣列在前,○,×,[],[],_勝ち,_手順). 交互着手(_,_,_手番,_,_手番の着手点ならび,_手番,[]) :- 勝ち(_手番の着手点ならび),!. 交互着手(_着手可能点文字列,_手番,_次の手番,_手番の着手点ならび,_次の手番の着手点ならび,_勝ち,[_着手|_着手ならび]) :- 選択(_着手可能点文字列,_着手,_残り着手可能点文字列), 交互着手(_残り着手可能点文字列,_次の手番,_手番,_次の手番の着手点ならび,[_着手|_手番の着手点ならび],_勝ち,_着手ならび). 選択(_着手可能点文字列,_着手,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,_開始位置,1,_残り文字数,_着手), 着手以外の文字列を残り着手可能点とする(_着手可能点文字列,_開始位置,_残り文字数,_残り着手可能点文字列). 着手以外の文字列を残り着手可能点文字列とする(_着手可能点文字列,_前文字列長,_後文字列長,_残り着手可能点文字列) :- 副文字列(_着手可能点文字列,0,_前文字列長,_,_前文字列), 副文字列(_着手可能点文字列,_,_後文字列長,0,_後文字列), 二つの文字列の結合(_前文字列,_後文字列,_残り着手可能点文字列). 勝ち(_着手ならび) :- 勝ち(_文字列), 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび). 全ての文字列の構成文字は着手ならびに含まれる(_文字列,_着手ならび) :- すべて(副文字列(_文字列,_,1,_,文字),含まれる(_文字,_着手ならび)). 出力(_手順) :- 文字列ならびを結合して出力し改行する(_手順). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% 副文字列(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列) :- sub_atom(_文字列,_副文字列の開始位置,_文字列長,_残り文字列長,_副文字列). 文字列ならびを結合する(_文字列ならび,_結合した文字列) :- atomic_list_concat(_文字列ならび,_結合した文字列). 二つの文字列の結合(_文字列_1,_文字列_2,_結合した文字列) :- atom_concat(_文字列_1,_文字列_2,_結合した文字列). 含まれる(_要素,_ならび) :- member(_要素,_ならび). すべて(P,Q) :- forall(P,Q). 文字列ならびを結合して出力し改行する(_文字列ならび) :- atomic_list_concat(_文字列ならび,_結合した文字列), writef('%t\n',[_結合した文字列]).