WGGの活動log

都内でゲーム開発だったりVRだったりをしてるかもしれないエンジニアです. WGGは「ワグ」と読みます

4次元空間でプレイするテトリスとそれを自動プレイするAIの話

前に作ったゲームの解説的なお話です.

 

↓過去の記事

wgg.hatenablog.jp

↓プレイ動画

www.youtube.com

はじめに

丁度2か月ほど前に,時間が空いていて,更にサークルで成果物発表会があったので,それに合わせてゲームを1つ作りました.

それが上の頭おかしい「4次元テトリス Tetris Dim.4」です.

DLはこちら↓

https://bitbucket.org/WGGSH/tetrisdim4/downloads/TetrisDim4_Ver0.60.zip

この記事は,4次元テトリスのルール解説と,AIの実装方法についての解説記事です.

 

f:id:wgg00sh:20160514185110p:plain

 

4次元テトリスのルール

一般的なテトリスは「10×20」のフィールドで,「7」種類のブロックを回転させて1列全て埋めてラインを消すことを目的とします.

 

4次元テトリスでは,上記ルールをそのまま次数を2つ上げただけです.

細かい数字まで言うと,

「5×5×5×10」のフィールドで,「7」種類のブロックを「6」つの回転軸で回転させて「5×5×5」の空間を埋めて消すことを目的とします.

次数と,移動方向・回転軸・ブロックの種類の対応表は以下の通りです.

 

f:id:wgg00sh:20160713224515p:plain

 

『なんで3次元の方が4次元よりブロックの種類が多いんだ?』

って疑問が出ると思います.

各次数のブロックを描いてみました

 

2次元

f:id:wgg00sh:20160713224809p:plain

3次元
f:id:wgg00sh:20160713224825p:plain
4次元(少し強引な可視化)

f:id:wgg00sh:20160713224852p:plain

 

 

2→3次元

まず,2次元から3次元でブロックが1つ増える点についてみて見ます

f:id:wgg00sh:20160713225120p:plain

f:id:wgg00sh:20160713225113p:plain

上の画像に描かれている3つのブロックは2次元空間では表現できない為,3つ増えます

ところが下の画像ではそれぞれ2次元で2種類だったブロックが3次元になることで1つに統一できます.これは回転軸が増えたためです.

 

3個の増加と,2この減少,結果的に1つ増えて8種類になります.

 

3→4次元

では,3次元から4次元ではどうなるのでしょうか.

f:id:wgg00sh:20160713225608p:plain

 

3次元から4次元になっても,新しい形のブロックパターンが増えることはありません.何故なら,4次元でしか表現できないパターンを作るには,ある1マスから別々の4つの軸の方向へ隣接するブロックが存在する必要があります.2次元から3次元にした時は,これが存在しましたが,3次元から4次元では存在しません.そもそも1つのパターンを構成するブロックの数が4なので,4方向に伸ばすためには構成するブロックが最低5つ必要になります.

対して,3次元で存在していた2つのパターンが4次元で増えた回転によって,同一視できるようになります.

結果,3次元と比べて,1つパターンが減り,合計7種類になります.

 

回転

上の表では4次元の場合,回転軸が6つと書いていました.

任意の次元数 n次元空間において,2つの軸からなる平面で回転する回転軸は(n-2)!個です.

 

有名なアレ

f:id:wgg00sh:20160713230612p:plain

数学の教科書にも出てくるアレです(2次元版)

 

4次元では↓の様になります.この中で,sin,cosを使用する軸を2つ選ぶのですが,その組み合わせが6通り存在します.

f:id:wgg00sh:20160713230647p:plain

 

という訳で,ここまでで一応4次元の動きについて軽く説明が終わりました(疲れた

 

 

 こっからAI

さて,ここからAIの実装についてです.

といっても,適当にネットから参考になりそうな記事を拾ってきて4次元テトリスに対応させた程度の事しかしていないのですが...

↓参考にした記事たち

nanamb.blog25.fc2.com

コンピュータにテトリスをプレイさせる AIテトリス

GitHub - takuma7/tetris-ai-generator: This program is to seek strong tetris AI with the power of GA

Future AI Tetris Page

 

AIの基本的な考え方

今回作成したAIは「評価関数」を用いています

計算手順は以下の感じです

  1. ブロックを置くことができる場所を全て探す
  2. 1で見つけた場所全てに対して,ブロックを置いた後の状態を複数の観点から評価する
  3. 最も評価の合計点が高い場所が,「置くべき場所」

 

まぁ凄く単純です.単純ですが4次元にしたことでいくつか問題が浮上しました.

 

1.ブロックを置くことができる場所を全て探す

コンピュータの計算速度を利用して,全てのパターンをシミュレートします.

そのためには何パターン置くことができるか調べなくてはいけません.

 

ブロックの置く場所は「移動量」「回転角度」で決定します.

 

移動量は非常にシンプルです.フィールドサイズが「5×5×5×10」で,10は落下にあたるので,それ以外の「5×5×5」=125通りが上限です.当然,ブロックの形によってこれより少なくなることもあります.

 

ところが回転は,回転軸が6つと書いたのですが,回転順序が関わってきます.

例として,6つの回転軸をA~Fとすると,Aで90°→Bで90°回した形と,Bで90°→Aで90°回した形は同じになるとは限りません.これは行列の積が順番を変えると結果が変わるのと同じですね.

 

全ての回転後の姿勢を求めるには,(書く回転軸の角度パターン)^(回転軸の個数)×(回転順序の組み合わせ総数)で求められます.

つまり, (4の6乗)×(6の階乗)=2,949,120通りです(絶望

 

これに移動量の上限125を掛けるので......1手ごとにシミュレートすべきパターン総数は

 

368,640,000 通り(最大)

 

になります。無理です.計算しきれませんでした()

 

という訳で,大幅な妥協をすることにしました.

移動を妥協したら特定のマスにブロック置けなくなるので,こっちはスルーで,回転パターンを大幅に制限しました.

「6つの回転軸を好きな順番で回す」→「ある決められた3つの回転軸を指定した順番で回す」へと変更しました.

4次元のパズルが活かせていないかもしれませんが...やむを得ずそうしました.

これで2,949,120通り存在した回転パターンは64通りまで減りました(少なっ

 

移動と合わせても合計で,最大8,000パターンです

 

 

2.1で見つけた場所全てに対して,ブロックを置いた後の状態を複数の観点から評価する

ここが「評価」にあたる部分です.1で8000種類置くべき場所を見つけたので,それら全てを以下の判断基準から評価していきます.

 

  1. 最もブロックで埋まっている段のブロックの数
  2. 消した段の数
  3. Z(落下)座標が上から4マス以内に存在するブロックの数
  4. ホールの数
  5. 落下位置のZ座標
  6. 最大高度

 

まあこのぐらいにしました.これらに対して,「重み」をつけることで,AIの性格を表現することができるようになります.

 

1つずつ説明していきます.

 

1.最もブロックで埋まっている段のブロックの数

4次元テトリスでは1段消すのに125個のブロックが必要です(2次元なら10個)

これを効率よく積んでいくために,最もブロックで埋まっている段を調べて,その数を評価値にします.ブロックを平らに積んで,消すスピードが向上すると考えられます.

 

2.消した段の数

言うまでもないですね.ブロックを消すことがこのゲームのメインなので.

ここを,4段消せるとき以外は評価を低めに設定したりすると,4段消し(テトリス)を決めやすいAIをつくったりすることができます.

 

3.Z(落下)座標が上かrあ4マス以内に存在するブロックの数

これは少しわかりづらいですが,ブロックを高く積みすぎると,移動可能な領域が減り,難易度が大幅に向上します.そのため,ある程度高く積むことに対して,負の重みをつけることで可能な限り回避します.

 

4.ホールの数

ブロックの下に空いているマスがあると,その段を消すためには上の段を消さなければいけません.2次元なら10個のブロックで消すことができますが,この4次元テトリスでは125個必要で,非常に負担がかかります.正直言うと一度ホールをつくったら,それを修復するのはほぼ不可能です.そこで,ホールを作ることに対して負の重みをつけて,回避します.

 

5.落下位置のZ座標

1と3があるのでこれは無くてもよかったかもしれません.より平らに積んでもらうために,低いところに置くと評価が高くなるようにしています.

 

6.最大高度

同じく,不要だったかもしれません.これも平らに積むための評価基準です.

 

 

これらの評価を用いて,「最も評価の高い移動場所」を決定します.

 

3.最も評価の合計点が高い場所が,「置くべき場所」

あとは簡単です.2で決めた場所に対してブロックを移動させるだけです.

 

 

おわり

以上,4次元テトリスのルールとAIの作成方法についてのメモ兼説明でした.

良かったらプレイしてみてくださいね

 DLリンク↓

https://bitbucket.org/WGGSH/tetrisdim4/downloads/TetrisDim4_Ver0.60.zip

 

 

 

 

4次元空間でプレイするテトリス「TetrisDim.4」を作りました

ちょっとゲーム作ったので公開します

f:id:wgg00sh:20160514185110p:plain

4次元空間でテトリスをプレイする「TetrisDim.4」というゲームです

Dxライブラリを使用して制作しました

まだ未完成ですが,公開します

ダウンロードはこちら↓

https://bitbucket.org/WGGSH/tetrisdim4/downloads/TetrisDim4_Ver0.60.zip

 

ルール

基本的にはテトリスと同じです

ですが,4次元にするにあたって一部改変されています

描画自体は3Dテトリス複数並べる形式なので,あまり4次元らしさは出ていないかもしれませんが...

移動方向が8方向に

X,Y,Z,W4つの軸があり,そのそれぞれが+-に移動できます

十分に思考できるように,自動落下は存在しません

回転が6種類

4次元空間で回転を行う場合,二つの軸からなる平面での回転は全部で6種類存在するので,6種類(逆回転を含めると12)の回転が行えます

落下するブロックの種類が変更

4次元空間内で4つ繋がった形状のブロックが落下してきます

総数は7個と,従来の2次元テトリスと同一ですが,形状が変わっています

 

 

自動プレイモードもあります

恐らく初めてプレイする方は操作難易度が高く,まともにプレイできないと思いますので,自動プレイする人工知能を作成してみました

よければ積み込みの参考にしてみてください(参考にならないかも

 

注意事項

 ・Windows用です

ゲームパッドはXInput形式のみ対応しています

・画面サイズ:1600×900 今後変更可能にする予定です

 

一応,ソースコードも公開しています(多分かなり汚い

https://bitbucket.org/WGGSH/tetrisdim4/src

 

よければ,プレイしてみてください!

「量産ロケット」を遊んだ感想とか

なんかまたスマホゲームの記事です.

 

「量産ロケット!~やはり宇宙は甘くない~」っていうアプリが面白かったので,ちょっと感想書きます.

アプリのシェアばっかりしてますが,別に怪しい目的があってこういう事やってるわけでもなく,単純に自分が気に入ったゲームを広めたいってだけなので^^

このゲーム自体は去年の12月末ごろにプレイし始めて,TA含めて3週間弱はハマってたかな?

この記事を書いてる今はプレイしてた当時から結構経ってます.

 

----以下宣伝----

Twitterで#MPRocketで検索するとスクショとか結構見られると思います

#MPRocket - Twitter検索

IOS

 Android

play.google.com

----------------

 

概要

ロケットを操作してゴールを目指すアクションゲームです.

画面の2か所をタップするだけの非常に簡単な操作のゲームです.

ステージ数も結構多くて(100ちょっと)楽しめました.

 

グラフィックとか

このゲーム,グラフィックがとても綺麗です.

無料ゲームとかって,軽く遊んでなんか操作し辛かったり,UIが見辛かったりすると内容が良くてもそれだけでプレイしなくなることも多いのですが,このゲームは非常に操作しやすくて,アニメーションなどの動きが丁寧に作られてます.

 

作者様が重視して作られたようで,(僕としては)非常にプレイしてて楽しかったです.

というよりも,ゲーム制作のテクニックとして非常に参考になりました.(Unityの勉強しなきゃ...)

 

難易度

僕はアクションゲームはそこまで得意な方ではないのですが,ちょっと難しいかなー?と感じました.

ロケットの操作に慣れるまではすぐ近くにあるゴールに辿り着くのも苦労しましたw

後半になると当然ステージの難易度も上がるわけですが,自分のテクニックも併せて上がるので,「ステージ○○がずっとクリアできないっ!怒」みたいなことにはなりませんでした.まぁ各ステージ結構な回数をこなしたのですが...

 

タイムアタック

f:id:wgg00sh:20160505173914p:plain

今の成績です

確かTotal RankがやっとSになったってぐらいだったかな?

各ランクの個数で見ると

S...83

A...13

B...6

C...7

です

オールS目指したいですねー

 

 

こんな感じかなー

楽しかったので良ければプレイしてみてください

コロプラ主催のハッカソン(VR HACK祭)で優勝した

株式会社コロプラ 様の主催する「VR HACK祭」というイベントに,僕の所属しているサークルから参加して,優勝することができました

 

be-ars.colopl.co.jp

 

コロプラというと,僕は「魔法使いと黒猫のウィズ」や「白猫プロジェクト」なんかのソーシャルゲームが人気なイメージを持っていたのですが,VRに取り組んでいることは知りませんでした.

 

僕自身,コロプラさんのアプリは「弾幕バラッド」と「一瞬のスキマ!」の2つしかまともに遊んだことはありません...弾幕バラッドはかなりやりこんだのですが

今回のイベントの主催の方は以前「Kuma the Bear」に配属していたと仰っていたので,この2つのゲームの開発に携わった方だったのかもしれません.

colopl.co.jp

colopl.co.jp

以下VRHACK祭の活動履歴のようなものです

適当に書き殴ったので汚いのは承知

 

2月中旬~3月上旬

サークル会員に今回のイベントの存在を教えてもらいました

春休みに,地元の京都で,有名な企業がVRのイベントを開催する、という事で絶対参加したいと思っていました.

5人1チームでの参加だったので,メンバー集めが必要だったのですが,昨年度後期からサークル内でVRに関する事を行っていたりしたので,何とか集まりました.

あと,「VRアプリの開発経験が無くても大丈夫」って書いてあったので安心して参加できました.

 

3月中旬

チームリーダーから選考に当選したと連絡が来ました.

学部1回生のみでのチームだったので,院生などが優先されて落とされるのではないかと心配していましたが,通りました.

それと合わせて開発環境なども説明されました,

iPhone 6s」または「iPhone 6s Plus」と「ハコスコ」を使いVRアプリを制作するように指示されました.

hacosco.com

 

iOSアプリで,VRの様に3D描写を本格的に行うってことは多分UnityかUE4使うんだろうなぁ...って感じでした.

それで,モデリングも割と互換の効く(多分)Blenderを使って作らなきゃいけないんだと予想してました.

いずれも殆ど使ったことが無かったので心配でしたが,何とかなりました.

 

3月15(ハッカソン1日目)

今回のハッカソンは3/15,27,28の3日に分けて行われました.

会場に行って分かったのは,間の11日間は,会場外で開発をする期間に設定されていたことです,ハッカソンというと,2~3日の短期間での開発を想像していたのですが,これなら多少の勉強とフィールドワークの時間を割くことができるので,僕たちにとっては好都合だったと思います.

それと,この日に制作テーマが発表されました

Entertainment in VR Kyoto

ってことでこのテーマを満たすVRアプリを作るべく,チームで話し合った結果「清水寺から飛び降りる体験のできるVRアプリ」を作ることになりました.一応初期構想として,京都タワーやダムから飛び降りる体験も制作できたら使用ってことになっていたのですが,制作(主に僕のモデリング)が間に合わず消え去りましたw

僕たちのチームは

人工恐怖

の追及を目指して制作を始めました.普通のディスプレイでFPS(First Person Shooter)視点でプレイヤーが飛び降りるのに比べて,VRでは自分がプレイヤーとほぼ同じ視覚情報を得られるので,これは中々VRに向いていたかテーマだったと思います.

あ、制作はUnityで行うことになりました(辛い)

 

3月16~26,27

僕は殆ど清水寺とその周辺のモデリングに専念していました.

といってもiOSアプリで実行した場合にどれぐらいの負荷がかかるか,なども考慮する必要があったので,ちゃんとUnityも弄りながら作ってましたが.

ゲーム内のキャラクターと視覚情報を共有できるVRではFPS(Frame per Second/フレームレート)の低下は致命傷になります.なので,極力モデルを簡略化して作る必要がありました.

具体的にしたことは

  • 木は葉っぱを全て消して枝だけに
  • 清水寺も基本的な形状(四角柱,三角柱,円柱(に近似した荒い多角柱)で構成して,リーダーのフィールドワーク()などで手に入れた実写をテクスチャとして張り付ける
  • 遠方の建物はそもそもただの面に衛星写真などのテクスチャを張り付けただけ.

といった感じに凄く雑な清水寺モデルを作り上げました.

完成したのは当日なのですが.

f:id:wgg00sh:20160330150854p:plain

 

途中は風景をしっかり再現しようと木や道路を作りこんでいたのですが,処理が重い上に量も多かったので諦めました.

 

 3月28日

最後の仕上げで,リーダーと2人で音響効果を少しだけ担当しました.

今回のチーム,音響周りの知識を持っている人がいなかったのが辛いところでした.

実際に,審査の方にも,デザイン力が足りないと言われました.

隣のテーブルで開発していた精華大学のチームは音響効果に凄く詳しい人がいたようで,「2チームで共同開発したらとんでもなく怖いVRが作れる」といったことを審査の方に提案されました.

 

音響効果についてですが先日参加したプロ生勉強会で参考になりそうなプレゼンがあったので,それを参考にしてすごく適当に作りました.

「至近距離ガールVR」というソフトの開発背景です.

プログラミング生放送20160213

 

音の知識がない自分には音源の制作などできるはずもないので全てフリー音源を使用して,場所によって吹き方の変わる風,鳥の鳴き声,セミの鳴き声を適当に配置して簡易的な立体音響空間を作りました.

 

結果

 

タイトルにもなっていますが,優勝しました.非常に嬉しいです.

とはいっても,技術力,表現力ではほかのチームに劣っていた部分も多く,「人工恐怖」というテーマとそれが非常にVR向きだったことが勝因かと思われます.

作ったものに関してはこちらを見ていただいた方が分かり易いと思います.

mcg.hateblo.jp

 

投稿できるのならYoutubeの360動画で投稿するかもしれないです

 

優勝賞品としてOculus Rift CV1を手に入れることができました!

これから僕の所属するサークルで使用できるようになるみたい?です.

 

まとめ

春休みにVRについて知識を深められるいい機会になりました.

あと他大学の学生さんとの競争という事で自分のモチベーション向上にも繋がりました.

 時間があったら京都タワーと京都駅周辺のモデル作って飛び降りたいですねー

弾幕バラッド」面白い(個人の感想)のでプレイしてみてね