ルールズ・オブ・プレイ(上) ゲームデザインの基礎

※ この記事は CA14 Advent Calendar 2013 - Adventar の4日目の記事です。

アドベントカレンダー

そういえば今年はアドベントカレンダーを書く予定ないなと思っていたところに、 関西の人たちが面白そうな企画を立ち上げていたのを見つけて 即座に参加しちゃいました。 本当はもう少し後の方に入れてゆっくり書きたかったけど、 関東からも負けずに発信していくよ! わいわい。

おすすめ本

ルールズ・オブ・プレイ(上) ゲームデザインの基礎

ルールズ・オブ・プレイ(上) ゲームデザインの基礎

この本との出会い

ゲームに関する面白い本でも見に行くかなと ふらっと丸善ジュンク堂に入ったが最後

ものの5分で4000円飛びました。

こわいお店だ。

この本を選んだ理由

自分は物を作る側の人間なので、本、漫画、ゲーム、イラスト、どんな作品でも 見た瞬間に新しい発想、インスピレーションが浮かぶ 自分の想像力を働かせるような作品が自分にとっての良い作品だと感じます。

本書はどこから読んでも1ページごとにアイデアが浮かんでくるので、 自分や、ゲームを作る人にとって最高の一冊であるだろうという点、 そして、内容もゲームを作る上で避けて通れないルール、システムの設計の話である点から、 ゲームを作ることに興味を持っているひとや、既に作っている人、 これから作ることになるだろう人が多いだろう、 CA14に紹介したいおすすめの本として選びました。

ゲームデザインとは

会話の中で何気なく「ゲームデザイナー」と言う単語を使ったら 「ゲームのグラフィックを描くの?」みたいな顔をされたことがあったので まず「ゲームデザイン」という言葉について説明します。

デザインは問題解決、アートは自己表現と言われるように デザインは芸術的な意味を含んでいても、本来設計に近い意味で、 論理的に説明できるものです。

日本でデザイナーというと、主にグラフィックデザインや家具、服飾、工業デザインをする人を指すけれど、 デザインはあらゆる分野に関わるものであるため、 広義でのデザインの対象は都市計画や人生にまで及び、 それらはアーバンデザイン、ランドスケープデザイン、キャリアデザイン等と呼ばれるなど、 表面上にとどまらない、問題解決のために概念を組み立て、それを表現すること全てを指しています。

ゲームデザインは、ゲームに関するデザイン、 すなわち、パラメータの変動や判定計算式の設計等、画面に現れない要素も含め ゲームで遊ぶ人の経験を生み出すルールやシステムをデザインすることを指していて、 それを行う人をゲームデザイナーと呼びます。

実際には専任のゲームデザイナーというポジションはあまり置かれず、 プランナーかプログラマーが兼任することが多いようです。

本書について

本書はゲームデザインのカバーする分野についての教科書のような一冊で まだ新しい分野であるゲーム研究を学問として扱うために、 本書の一部では既存の研究分野の手法を取り入れたり、 ワークショップや講義の教材に使えるよう、読書案内やゲームデザイン演習などにも ページが割かれています。

目次

  • 第1章 この本について
  • 第2章 デザインの進め方

ユニット1:核となる概念

  • 第3章 意味ある遊び
  • 第4章 デザイン
  • 第5章 システム
  • 第6章 インタラクティヴィティ
  • 第7章 ゲームを定義する
  • 第8章 ディジタルゲームを定義する
  • 第9章 魔法円
  • 第10章 主要図式

ユニット2:ルール

  • 第11章 ルールを定義する
  • 第12章 三つの水準のルール
  • 第13章 ディジタルゲームのルール
  • 第14章 創発システムとしてのゲーム
  • 第15章 不確かさのシステムとしてのゲーム
  • 第16章 情報理論システムとしてのゲーム
  • 第17章 情報システムとしてのゲーム
  • 第18章 サイバネティックシステムとしてのゲーム
  • 第19章 ゲーム理論としてのゲーム
  • 第20章 対立のシステムとしてのゲーム
  • 第21章 ルールを破るということ"

上巻である本書は、「核となる概念」、「ルール」の大きく2つのユニットに分かれ、

核となる概念のユニットはまず、「意味のある遊び」の章から始まり、 それと密接に繋がりのある概念である、一般的な意味の 「デザイン」「システム」「インタラクティヴィティ」の解説にそれぞれ一章を割いています。 そしてそこから「ゲームの定義」、「デジタルゲームの定義」に移り、 現実から切り離されたゲームの中の世界を指す「魔法円(マジックサークル)」の考え方、 そこから本書(上下巻)で捉えるゲームの「主要図式」であるルール・遊び・文化の解説で締めくくられます。

ルールのユニットの12章、「3つの水準のルール」とは ・構成のルール ・操作のルール ・暗黙のルール のことで、操作のルールが一般的に解説書やルールブックに書かれているものになります。 構成のルールはルールの数学的構造で、例えばプレイヤーが得点の個数のチップを獲得することと、 得点の数字が書かれているマスに駒を進めることは本質的に同じ行為とされます。 暗黙のルールはプレイヤーは現実的な時間でターンを終わらせる、ゲームのプレイ環境等の制約など、明文化されないエチケット等を含む物を指します。

その後の章では、さまざまな分野からゲームのルールを捉え、 最後にはルールを破るということについて書かれています。

読み方

例えばルールの定義の章を読んでみても、 単純なゲームでも多くのルールから構成されていることが分かるけれども、 普段意識しない部分のルールをあえてゲームに利用してみたり、 それによってゲーム性がどう変わるのか試したりと、色々発想が広がるので、

章ごと、もしくは適当に開いたところからしばらく読み、 ゲームについてのインスピレーションを得て 手を動かすのが良いと思います!

下巻について

上巻のユニットでは「核となる概念」「ルール」について書かれていたけれども、 下巻のユニットはデザインの表現に当たる「遊び」と「文化」について書かれていて、 上巻より社会的な側面が強くなっています。

「人はなぜ遊びにハマるのか」 というのも面白いテーマだけれども、下巻はゲームとしてカバーしている範囲が広く、 上巻を読んだ時に感じた、どのページを読んでも即座にゲームのアイデアのインスピレーションが浮かんでくる感動は得られなかったので、今回は上巻の紹介としました。

ゲームの捉え方の幅を広げ、ゲーム作りに関する新しい知見を得たいという時には 下巻もおすすめします。

ゲームAIセミナーで話してきました

11/6 (水)にIGDA日本 SIG-AI ゲームAIコンテストセミナーに参加してきました。
http://kokucheese.com/event/index/122775/

内容はJavaチャレンジ、CEDEC「ゲームAIプログラミングコンテスト」、情報処理学会「SamurAI Coding」など、国内で開催したAI Gameコンテストの事例の紹介で、

自分もそれぞれの開発に携わり、特にJavaChallenge2012, CEDEC2013 AI Challengeではゲームデザインに関わったため、その件について話す機会をいただきました。

内容はJavaChallenge2012
http://d.hatena.ne.jp/w125/20121222/1356191128
とCEDEC2013 AI-Challengeの話


629の話

6/28

数字に興味がある人なら6月28日という日付を見て気付くでしょう。

円周率の2倍だ!

2πのことをτ(タウ)と言うらしい
また、6も28も完全数なので、完全数の日でもある

↑日付が過ぎてから気付く。

じゃあ6/29にはどんな日なの?ということで調べてみた。

629

まず素因数分解してみる。

629 = 17 * 37

素因数が2つの半素数ですね。

次に調べる
wikipedia:629
600 (number) - Wikipedia, the free encyclopedia
629 - Wolfram|Alpha

629はハーシャッド数、高度逆トーティエント数であり、正整数の2乗の和の形で2通りに表すことができ、629の2乗も正整数の2乗の和の形で2通りに表すことができる数、らしい。

ハーシャッド数は各位の桁の数の和が元の数の約数になっている数のこと。
629だと6+2+9=17で、確かにさっき素因数分解した数が出てきている。ハーシャッド数自体はありふれているけれども、それを割った値も素数になる強いハーシャッド数(strong Harshad number) *1でもあるようだ

629がハーシャッド数かどうかにはあまり興味がないけれども、初めて階乗がハーシャッド数でない数になるのは432!の階乗の時だということ、10進数で21個以上連続するハーシャッド数が存在しないことが証明されていること、20個連続する最小の組が10^44363342786を超えるところに存在することなど、Wikipediaのハーシャッド数の項目*2 *3に色々興味深いことが書いてあった。進数に依存したつまらない特徴かとハーシャッド数をなめてた。

高度逆トーティエント数は聞いたことがなかったけれども逆トーティエント数とはトーティエント数φ(n)をnから引いたものn-φ(n)のことらしい。629は21番目の高度逆トーティエント数らしいけれどもこれも個人的にはどうでもいい。

2乗の和で2通りに表される数もありふれてる気がする。他の特徴を調べてみよう。

オンライン整数大辞典より
629 - OEIS

面白い数列も面白くない数列も合わせて70ページ以上引っ掛かった。さすが。
7ページ目ぐらいまで読んだところで面白そうなものを発見
A001169 - OEIS

Number of board-pile polyominoes with n cells.

ここから本題

どうやら、この項目の7番目が629らしい。つまり
629 is "Number of board-pile polyominoes with 7 cells. "

polyominoとは大きさ1x1のタイルを辺を接するようにいくつか並べたものの総称で、それが2つならばドミノ、3つならばトリミノ、4つならばテトロミノであり、これはテトリスのブロックに相当する。
例えばテトリスのブロックの場合、全部で19種類、回転して同じになるものを1つと見ると7種類、反転して同じになるものを1つと見ると5種類存在する。

7種類の場合heptominoなので書き換えると
629 is "Number of board-pile heptominoes"
となる。ではboard-pileとはなんなのか

直訳すると「堆積する」とかになる専門用語らしく、
棒を積み上げて出来るpolyominoを表しているようです。
具体的には横に見た時に、タイルが分断していない、一本の直線になっているものを指す。

例えばこういうものは、board-pile。

これはダメ

この方向だとオッケーなので、回転方向に依存する定義である。

board-pileはhorizontally convex(水平方向に凸)とも書かれるらしい。

そんなboard-pile heptominoが629個あるらしい。書き出してみよう。

Mac用にいいドット絵ツールないかなー、
Pixenというのが良いらしいのかー...
ぽちぽち...

うーん... (37/629)

... 飽きた。(50/629)

まず手作業でひたすらやってみて飽きたらプログラムというのはプログラミングのありがたみを知るために必ず経るステップなのか、気合いの見積もりが下手なだけなのか。コードを書く合間にドットの方も増やしたり最終的に83個手打ちしたらしい。

ソースコード

解説
例えば底辺が3だとしたら、まず3つ横に並べて、その上に4つのポリオミノを1つずつずらしていくイメージ。
個数が漸化式で
a(n) = 5*a_(n-1) - 7*a_(n-2) + 4*a_(n-3) for n >= 5.
と書けるように、動的計画法で生成している。

misc/js/heptomino/board_pile.coffee at master · wand125/misc · GitHub

画像

ジョマンダは12行目の12番目にあるらしい。綺麗に出力できて満足。

という記事を6月29日中に更新したかったけど気付けば7月になっていた。

*1: strong Harshad number> http://projecteuler.net/problem=387

*2: これはむしろ詳しく知るために出典が欲しい http://ja.wikipedia.org/wiki/%E3%83%8F%E3%83%BC%E3%82%B7%E3%83%A3%E3%83%83%E3%83%89%E6%95%B0

*3: 連続するハーシャッド数のソースはこれ、読んでない。 http://www.fq.math.ca/Scanned/32-2/grundman.pdf

ドミニオン日本選手権で最下位卓に居た話

ドミニオン日本選手権、予選午後の部に参加しました。

試合結果と主な反省点について。

目標

  • 自分のプレーをする
    • サプライをみた段階である程度方針を決める。
    • いくつか浮かんだら相手の動きを見て決めたりも。
    • やったことのないプレイはしない

1回戦 4番手 4位

  • 建て直しプレイをしたことも封土プレイをしたこともなかった。
  • 特殊勝利点を見ずに建て直しを撃ちながら地下墓所と金貨を買って8金を目指すプレイを狙う。
  • 負けました。建て直しや特殊勝利点をやってなかったという分かりやすい敗因
  • ブドウ園とかも同じく使ったことのない特殊勝利点だったり。
  • 特殊勝利点を知らないドミニオンは本来の魅力が半分って言ってもいいと思うのでぜひ出来るようになりたいね。

2回戦 1番手 4位

  • 地下貯蔵庫、村、浮浪児、祝宴、泥棒、行進、書庫、伯爵、祝祭、秘術師。
  • 書庫、伯爵、祝祭が目立つ。5金出して伯爵でさっさと圧縮したい。
  • なぜか初手で浮浪者銀を購入、銀銀か、5金が出したいので祝宴でも良かった。
  • そのまま3ターン目、4ターン目に5金出なかった。
  • 四位確でプレイ続けるのつらい。

ここで最下位卓へ

3回戦 2番手 3位/3人

  • 狂信者が一人でそのまま一人が勝利。
  • 死の荷車、餌には困らなかったけどだめだったか。
  • アタックを何人が使うかの感覚が4人戦と変わるから、そこに慣れてなかったのがつらかった点かも。
  • ドベとっても1点貰えるのうれしい

4回戦 4番手 1位/4人

  • 騎士に1人、青空市場に自分ともう一人、青空市場が1位2位
  • 自分は青空改築で金貨を増やすプレイ
  • 騎士の人は民兵効果の騎士ともう1枚騎士を入れてた。
  • 手札に堀と2枚青空市場がある時に、民兵付きの騎士を撃たれて堀を公開せずに騎士で廃棄された方が得だったのかもしれない。
  • 属州を買わずに金貨改築で公領を買っていれば3点増えたのでそれはプレイミス
  • 二位と10点差つけて一位

結果

7点

70位/95人

  • おつかれさまでした
  • くやしいのでドミニオン始めるかも

JavaChallenge2012で考えるAI対戦型ゲームのデザイン

Competitive Programming Advent Calendar Div2012の22日目の記事になります。
遅刻しました、申し訳ありません。

最近、自分は2つのプログラミングコンテストProgramming Contest

に運営側として関わらせていただきました。
特にJavaChallenge2012はルールの作成を担当したので今回はAI対戦型コンテストのルール設定について思うことを書きたいと思います。
主にゲームの解説になるので、ルールを読んだ方、参加者以外にはピンとこないかもしれませんがご容赦ください。

JavaChallenge2012とは

ルール概要

詳しいルールはこちらのマニュアルより。

マニュアルによるとGalconっていうゲームとカタンの開拓者達を合わせた感じのゲームらしいです。

マップ詳細
  • HEXマップの頂点と辺部分を使用
  • プレイヤーは2人〜6人まで
  • マップ中にランダムに40個の拠点が置かれる
  • 所有者のいる拠点からは毎ターン資源とロボットが生まれる
  • 各資源は銀行と取引したり、ユーザー間で取引できる
  • 各拠点は初期ロボット数、産出される資源数、産出されるロボット数などが異なる
ルール
  • ロボットを他のプレイヤーのロボットと同じ地点に送ると、対になって消失し、多い方のプレイヤーのロボットが残る。
  • 拠点にある他プレイヤーのロボットより1個以上多くのロボットを送ることで拠点の所有者が交代する
  • 初期配置選択フェーズの後各プレイヤーが順に200ターンの行動を行う
初期配置選択フェーズ
  • 拠点を"プレイヤー1→プレイヤー2→…→プレイヤー6→プレイヤー6→…→プレイヤー1"の順で2つ選択
各ターンの行動

プレイヤー1から行動を開始する。以下の行動は自分のターンに好きなだけ行うことが出来る。

  • ロボットの起動
    • 自分の所有している拠点にいるロボットを別の拠点へと移動させることが出来る。
    • ロボットは1辺を1ターンに1ずつ移動する。
    • 攻め込むルートを指定することも出来るが、省略すると最短ルートを自動的に計算して侵攻する
  • ユーザー間交渉の値段の提示
    • 資源、個数、金額のペアで提示する。その条件は1ターンの間他プレイヤーが確認、取引を受けることができる。
  • 提示されている条件を受ける
    • 提示された資源の個数の一部のみに対して取引を行うことも可能
  • 銀行との売買
    • 資源をお金に換えることが出来る
  • 拠点のグレードアップ
    • 決まった資源を使用して、拠点をグレードアップすることが出来る。資源生産量を2倍,4倍、ロボット生産量が2倍,4倍にするグレードアップがある
勝利条件

200ターンを終えるか,拠点を所有しているプレイヤーが1人だけになった時に終了、以下の基準で順位が決まる(上が優先)

  • 生き延びたターン数
  • 終了時点での制圧数
  • 総ロボット数
  • 資源を売った額+所持金の合計

ルールの設計について

今回JavaChallenge2012のゲームを作るに際して、普通の対人戦ゲームと異なる点として、盤面を数値の形で評価しやすいようなルール設計にすることを考えました。
また一方で、AI対戦型ゲームの場合は人間がロジックを考えるリソース、コード量、実際の計算時間をゲームのどの部分に割くか自由に決めることに注目しました。

今回のゲームでは最初の行動が非常に重要なゲームとして設計しました。イメージとしては初期配置が半分、最初の50ターンの立ち回りが半分ぐらいといったところ。見た目にはどんどん制圧していきマップをトップのプレイヤーの色に染め上げるのは綺麗だけれども、逆転を誘発するルールはなく100ターン経過後のトップと200ターン経過後のトップはほとんど変化していません。

数値化について、、ロボットの所持数、総生産力、各資源の所持数、各資源の総生産力などをAPIから呼び出せ、またゲーム画面上でも確認出来るようになっています。

ルールをモデル化すると、ロボットの個数の差で拠点を制圧する力関係が決まるため、ロボットの個数を増やすことをゲームの目的とみることが出来ます。そして、ロボットの個数を増やすことは各拠点のロボット生産力を合計した、総ロボット生産力を高めることに繋がります。

ロボット生産力を高めるための行動としては、

  • 資源を使って拠点をアップグレードし、資源生産力を増加
  • 資源を使って拠点をアップグレードし、ロボット生産力を増加
  • ロボットを使って拠点を制圧、資源生産量、ロボット生産力を増加

こんな感じでモデル化することが出来ます。初期配置についても、初期のロボット数、ロボット生産力の高さ、資源の内容、資源生産量、また周りの拠点との距離や周りの拠点の生産力、をユーザーが独自で数値化すると、良さげな初期配置の評価が出来たのではないかと思います。

取引については上述の通り、最初の数ターンの行動が非常に大事なので、そこで最善手を選ぶと、銀行との交渉、ユーザー同士の交渉を持ちかける意味はあるように思います。けれども、少なくとも2チームのプレイヤーが取引を実装していないと無駄になることもあり、限られた時間の中で手をつけたチームはほとんどなかったため、今回はルールとしては死んでしまいました。

それ以外では、既に敵に所有されている拠点の場所を考慮したり、敵の侵攻ルートを考慮し消滅を避ける戦術、狙われにくくする戦術などの工夫が上位チームやゲストチームで見られました。

サンプルコードについて

限られた時間の中でAIを作成してもらうために、サンプルコードは

  • サンプルコードを読んだだけでAPIが理解出来る
  • 拠点を評価順にソートするコードなど強いAIを作るための部品を揃えておく
  • サンプル自体は弱く、改良しがいがあるものにする

を意図して書きました...が、思った以上に強くなってしまいました。

サンプルを改良したつもりでももとのサンプルを超えられなかったという悲鳴を聞いたり、サンプルコードと提出されたコードを戦わせるとサンプルコードが上位に入ってしまった...など。

弱くなるように色々なパラメータをいじったはずが依然として、強かったというのは、そもそもサンプルで用意した、「自分の所有しているすべての拠点に対して、ロボットが一定数以上あれば、そこから最も近い拠点を攻撃する」という行動が理にかなっていたためでした。

ルール設計側がサンプルを書くと気付かずについついゲームの本質を突いてしまうので、そこを弱くする修正は念入りに行った方が良さそうです。

告知

  • さっきから何度か貼りましたが、JavaChallenge2012のウェブサイトが完成しました。結果や、ゲームのダウンロードが可能です。

Bogobogosortについて

遅いソートアルゴリズム

Bogobogosortという、名前からして恐ろしいソートアルゴリズムを知ったきっかけはtodo314さんのこのPostからでした。

遅いソート方法というと、どこまでの無駄が許されるのかという話になってくる気もしますが、例えば以下のURLではkinabaさんが情報量が0である比較を除いた計算量について考察されてます。

d.y.d.

今回のようにボゴソートのO(n*n!)がソートアルゴリズムとして許容されるとなると、結構なんでもありな気がしてきます。

まず、よく知られているソートアルゴリズムでボゴソートと同じくらいの計算量を持つものには

  • ボゴソート:ソートされたものが見つかるまでrandom_shuffle
  • ボゾソート:ソートされるまでランダムに選んだの2つの要素を交換
  • permutation sort :順番が揃うまでnext_permutation

などがあります。

その時のTLでみたアルゴリズムではstacさんの

1/2の確率でランダムにnext or prev permutationを行う

というアイデアが秀逸でした。ランダムウォークみたいな話です。計算量はO((n!)^2)辺りになりそう。

Bogobogosort

そうしていると、todo314さんからbogobogosortがあるとのPostが。気になる。

詳細はこのサイトより。以下はその抄訳と説明。英語に抵抗ない人はリンク先を読んだ方が良いと思います。
DM's Esoteric Programming Languages - Bogobogosort

Bogobogosortは、有名なbogosortを基にしたソートアルゴリズムで、これを理解するにはまずボゴソートの細かい部分を理解する必要があります。

  1. リストがソートされているかチェックし、されていれば停止、違えばStep2へ
  2. リストをランダムに並び替える
  3. Step1に戻る

比較が線形時間、ループが平均n!/2回で、計算量O(n*n!)という、非常に効率的なアルゴリズムです。

Bogobogosortの特徴はリストがソートされているかどうかのチェックに再帰を用いることです。再帰というのは常にgoodでcoolですから。
Bogobogosortではボゴソートのチェックの部分を以下のようにします。

  1. 元のリストをコピーしたリストを作成します。
  2. コピーしたリストの先頭からn-1要素をbogobogosortを使ってソートします。
  3. コピーのn番目の要素がn-1個の要素の最大値より大きければ、コピーはソートされている。違えばコピーの順番をシャッフルし、もう一度Step2からやり直す。
  4. ソートされたコピーが元のリストと同じかどうか比較する。

これをボゴソートのStep1で行われるようにしたものがbogobogosortです。

C++での実行結果は
n Time (seconds)
1 0.0000
2 0.0000
3 0.0008
4 0.0054
5 0.0745
6 450
7 一晩中動かしたが終了せず

コードが載ってないので書いてみました。

  • bogosortのC++による実装

http://ideone.com/RaWaH

  • bogobogosortのC++による実装

http://ideone.com/Ue9TZ

n=6でも終わらないんだけど...あれれ?
bogobogosortぐらいになると乱数の使用回数が馬鹿みたいに多いので、乱数生成にMTとか使った方が良かったのかもしれません。
計算量がアッカーマン関数程度になるような面白いものを見つけたい。