7th_language 七度言語(なのたびげんご)仕様
- はじめに
七度言語は、小説を自動生成するための言語である。
現在の仕様では七度文庫を作成するための最小限の機能のみを持つ。
音声、画像や、ユーザーによるストーリーの選択などの機能はないが、
小説の生成のために必要なが機能をいろいろと工夫してある。
終了命令がない、ジャンプ命令がないなど言語としては特異な面もあるが、
これらの命令が、デバッグを行う上で悲惨な結果を及ぼすことは、プログラマーなら誰でもよく知っていることである。
また小説は基本的にループすることはないので、ループ命令もない。
七度言語で作成されたシナリオは、七度リーダー(7thReader.exe)によって実際に小説を生成することができる。
七度言語だけでは、シナリオの自動生成にはまだ不十分なので、
シナリオのデータベース(いわゆるネタ帳)から七度言語のソースコードを生成する
メタ言語の開発を予定している。
説明をわかりやすくするため、言語のソースコード
と生成される小説の例を色分けして書くことにする。
- 言語の約束
半角文字はすべてプログラム制御文字に使用する。
小説として記述する文章はすべて全角文字を使用しなければならない。
半角のスペース記号は文字の区切りとして使われる以外には、
生成される文章では基本的にはすべて無視される。
予約された制御文字は
{}[]<>!#=&+-;$\/
などである
予約されたキーワードは
title
end
select
scene
などである
- もっとも簡単な例
例(sample1.7th)
title 朝の挨拶
おはようございます。
今日はいい天気ですね。
end
と記載すると、プログラムが起動されると
-------------- 七度文庫 (なのたびぶんこ) -------------
おはようございます。
今日はいい天気ですね。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
という文章がテキストエディターに表示される
title というキーワードはちょうどC言語のmain()宣言のようなもので
ストーリーの開始であることが宣言される
朝の挨拶
というのは、シナリオの名前を表しており、すべて全角文字で記載する
おはようございます。
今日はいい天気ですね。
はシナリオの文章の本体であり、これもすべて全角文字で記載する
end
はtitleからはじまるシナリオのブロックの終了を意味する。
文章の最初の
-------------- 七度文庫 (なのたびぶんこ) -------------
と最後の
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
は自動的に追加される
- コメントの記入
七度言語のソースコードにはコメントを記載することができる。
ソースコードの第1文字目が半角文字;で始まる行はコメント行として扱われる。
例 sample2.7th
;**************************
;* 大学に行った時の出来事 *
;**************************
title 大学にいく
今日は大学にいって授業を受けました。
午後は、クラブの部室で友達とおしゃべりですごしました。
end
- 複数のストーリーが生成される場合
複数のストーリーを生成させるには、ストーリーの数だけ
title で始まるシナリオを作成すればよい
例 sample3.7th
title 大学にいく
今日は大学にいって授業を受けました。
午後は、クラブの部室で友達とおしゃべりですごしました。
end
title 映画を見に行く
今日は友達と待ち合わせをして、有楽町に映画を見にいきました。
映画のあとは、イタリア料理の店にいきました。
end
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
end
と記載すれば上記の3つのシナリオがランダムに表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は大学にいって授業を受けました。
午後は、クラブの部室で友達とおしゃべりですごしました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は友達と待ち合わせをして、有楽町に映画を見にいきました。
映画のあとは、イタリア料理の店にいきました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
- シナリオの記述
小説の開始以外のシナリオは
scene お酒を飲みに誘われました
帰ろうとすると男の子にお酒に誘われました。
駅の近くの居酒屋にみんなで入りました。
end
scene 居酒屋でお酒を飲む
居酒屋の中は民芸風に飾り付けがしてあって、
男の子達はよく飲みに来ている様子でした。
end
などと記載する
シナリオの名称はシナリオを識別するためのキーワードとして使われるので、
かならずシナリオごとに固有の名前をつける。
シナリオは例(sample4.7th)
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
{お酒を飲みに誘われました}
{居酒屋でお酒を飲む}
end
と記載することにより、サブルーチンの様に呼び出すことができる。
生成される文章は以下のようになる。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
帰ろうとすると男の子にお酒に誘われました。
駅の近くの居酒屋にみんなで入りました。
居酒屋の中は民芸風に飾り付けがしてあって、
男の子達はよく飲みに来ている様子でした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
シナリオはサブルーチン同様に実行が終了すると、呼び出し元に戻る。
しかし、リターン命令に相当する命令はないので、必ず最後の行の表示を行ったあと、
呼び出し元に戻る。
次のような
空白行は記述できない。
scene お酒を飲みに誘われました
帰ろうとすると男の子にお酒に誘われました。
駅の近くの居酒屋にみんなで入りました。
end
また次のように1行で複数のシナリオを呼び出すことはできない。
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
{お酒を飲みに誘われました}{居酒屋でお酒を飲む}
end
また表示する行のない空のシナリオも定義できない。
例
scene 空行の表示
end
- システムであらかじめ定義されたシナリオ
システムであらかじめ定義されたシナリオ名がある。
{章番号}
{段落}
についてはシステム固有のシナリオである。
{章番号}{段落}はあらかじめ定義されているので、
ユーザーが改めて定義する必要はない。
{章番号}は自動的に章番号を一つ増やしながら、
章番号の表示を行う。
章の最初は自動的に1文字下げて表示を行い段落を付ける。
{段落}は次に始まる行を1文字下げて段落を付ける。
段落をつけたいときはかならず{章番号}{段落}を用いる。
また{章番号}{段落}はシナリオをまたがって次に表示される行の段落を下げることが出来る。
例 sample5.7th
title お花見に行く
{章番号}
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
{章番号}
{お酒を飲みに誘われました}
{段落}
{居酒屋でお酒を飲む}
end
-------------- 七度文庫 (なのたびぶんこ) -------------
(1)
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きました。
(2)
帰ろうとすると男の子にお酒に誘われました。
駅の近くの居酒屋にみんなで入りました。
居酒屋の中は民芸風に飾り付けがしてあって、
男の子達はよく飲みに来ている様子でした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
- 表示される度に異なる文章を表示する方法
シナリオの文章を表示ずくとき、同じ文章が毎回表示されるのでは、読んでいて面白くはない。
表示される度に違う文章が表示できるように工夫をした。
今日は、クラブのみんなとお(花見|忘年会)に行きました。
とシナリオの文章を記載すると(sample6.7th)次の二通りの文章がランダムに表示される
今日は、クラブのみんなとお花見に行きました。
今日は、クラブのみんなとお忘年会に行きました。
次のようなもっと複雑な書式(sample7.7th)も可能である。
(今日|昨日)は、(クラブ|研究室)のみんなと(お(花見|忘年会)に行きました|帰りに喫茶店でお茶をのみました)。
また、空白の文字列も指定できるので、
次のように記載すると文字を記述するかしないかの選択を行える。
今日は、(クラブの|)みんなとお花見に行きました。
と記述すると(sample8.7th)次の二つの文章がランダムに表示される
今日は、クラブのみんなとお花見に行きました。
今日は、みんなとお花見に行きました。
- 継続行
2行以上に記載したテキストを1行として扱いたいときは
記号 \ を用いる
例(sample9.7th)
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きましたが、\
知らない男の子達ばかりでした。
end
というシナリオは次の記載と同等である。
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きましたが、知らない男の子達ばかりでした。
end
記号 \ はコメント行の連結には使用できない。
行の途中に記載された \ は無視される。
- 改行の挿入
テキスト表示の途中で改行を行いたい時は
記号 / を用いる。
例(sample10.7th)
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きましたが、/知らない男の子達ばかりでした。
end
は次のように表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きましたが、
知らない男の子達ばかりでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
記号 / はソースコードのテキストを表示するとき
改行を入れる。
ソースコード自体に改行を入れる訳ではない。
記号 / は文章の最初にも記載出来る。
文章の最後に入れた場合は通常の改行が行われるだけである。
シナリオのシナリオ名には使用できない。
コメント行に記載できるが、改行記号としての機能は持たない。
記号 / だけの行も記載可能で / の個数だけ改行して表示を行う。
例(sample11.7th)
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
//
ほかの大学からも男の子達が大勢きましたが、/知らない男の子達ばかりでした。
end
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きましたが、
知らない男の子達ばかりでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
- 行末改行の禁止
シナリオを表示するとき、行末では自動的に改行が挿入されて表示される。
行末での改行を行わないようにするには、行末に記号 - を追加する。
例(sample12.7th)
title お花見に行く
今日は、クラブのみんなとお花見に行きました。
ほかの大学からも男の子達が大勢きましたが、-
知らない男の子達ばかりでした。
end
記号\ を使用した場合は、ソースコードが1行に連結されるが、
- を使用した場合は、ソースコードを連結することはなく、
表示を行うときに、改行を行わないだけである。
記号\ は、シナリオの最終行に記述できないが、
- を使用した場合は、最終行に記述出来る。
例 最終行に記号\ を記述して文法エラーになる場合。
title お花見に行く
{クラブのみんなとお花見に行く}
{男の子が大勢来る}
end
scene クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
男の子が数人、場所取りをして私たちを待っていました。
しばらく待っていると、\
end
scene 男の子が大勢来る
ほかの大学からも男の子達が大勢きました。
end
この場合は\ 記号によりテキスト文が連結され
しばらく待っていると、end
となり、文法エラーとなる。
例 最終行に記号- を記述する場合。(sample13.7th)
title お花見に行く
{クラブのみんなとお花見に行く}
{男の子が大勢来る}
end
scene クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
男の子が数人、場所取りをして私たちを待っていました。
しばらく待っていると、-
end
scene 男の子が大勢来る
ほかの大学からも男の子達が大勢きました。
end
は次のように表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
男の子が数人、場所取りをして私たちを待っていました。
しばらく待っていると、ほかの大学からも男の子達が大勢きました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
記号- は上記の例の様にシナリオにまたがって、改行コードの挿入制御を行うことができるので、
記号\ とは異なる使い方が出来る。
記号- に続くシナリオが
{章番号}
{段落}
の場合は改行挿入禁止は行わず、自動的に改行される。
例(sample14.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。-
{段落}
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
男の子が数人、場所取りをして私たちを待っていました。-
{章番号}
しばらく待っていると、ほかの大学からも男の子達が大勢きました。
end
- 記号が先頭にある場合は以降の制御文字が無効となる
例(sample15.7th)
scene クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
-/////-
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
end
の様な場合は改行は行われない、またその他の制御文字も無効となりそのまま表示される
また記号- は記号()と組み合わせてより複雑な制御ができる。
例
scene クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
男の子が数人、場所取りをして私たちを待っていました。
(待っていると、-|買い物をしていた女の子達も戻ってきました。)
end
また改行禁止を行うか行わないかの選択を行う、次のようなテキストも記述できる。
scene クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
男の子が数人、場所取りをして私たちを待っていました。
待っていると、(-|)
end
- 記号 \ / - の複雑な組み合わせ
記号 \ / - については複雑な組み合わせも可能であるが、なかには意味を持たない記述もある。いろいろな組み合わせについて解説しておこう。
/\の例(sample16.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、/\
東京の桜と言ってそんなに珍しくはありませんでした。
end
は次の記述と同等である。
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、/東京の桜と言ってそんなに珍しくはありませんでした。
end
したがって次の様に表示される
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
\/の例(sample17.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、\/
東京の桜と言ってそんなに珍しくはありませんでした。
end
は記号\が行末にないので無視され、記号/が行末にあるので次のように表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、\
東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
/-の例(sample18.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、/-
東京の桜と言ってそんなに珍しくはありませんでした。
end
は改行の挿入と、改行の禁止を同時に行っているので、以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
-/の例(sample19.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、-/
東京の桜と言ってそんなに珍しくはありませんでした。
end
は-記号が行末にないので無視され、以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、-
東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
-\の例(sample20.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、-\
東京の桜と言ってそんなに珍しくはありませんでした。
end
は\記号によって行が連結され、-記号が行末ではないので無視され以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、-東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
\-の例(sample21.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。\-
桜は郷里で見慣れていたので、東京の桜と言ってそんなに珍しくはありませんでした。
end
は\記号が行末ではないので無視され以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、\東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
記号 / - の組み合わせの特殊な場合
記号 / - の組み合わせについては特殊な場合がありこのれらについても解説しておく。
例 改行挿入/のみの行との組み合わせ
例1(sample22.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。-
///
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。
end
については-の行の行末の改行が行われないため、改行が一つ少なくなり、以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。今日は、クラブのみんなとお花見に行きました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
例2(sample23.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。-
/
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。
end
については同様に、以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
例3(sample24.7th)
title クラブのみんなとお花見に行く
今日は、クラブのみんなとお花見に行きました。
//-
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。
end
については改行のみの行は表示するメッセージがないため、メッセージ末の改行も行われない。
したがって-は意味を持たずに無視され以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
今日は、クラブのみんなとお花見に行きました。
桜は郷里で見慣れていたので、
東京の桜と言ってそんなに珍しくはありませんでした。今日は、クラブのみんなとお花見に行きました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
シナリオの分岐
複数のシナリオのどれかを選択して用いたい時は分岐を用いる。
分岐はselectで始まり、選択するシナリオのリストの一覧のあと、
endで終わる。
分岐の呼び出しはシナリオの呼び出しと同様に
{分岐名}
で行う。
分岐とシナリオは文法上は同じ形式で呼び出すことが出来る。
分岐を呼び出すと実行後はシナリオと同様に呼び出し元に戻る。
例(sample25.7th)
title 合コンでお酒を飲む
{合コンに誘われる理由}
遅くまでお酒を飲んだので帰りが遅くなりました
end
select 合コンに誘われる理由
お花見に誘われる
忘年会に誘われる
end
scene お花見に誘われる
春になって、お花見に誘われました
end
scene 忘年会に誘われる
年末になって、教室の忘年会に誘われました
end
と記載すると
-------------- 七度文庫 (なのたびぶんこ) -------------
春になって、お花見に誘われました
遅くまでお酒を飲んだので帰りが遅くなりました
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
-------------- 七度文庫 (なのたびぶんこ) -------------
年末になって、教室の忘年会に誘われました
遅くまでお酒を飲んだので帰りが遅くなりました
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
の二通りの文章が生成される。
誤った例
分岐文では
分岐が空の文は記述できない。
例
select 合コンに誘われる理由
end
また次の例は文法エラーであるので
select 合コンに誘われる理由
{お花見に誘われる}
{忘年会に誘われる}
end
と記載しないように注意すること。
{}記号の記載は不要である。
プログラムの構造
七度言語には終了命令はない。
titleで始まるシナリオの最初の文章から始まり、title内の最後の文章で終わる
sceneとselectで記述されるシナリオや、分岐を呼び出した時は、
表示が終わった場合は必ず呼び出し元に制御が戻る。
シナリオは、他のシナリオや、分岐を呼び出すことができる。
分岐は、分岐の対象として、シナリオと分岐を呼び出せる。
シナリオと分岐を組み合わせて階層構造を作ることができる。
特定のラベルへのジャンプ命令はない。
ループ命令はない。
表示がループしたときは、表示は強制終了する
七度言語で可能なのは、シナリオと分岐からなる入れ子の構造だけである。
文字変数の定義
七度言語では文字変数を使用出来る。
文字変数名には全角文字を用いる。
文字変数は階層構造をもたせるために変数名にピリオド . を用いることができる。
例(sample26.7th)
title 入学式で女友達と知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
[女友達=礼子さん]
女の子は[女友達]という名前で、素敵なワンピースを着ていました。
end
というシナリオは以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は礼子さんという名前で、素敵なワンピースを着ていました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
変数名は女友達であり
[女友達=礼子さん]
は女友達という変数に礼子さんという値を代入することを意味する。
この文章は、代入を指示するだけなので、実際には表示されることはない。
[女友達]と、変数を[]でくくると、変数の値を表示する。
変数は最初の代入文で自動的に定義されるので、前もって宣言文などで宣言する必要はない。
代入文には
[女友達=]
との書式も可能で、この場合はNULL文字列を代入することを意味する。
変数の値がNULL文字列であることと、変数が未定義であることは、同等の事として扱われる。
変数が未定義またはNULL文字列であるときは変数の表示は、変数名の文字が用いられる。
例(sample27.7th)
title 女友達と喫茶店にはいる
私は[女友達]と、入学式のあと喫茶店でお茶を飲みました。
end
というシナリオは[女友達]が未定義なので以下の様に表示される。
-------------- 七度文庫 (なのたびぶんこ) -------------
私は女友達と、入学式のあと喫茶店でお茶を飲みました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
文字変数の代入における()|記号の使用
文字変数を代入するときには、()|記号を用いることができる。
例
[女友達=礼子さん|芳恵さん]
[女友達=(礼子さん|芳恵さん)]
上記の二つの例は異なる意味を持つ。
一番外側の()を省略した場合には()|についての処理は、
変数の代入時に行われる。
例(sample28.7th)
title 女友達と喫茶店にはいる
[女友達=礼子さん|芳恵さん]
私は[女友達]と、入学式のあと喫茶店でお茶を飲みました。
end
一番外側に()付けた場合はには()|についての処理は、
変数の表示時に行われる。
例(sample29.7th)
title 女友達と喫茶店にはいる
入学式は午前中で終わりました。[女友達=(礼子さん|芳恵さん)]
私は[女友達]と、入学式のあと喫茶店でお茶を飲みました。
[女友達]が、「今日は暑いわね」といいながら上着を脱ぎました。
私はバニラシェイクを飲みたかったのですが[女友達]が勝手に「みんなコーヒーでいいわよね」といいながらコーヒーを注文してしまいました。
[女友達]が「授業始まるのはいつからかしらね」と言い出しました。
end
文字変数の表示回数カウンター
文字変数は、文章の一部として表示された回数を数えるカウンターを持っている
カウンターは最初に定義されたときには0の値を持つ
一度使用される度に+1される
カウンターを参照するには
$女友達
を用いる。数値$女友達は文章の文字としては表示できないが、後述する条件文で使用できる。
変数にnullを代入すると、表示カウンターは0にリセットされる。
数値変数の定義
七度言語では数値変数を使用出来る。
プログラム内部では倍精度実数で保存される。
単精度実数、整数、倍精度整数などの変数の区別はないので、
すべて倍精度実数として扱う。
数値変数名は先頭文字が半角の%で始まり残りの文字は全角文字を用いる。
数値変数は階層構造をもたせるために変数名にピリオド . を用いることができる。
数値変数の代入を行うには
[%女友達の年齢=21]
などと記述する。
文章の文字として表示するときは
[%女友達]
と記載する。
数値変数はC言語と同様の演算が可能で
[%女友達の年齢++]
[%女友達の年齢--]
[%女友達の年齢+=10]
[%女友達の年齢-=10]
などの演算がが記述出来る。
数値変数には表示回数のカウンターはない。
例(sample30.7th)
title 女友達の年齢
[%女友達の年齢=18]
女友達は[%女友達の年齢]歳です。
[%女友達の年齢++]
一年後は[%女友達の年齢]歳です。
[%先輩の年齢=20]
先輩は[%先輩の年齢]歳です。
[%先輩の年齢--]
一年前は[%先輩の年齢]歳でした。
end
例(sample31.7th)
title 女友達の年齢
[%女友達の年齢=18]
女友達は[%女友達の年齢]歳です。
[%女友達の年齢+=10]
十年後は[%女友達の年齢]歳です。
[%先輩の年齢=20]
先輩は[%先輩の年齢]歳です。
[%先輩の年齢-=10]
十年前は[%先輩の年齢]歳でした。
end
変数の代入、表示と、メッセージ文
変数の代入と、表示メッセージは一行に混在できる。
例(sample32.7th)
title 入学式で女友達と知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子[女友達=礼子さん]は[女友達]という名前で、素敵なワンピースを着ていました。
end
また一行で同一の変数に異なる値を代入することも出来る。
例(sample33.7th)
title 入学式で女友達と知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子[女友達=礼子さん]は[女友達]という名前で、[女友達=芳恵さん]一緒に来た[女友達]を紹介してくれました。
end
変数の代入と表示は、文頭から文末の順に処理される。
変数の代入、表示と、()|記号の組み合わせ
()|記号と変数の代入を組み合わせて使用する場合、注意が必要となる
例(sample34.7th)
title 入学式で女友達と知り合う
式が終わると隣の女の子[女友達=礼子さん|芳恵さん]が話しかけてきました。|私の隣には、見かけたことるある女の子[女友達=礼子さん|芳恵さん]が座っていました。
女の子は[女友達]で入学試験の時隣だったのを思い出しました。
end
というシナリオの場合は、最初に変数の代入内の()|記号を除外して()|記号についての処理を行い、次に変数の代入についての処理を文頭から文末方向に行う。
変数の代入についての|記号は変数の代入についてのみ有効となる。
したがって、上記はのメッセージはいったん
式が終わると隣の女の子[女友達=礼子さん|芳恵さん]が話しかけてきました。
私の隣には、見かけたことるある女の子[女友達=礼子さん|芳恵さん]が座っていました。
のいずれかに展開されてから、変数の代入が行われる
変数によるメッセージ文の制御
変数の値による条件文を作成して、メッセージ文の表示を制御できる
例(sample35.7th)
title 入学式で礼子さんと知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
[女友達=礼子さん]
{女友達の様子}
end
scene 女友達の様子
女の子は[女友達]という名前で、<女友達==礼子さん>素敵なワンピースを<女友達==芳恵さん>紺のスーツを;着ていました。
end
は次のように文章が生成される
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は礼子さんという名前で、素敵なワンピースを着ていました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
条件式<女友達==礼子さん>が正の時は条件式に続くテキスト文章が表示される。
次の条件式<女友達==芳恵さん>まで表示を行った後、条件式の正誤が再度判定される
;記号は条件式の解除を意味する。
次の例(sample36.7th)の場合は
title 入学式で芳恵さんと知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
[女友達=芳恵さん]
{女友達の様子}
end
次のように文章が生成される
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は芳恵さんという名前で、紺のスーツを着ていました
(完)----------- Copy Right 七度 柚希 (なのたび ゆき)--------
また次のようなより複雑な構文も可能である。
例(sample37.7th)
scene 女友達の様子
女の子は[女友達]という名前で、(<女友達==礼子さん>素敵なワンピースを<女友達==芳恵さん>紺のスーツを;着ていました。|<女友達==礼子さん>甲府の出身<女友達==芳恵さん>高校はこの近所;だそうでした。)
end
この場合は生成されるのは<女友達==礼子さん>が正の時は、先ほどの例
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は礼子さんという名前で、素敵なワンピースを着ていました
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
ともう一つ次の文章のどちらかがランダムに生成される
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました
女の子は礼子さんという名前で、甲府の出身だそうでした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
メッセージの表示の手順は
最初に()についての表示の選択を行う。
文章の先頭から順に文字変数の代入と、条件式についての表示の選択を行う、
となるので
順に経過をたどると、<女友達==礼子さん>が正の時は
最初のテキスト
女の子は[女友達]という名前で、(<女友達==礼子さん>素敵なワンピースを<女友達==芳恵さん>紺のスーツを;着ていました。|<女友達==礼子さん>甲府の出身<女友達==芳恵さん>高校はこの近所;だそうでした。)
は次の2通りのテキストのどちらかに変換される
女の子は[女友達]という名前で、<女友達==礼子さん>素敵なワンピースを<女友達==芳恵さん>紺のスーツを;着ていました。
女の子は[女友達]という名前で、<女友達==礼子さん>甲府の出身<女友達==芳恵さん>高校はこの近所;だそうでした。
さらに条件式の判定が行われる。
文字変数は条件判定と同時に文章の先頭から順に書き換えられて最終的には
女の子は礼子さんという名前で、素敵なワンピースを着ていました。
女の子は礼子さんという名前で、甲府の出身だそうでした。
のいずれかが表示されることになる。
変数によるシナリオの制御
変数の値による条件文を作成して、シナリオを制御できる
例(sample38.7th)
title 入学式で女友達と知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
{女友達と知り合う場合}
{<女友達==礼子さん>礼子さんのマンションに寄る<女友達==芳恵さん>芳恵さんのアパートに寄る;自分のアパートに帰る}
end
select 女友達と知り合う場合
礼子さんと知り合う
芳恵さんと知り合う
end
scene 礼子さんと知り合う
[女友達=礼子さん]
女の子は[女友達]という名前で、素敵なワンピースを着ていました。
end
scene 芳恵さんと知り合う
[女友達=芳恵さん]女の子は[女友達]という名前で、紺のスーツを着ていました。
end
scene 礼子さんのマンションに寄る
私は大学からの帰りに[女友達]のマンションに寄りました。
お母様と一緒に選んだマンションで、入り口には警備の部屋もありずいぶんと立派でした。
end
scene 芳恵さんのアパートに寄る
私は大学からの帰りに[女友達]のアパートに寄りました。
[女友達]のアパートは私の借りたアパートの近くで、大学生の女の子が多いとの話でした。
end
scene 自分のアパートに帰る
入学式も終わると、私はアパートに帰って部屋の掃除をしました。
end
上記の<女友達==礼子さん>と<女友達==芳恵さん>が条件文である。
<女友達==礼子さん>は変数である女友達の内容が礼子さんであるとき、
それに続くシナリオを実行することを示す。
;はデフォルトのシナリオであり、前に続く条件文のいずれもが誤であるとき実行される
生成される文章は分岐の選択肢により次の二つになる。
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は礼子さんという名前で、素敵なワンピースを着ていました。
私は大学からの帰りにの礼子さんマンションに寄りました。
お母様と一緒に選んだマンションで、入り口には警備の部屋もありずいぶんと立派でした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は芳恵さんという名前で、紺のスーツを着ていました。
私は大学からの帰りに芳恵さんのアパートに寄りました。
芳恵さんのアパートは私の借りたアパートの近くで、大学生の女の子が多いとの話でした。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
条件式は文字変数については
<女友達==礼子さん>
<女友達!=礼子さん>
<女友達==>
<女友達!=>
の書式が可能である
<女友達==>
はNULL文字列との比較を意味するので
変数女友達がまだ未定義であるとき正となる。
<女友達!=>は、
変数女友達が定義済みであるとき正となる。
数値変数と文字変数のカウンターについては
<%女友達の年齢==22>
<%女友達の年齢!=22>
<%女友達の年齢<=22>
<%女友達の年齢>=22>
などが可能である。
変数による分岐の制御
変数の値による条件文を作成して、分岐文を制御できる
シナリオ
礼子さんのマンションに寄る
芳恵さんのアパートに寄る
自分のアパートに帰る
については全章の記述を用いることにする
例(sample39.7th)
title 入学式で女友達と知り合う
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
{女友達と知り合う場合}
{入学式のあとの場合}
end
select 入学式のあとの場合
<女友達==礼子さん>礼子さんのマンションに寄る
<女友達==芳恵さん>芳恵さんのアパートに寄る
自分のアパートに帰る
end
条件<女友達==礼子さん><女友達==芳恵さん>が正の場合のみ分岐が可能になる。
条件が指定されないシナリオと、条件が正のものの中からランダムに選択が行われる
条件が正のものが優先的に選択されるわけではいので、
この場合は自分のアパートに帰るというシナリオが選択される場合もある。
分岐によおいて条件設定を行う場合は前章で示したシナリオの場合よりも、
高度な設定が可能になる。
例えば(sample40.7th)
select 入学式のあとの場合
<女友達==礼子さん>礼子さんのマンションに寄る
<女友達==礼子さん>礼子さんと喫茶店でお茶を飲む
<女友達==芳恵さん>芳恵さんのアパートに寄る
<女友達==芳恵さん>芳恵さんと近所のスーパーに買い物に行く
自分のアパートに帰る
近所のスーパーに買い物に行く
end
などの複雑な分岐の制御が可能になる。
(注シナリオ
礼子さんと喫茶店でお茶を飲む
芳恵さんと近所のスーパーに買い物に行く
近所のスーパーに買い物に行く
については別途定義されているとする。)
上記の分岐では、
<女友達==礼子さん>が成り立つときは
select 入学式のあとの場合
礼子さんのマンションに寄る
礼子さんと喫茶店でお茶を飲む
自分のアパートに帰る
近所のスーパーに買い物に行く
end
という分岐文と同じ分岐を行う
また
<女友達==芳恵さん>が成り立つときは
select 入学式のあとの場合
芳恵さんのアパートに寄る
芳恵さんと近所のスーパーに買い物に行く
自分のアパートに帰る
近所のスーパーに買い物に行く
end
という分岐文と同じ分岐を行う
変数女友達が未定義の場合は
select 入学式のあとの場合
自分のアパートに帰る
近所のスーパーに買い物に行く
end
と同じ分岐を行う。
シナリオの実行禁止
文章を生成させたくないシナリオを実行禁止に出来る
例(sample41.7th)
title 入学式で女友達と知り合う
{!礼子さんと知り合う}
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
{礼子さんと知り合う}
{芳恵さんと知り合う}
end
と記述したときは!が実行禁止を指示する記号であり
礼子さんと知り合うというシナリオが実行禁止になる。
生成される文章は
-------------- 七度文庫 (なのたびぶんこ) -------------
入学式が終わると、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
女の子は芳恵さんという名前で、紺のスーツを着ていました。
(完)
----------- Copy Right 七度 柚希 (なのたび ゆき)--------
となる。実行禁止の解除は
{#礼子さんと知り合う}
と記述する
#が実行禁止の解除を指定する記号である。
分岐における優先度の指定
分岐の際に選択されるシナリオの優先度を上げたい場合は優先度を一つあげるコマンドを用いる
例(sample42.7th)
title 入学式で女友達と知り合う
入学式の時、入学試験のとき隣の席だった女の子が私を見つけて声をかけてきました。
{&+自分のアパートに帰る}
{入学式のあとの場合}
end
select 入学式のあとの場合
礼子さんのマンションに寄る
礼子さんと喫茶店でお茶を飲む
自分のアパートに帰る
近所のスーパーに買い物に行く
end
とした場合は自分のアパートに帰るの
優先度があがり優先的に分岐の選択が行われる。
優先度は初期値は0でありコマンドを一回実行するたびに+1される。
一度あげた優先度を下げるには
{&-自分のアパートに帰る}
と指定する。
ただし優先度は0より小さい値に下げることはできない。
選択したくないシナリオは先の実行禁止コマンドで
{!自分のアパートに帰る}
と実行禁止にすれば分岐で選択されることはない。
小説の更新を行った時のフラグの設定
更新のコマンドを実行すると、小説が再度生成される。
このとき、シナリオの禁止フラグや、優先度などはすべて初期値に設定される。
前回の小説生成時に設定された、禁止フラグや、優先度の指定を次回の生成に引き継がせることはできない。
小説の生成を繰り返し行った時の分岐の制御
分岐の選択を実行する際には
実行禁止の指定があれば除外する。
条件が指定されているときは、条件がなりたつものだけを選ぶ
優先度のもっとも高いものを選択する。
優先度の高いものが複数あれば、乱数により選択するシナリオを決める。
という手順で、分岐の選択を決定する。
しかし乱数による選択を行った場合は、選択に偏りがでて、
同じシナリオが繰り返し選択されたり、また特定のシナリオがまったく選択されないという状況が発生することがよくある。
せっかく用意したシナリオでも1000回小説の生成を繰り返しても、表示されないというのは事になっいては都合が悪い。
そこで、シナリオごとにカウンターを持ち、表示された回数をカウントしている。
分岐にも同様に同じカウンターがある。
カウンターの値は、プログラム終了時に
7thnovels.dat
というファイルに保存される。
このファイルをのエディターであけてみると
132 59
0 59
0 59
0 59
0 59
132 59
0 59
0 59
0 59
0 59
0 59
0 59
132 59
3 59
2 59
3 59
2 59
1 59
といったテキストファイルが延々と続く
最初の一列目が、シナリオの表示された回数であり、
2列目の値は、将来の拡張用であり、現在はプログラムが起動された回数が入っている。
インターネットで公開されている制限バージョンでは
4429行のデータがあり、
シナリオと分岐の総数が4429個ということになる。
分岐の際にはこの値が低いものを優先的に選択する。
したがって、分岐の選択手順は
実行禁止の指定があれば除外する。
条件が指定されているときは、条件がなりたつものだけを選ぶ
優先度のもっとも高いものを選択する。
使用された回数の少ないシナリオを選択する。
使用された回数が同じものがあれば、乱数により選択するシナリオを決める。
ということになる。
将来の拡張
将来の拡張機能として以下の項目を予定している
シナリオ呼び出し時の、呼び出しパラメータの指定を可能とする
例
title
{女友達と飲食店に行く}[女友達=礼子さん][飲食店=喫茶店]
end
scene 女友達と飲食店に行く
私は[女友達]と[飲食店]に寄ることにしました。
end
文字変数に集合を可能にする
例
title 入学式に出る
[服装=ブラウス+セータ+スカート]
{セーターを脱ぐ}
end
scene セーターを脱ぐ
暑かったのでセーター脱ぎました。
[服装-=セータ]
end
文字変数の階層構造の操作を可能にして不定形データベースの機能を強化する