見出し画像

演劇論と計算論② シナリオとソースコード

前回は「演じること」と「計算すること」の構造を見比べながら、簡単な図式化を試みました。下は前回の記事です。

役者がキャラクターを演じる。
コンピュータがプログラムを実行する(計算する)。

似ているような、似ていないような、よくわからないような。

シナリオ

ところで、映画などで役者さんが演技をするとき、役者さんの判断で好きなキャラを演じるわけではないですよね。映画でもドラマでも舞台でも、必ずといっていいほど脚本(シナリオ)があります。いわば物語の設計図です。役者さんはシナリオに書いてあるセリフを喋ったりアクションをすることによって、物語の中のキャラクターを演じます。映画の脚本だと、例えばこんな感じでしょうか。

◯生徒会室

長机を囲み、副会長と書記、そして小池が座っている。

書記「ていうか、なんで生徒会で演劇やるわけ?会長にバレたらまずいと思うけど」
小池「いいじゃないですか。絶対面白いっすよ」
副会長「うん。それに学校を盛り上げるのも生徒会の大事な仕事だからね」
書記「それなら演劇部に任せたほうが……」
小池「さすが副会長、わかってる!じゃあ早速練習しましょうよ」
副会長「オッケー。ちょっとドア閉めてくるね」

副会長、立ち上がり、生徒会室のドアを閉める。

ちなみに業界や使われる場面によって脚本、シナリオ、スクリプト、台本など呼び方が多少変わると思うのですが、「物語の設計図」ということが分かればいいので、とりあえず「シナリオ」で統一したいと思います。

役者が、シナリオを解釈して、キャラクターを演じる。

ソースコード

さて、こんな感じの画面を見たことはないでしょうか。

package main

import (
	"fmt"
	"io"
	"log"
	"net"
	"net/http"
	"os"
)

func main() {
	http.HandleFunc("/hello", func(w http.ResponseWriter, r *http.Request) {
		fmt.Fprint(w, "Hello, playground")
	})

	log.Println("Starting server...")
	l, err := net.Listen("tcp", "localhost:8080")
	if err != nil {
		log.Fatal(err)
	}
	go func() {
		log.Fatal(http.Serve(l, nil))
	}()

	log.Println("Sending request...")
	res, err := http.Get("http://localhost:8080/hello")
	if err != nil {
		log.Fatal(err)
	}

	log.Println("Reading response...")
	if _, err := io.Copy(os.Stdout, res.Body); err != nil {
		log.Fatal(err)
	}
}

これはとあるプログラムのソースコードです。プログラマとかハッカーがパソコンをカタカタして書いているやつですね。ちなみにこれはGo言語というプログラミング言語で書かれたソースコードです。Go言語の公式サイトから引用しました。

え?ソースコードってつまりプログラムのことじゃないの?別物なの?と思われた方。鋭いですね。このあたりが若干ややこしいので説明します。

プログラムをつくるのは人間です。なので、まずは人間が理解しやすい言葉で書く必要があります。上の例が果たして理解しやすいのかという気持ちになりますが、よく見てみると「import」とか「main」とか「print」とか、なんとなく意味のわかる英語が多いですし、実際、ある程度プログラミングをやったことのある人なら、このプログラムが何をしているのか、それなりにわかるんじゃないでしょうか。

しかし、残念なことに、コンピュータは人間の書いた言葉(ソースコード)をそのまま理解できません。コンピュータがプログラムを実行(計算)するときは、さっき人間が書いたソースコードをコンピュータがわかるように変換する必要があります。この変換作業のことをコンパイルといい、変換された、すなわちコンピュータが実行できる状態になったプログラムのことを実行ファイルなどと呼びます。今、この記事を見るために開いているWebブラウザ(Safari, Chromeなど)、そしてスマホならnoteアプリやTwitterなど、こうしたプログラム、アプリは基本的には実行ファイルです。プログラマが書いたソースコードではなく、コンピュータが実行できるように変換された実行ファイルが、あなたのパソコンやスマホにインストールされているのです。

コンピュータが、ソースコードを解釈して、プログラムを実行(計算)する。

「シナリオ=ソースコード」?

役者が、シナリオを解釈して、キャラクターを演じる。
コンピュータが、ソースコードを解釈して、プログラムを実行(計算)する。

構造が似ている気もするけど、でもやっぱり別物では……。
実は、ゲームにおいては、シナリオとソースコードがほぼ同じになるケースがあるのです。

こんなシナリオがあったとします。

◯写真部の部室

澪「部室の掃除、ですか?」
葵「うん、散らかってると危ないし、きれいな方がいいでしょ」
澪「(めんどくさいなぁ……)」
葵「なんか言った?」
澪「いえ、何も!」
葵「よし、じゃあやろうか。澪ちゃん、ほうき持ってきて」
澪「はーい」

澪、掃除用ロッカーを開ける。
するとロッカーの中には初音が。

澪「うぎゃあああああ!」
初音「うぎゃあああああ!」

尻餅をつく澪。

澪「……って、初音さん?」
初音「もう……びっくりするじゃない」
澪「こっちのセリフですよ!何やってるんですか!」
初音「たまに狭いところに入りたくなること、あるでしょ」
澪「ないですよ!」
葵「あはは……(こりゃだめだ)」

現在制作中の恋愛ゲーム「さくらいろプリズム」のヒロイン、葵(あおい)、澪(みお)、初音(はつね)の3人に寸劇をしてもらいました。ゲーム本編にこんなシーンはないです。

さて、ではこのシナリオをゲーム用に組み込むとどうなるか。

scene.set("部室")

mio.say("部室の掃除、ですか?")
aoi.say("うん、散らかってると危ないし、きれいな方がいいでしょ")
mio.say("(めんどくさいなぁ……)")
aoi.say("なんか言った?")
mio.say("いえ、何も!")
aoi.say("よし、じゃあやろうか。澪ちゃん、ほうき持ってきて")
mio.say("はーい")

# 以下略

実際に使用しているプログラミング言語(ゲームエンジン)とは異なる文法ですが、例えばこんなソースコードになるんじゃないかという例です。さっきの寸劇シナリオを読んだ後であれば、プログラミングの経験がない人でも、このソースコードが何を意図しているのかなんとなく想像がつくのではないでしょうか。

英語だからぱっと見、別物に見えるかもしれませんが、これが日本語だったらどうでしょう。

シーンを("部室")に設定

澪、("部室の掃除、ですか?")と言う
葵、("うん、散らかってると危ないし、きれいな方がいいでしょ")と言う
澪、("(めんどくさいなぁ……)")と言う
葵、("なんか言った?")と言う
澪、("いえ、何も!")と言う
葵、("よし、じゃあやろうか。澪ちゃん、ほうき持ってきて")と言う
澪、("はーい")と言う

# 以下略

カッコがやたらと多いことを除けば、ほぼシナリオと言っても問題なさそうです。

実際のゲームはこれよりももっとずっと複雑なコードで書かれていますが、会話劇中心のゲームであればシナリオとソースコードはそれなりに似ているんじゃないかと思います。

ちなみに勘の鋭い方は既にお気づきかもしれませんが、本連載「演劇論と計算論」のインスピレーションの一つがゲーム制作です。多くのゲームは物語や劇であると同時に、コンピュータ(とプレイヤー)が実行するプログラムです。一見、まったく無関係に見える二つの性質を自然に持ち合わせているという意味で、ゲームは他のメディア(映画、ドラマ、演劇、小説など)とは異なるように思われます。

もし興味があれば、ビデオゲームの芸術的側面を論じた本「ビデオゲームの美学」は非常にオススメです。かなり学術的な内容ですが、ビデオゲームのこうした特性についてとても丁寧に論じられています。

次回予告

シナリオがあって、
役者がいて、
キャラクターが生まれる。

……ん?

その「シナリオ」を書いたのは一体誰?
っていうか、ここはどこ!?

次回、「虚構世界と仮想OS」。
この次も、サービスサービスぅ!

この記事が気に入ったらサポートをしてみませんか?