ゲーム

ウミネコロン RPG はじめました

UTAU キャラクターを主人公にした RPG「ウミネコロン RPG」の DL 販売が始まったので、早速ゲームスタート。

※ネタバレ注意

バールUTAU 関連 RPG ということで、ストーリーも UTAU にちなんでいる。突然バグに覆われた街の謎を解くべく、UTAU の仲間達と冒険の旅に出る。

ゲームスタート時、家から出られなくてどうにか脱出を試みるのだが、家の中に宝箱があって中にバールが入っているというのが、なんともシュールで良い。

しかも、バールでドアを開けようとすると、バールが壊れて開けられないというオチ。エクスカリバールという強そうなバールなのに……。

森のクマさん序盤の敵は何気に強い。というか自分が弱い。殴られるとすぐに HP が心許なくなる。が、無限使用回復アイテムがあるので大丈夫。戦闘が終わったらすぐに回復すれば、再び戦える。

敵のグラフィックがまた笑ってしまう。背景や自パーティーのキャラはハイクオリティに描きこまれているのに、敵キャラだけ 2 ちゃんねるのアスキーアート風なのだ。

忍音クノストーリーを進めていくと、仲間も増えていく。

それぞれ、ステータス的にも、キャラクター的にも個性ある楽しい仲間達だ。

どうやら、最大 4 人パーティーの模様。

まだ序盤のプレイだが、ストーリー展開・グラフィック・BGM ともに、期待できそうな内容になっている。操作性もなかなか(ゲームパッドも使える)。

とはいえ、もうちょっとこうだったら良かったのにな、という点もある。
  • 音量調整ができない
  • セーブデータは現在位置(街の名前等)が表示されると、ロードする時に分かりやすい
  • セーブデータが exe フォルダに置かれてしまう(UserData 配下が良い)
  • ボタン同時押しで高速移動できるが、逆にデフォルトが高速移動、同時押しで低速微調整の方が楽

ウミネコロンWinXP動作環境は、我が家の Windows 7 マシンで今のところ問題なく動いている。

試しに Windows XP や Windows 10 でも動かしてみたが、少しいじった限りでは、これらの OS でも動作した。

ウミネコロン RPG の他にも、もっといろいろ UTAU ゲームが増えるといいな。

現時点での UTAU ゲーム一覧は、UTAU ユーザー互助会 Wiki にまとめてある。

※ウミネコロン RPG……作者:ウミネコロン

イース 6(ナピシュテムの匣) カルヴァハンド/エルダーオーブ

イースⅥメモ。

忘却の遺跡の中にある、カルヴァハンドとエルダーオーブの取り方。

マップの大まかな位置は、入口下る→T 字路突き当たりを右に→直線の通路を右に→その次くらい。

剣をエリクシル、アクセサリーを虹の欠片装備にした状態にする。

下の画面の位置から右を向いた状態で、エリクシルの剣技(Z 連打)を発動させ、右側にある 4 本柱の中央に落ちる。柱に着地後、左方向にカウンターを入れる方が良い。
柱ダイブ前

柱の中央に落ちると、下の画面に出る。宝箱にカルヴァハンド。
カルヴァハンド

さらに、ちょうど上の画面の位置から、ダッシュジャンプ(上→上+Z→X)で、飛び石に乗れる。飛び石の先でさらにノーマルジャンプが必要。
ゴール

しかし、宝箱を守っている敵がえらく強い……。


CodeIQ の「グループを作ろう!」にチャレンジ

目次

現役のエンジニア・企業がプログラミングの問題を出してくれる CodeIQ というサイトがある。問題を解くと、正解不正解の判定や、フィードバックなどを行ってくれる。ジャンルや言語などはさまざまある。

グループを作ろう!

今回は結城浩さんの「グループを作ろう!」という問題に挑戦してみた。アルゴリズムの問題で、プログラムを使って解いても使わずに解いても構わない。プログラムを使う場合、言語は何でも良い。解答(とコメントなど)を送ると、フィードバックをもらえる。

問題の概要は以下。

Bill=Billy
Mick=Michael
Billy=William
というように、同じ人物を表すニックネームのペアが 444 個与えられる。同じ名前をすべて連結し、
Bill=Billy=Will=William=Willie=Willy
Michael=Mick=Micky=Mike=Mikey
というようにグルーピングする。ただし、各行の順番および、同一行内の名前は ASCII 順に並べなければならない。

自分の解答:STEP 1 グループ番号割り振り

C++ でプログラムを組む前提で。

どうやってグループを寄せ集めていくかと考えたとき、グループ毎の配列(vector)を用意してしまう、というのは最初に思いつくが、さすがに効率が悪い(名前を読み込む度に、すべてのグループ配列を見て、すでにグループ化されているか調べる必要がある)。

漠然と、木を使えばできるのではないかとイメージしたが、残念ながら、木を簡単に実装する方法を思いつかなかった。

CodeIQ_グループ割り振りそこで代わりに、グループ番号を割り当てていく方法を採った(右はイメージ図)。

ペアの両辺を読み込み、それぞれの名前に既にグループ番号が割り当てられているか調べる。両辺とも未割り当てであれば、新しいグループ番号を割り振る。いずれかが割り当て済みであれば、もう片方に同じグループ番号を割り当てる。

CodeIQ_グループ変更両方とも割り当て済みで、かつ、違うグループ番号であれば、今までは別のグループとして扱ってきたが、実は同じグループであることが分かったということなので、片方のグループ番号をすべて書き換える。

名前→グループ番号の対応を格納するのは、STL の map を用いた。

自分の解答:STEP 2 結合

すべてグループ分けできたら、同じグループ同士を連結していく。string 型の vector を用意しておき、1 行に 1 グループを突っ込んでいく。

CodeIQ_行番号割り振りmap を先頭から読み込んでいき、同じグループ番号の文字列が既に vector にあるか調べる。あれば、文字列の末尾に新しい名前を追加する。無ければ、新しい行の先頭に名前を追加する。

グループ番号と行番号の対応も、やはり map で覚えておく(……が、今から思えば、配列の方が高速だった)。

map を使うことにより。キーが自動的に ASCII 順になっているので、新しい行ができた時は、単純に配列の末尾に加えれば良く、ソートの必要は無い。また、1 つの行に名前を追加する際も、末尾に追加するだけで良く、ソートの必要は無い。

注意点

注意すべきはグループの統合で、最初はこれを見逃していた。できあがった解答を眺めていて偶然気づいた。グループ統合のコードを後から付け加えたので、これだけ異質な感じがする。

計算量は、入力のペア数を N として、グループ統合がなければ恐らく O(NlogN) だが、グループ統合があると最悪 O(N^2) になるのだろう。

ソースコードの抜粋

// グループ番号割り当て
while ( aInFile && getline(aInFile, aLine) ) {
    get_names(aLine, &aName1, &aName2);

    // 名前のペアをマップに登録していく
    p1 = aGroupMap.find(aName1);
    p2 = aGroupMap.find(aName2);
    if ( p1 == aGroupMap.end() && p2 == aGroupMap.end() ) {
        // 新規登録
        aGroupMap[aName1] = aGroupIndex;
        aGroupMap[aName2] = aGroupIndex;
        aGroupIndex++;
    } else if ( p1 != aGroupMap.end() && p2 == aGroupMap.end() ) {
        // aName1 が登録済み→aName2 を同じグループに登録
        aGroupMap[aName2] = p1->second;
    } else if ( p1 == aGroupMap.end() && p2 != aGroupMap.end() ) {
        // aName2 が登録済み→aName1 を同じグループに登録
        aGroupMap[aName1] = p2->second;
    } else {
        // 両方登録済み
        if ( p1->second != p2->second ) {
            // 違うグループとして登録されているのでグループを統合
            change_group(&aGroupMap, p1->second, p2->second);
        }
    }
}

// A=B=C=D というような結合行を作成していく
while ( aGItr != aGroupMap.end() ) {
    aRItr = aResultMap.find(aGItr->second);
    if ( aRItr == aResultMap.end() ) {
        // 新規に結果行に登録
        aResult[aResultIndex] = aGItr->first;
        aResultMap[aGItr->second] = aResultIndex;
        aResultIndex++;
    } else {
        // 既存の行に追加
        aResult[aRItr->second] += "="+aGItr->first;
    }
    aGItr++;
}


模範解答

CodeIQ_木模範解答では、やはりグルーピングに木を使っていた。

面白かったのは木の実装方法。木を map で実装していた(模範解答は perl と思われる言語で実装されていたので、実際には連想配列)。

map のキーに、葉っぱの名前を入れ、値に、根っこの名前を入れる。根っこの名前は、値を空文字列にでもしておく。

こうすることで、数回 map を探索すれば、一番根っこの名前にたどりつける。1 つの根っこから出てくる名前はみな同じグループで、グループの数だけ、根っこ(空文字列)があることになる。

木をこうやって実装するのは定石なのだろうか。シンプルでいいな。

木の良い点は、グループの結合が楽ちんなこと。2 つのグループの根っこのうち、片方の空文字列をやめて、もう片方の根っこの名前を入れるだけで良い。どんなにグループが巨大でも、1 つの書き換えで済む。

感想

単にグルーピングするだけというシンプルな問題なのに、やってみるといろいろ考えることがあって面白かった。Union Find アルゴリズムとか Union Find Tree データ構造などという問題らしい。

実装言語を問わないこともあり、いろんな解答があったと聞く。なかにはエクセルで解いた人もいるとか。

他の人がどんな解答をしているのか気になっているのだが、残念ながら、ググっても自分の解答を公開している人はほとんどいないようだ。

結城さんがせっかく公開 OK に設定してくれているのだから、自分の解答を公開する人が増えてくれればいいなと思う。


三國志 11 を Windows 7 の 64 ビット版にインストール

コーエーテクモゲームス(旧光栄)の三國志シリーズは、V を最後にやっていなかったが、久しぶりにやってみたくなった。

Wikipedia でシリーズの情報を見てみたところ、3D 1 枚マップシステムを採用した 11 が面白そうだったので買ってみた。

世間評価的に、三國志 11 本体のみだとクソゲーで、パワーアップキット(PK)を導入すると楽しめるようになるらしい(それもどうかと思うが……)。

三國志11三國志 11 本体は、ソースネクストから安価なものがでているのだが、店頭で価格を見てみたところ、本家版の方が安かったので(ラス 1 だったので在庫処分?)、本家本体と PK を別パッケージで同時購入。およそ 8,000 円弱。ちなみに、with PK は 1 万円以上だった。
  • 本体をインストール
  • PK をインストール
  • PK のアップデータ(Ver.1.1.1)を適用

の手順で、無事に Windows 7(64 ビット版)にインストール完了。


注意点としては、ゲーム起動(インストールはもちろんだが、プレイも)は管理者権限で行う必要がある。ユーザー権限だと、メニュー画面から先に進まない。


また、フルスクリーンモードだとムービーが再生されない。公式サイトには視覚テーマを無効にすれば不具合を回避できるとあるが、回避できなかった。


CDManipulatorOptionPK の CD-ROM を毎回ドライブに入れるのは面倒くさいが、CD Manipulator で仮想化したものを Daemon Tools でマウントしておけば手間が無くなる。


仮想化の際はエラーを無視する必要がある。



Minecraft でシングルプレイのデータをマルチプレイに引き継ぐ

サバイバルしながらブロックで物作りをしていく Minecraft(マイクラ)にハマってしまった。

まだ開拓をしてあまり経っていないけど、それでもマイハウスや攻略中のダンジョンはある。せっかくだから友達をマイマップに呼んで一緒に探検しようと思ったんだけど、マルチプレイを始めるとマップがリセットされてしまってあれ? ってなったので、シングルプレイのマップデータをマルチプレイに引き継ぐやり方をまとめておく。

バージョン

今回動作確認をしたバージョンは、
  • Minecraft for Windows 1.1
  • Minecraft Server EXE 版 1.1
OS は Windows 7。

概要

やり方はいたって簡単。シングルプレイのデータが
C:\Users\(ユーザー名)\AppData\Roaming\.minecraft\saves\(ワールド名)
に保存されているので、
(Minecraft Server のあるフォルダ)\(ワールド名)
にコピーして、server.properties の level-name を
level-name=(ワールド名)
とするだけ。

手順

Minecraft のマルチプレイは、専用のサーバーソフトを起動しておき、そこに参加者(自分含む)が接続しに行く方法を採用している。したがって、サーバーを立てる人は、サーバーとクライアント(通常の Minecraft ソフト)の 2 つを起動することになる、というのが前提知識。手順は以下。

  1. Minecraft の公式サイトからサーバー(Minecraft_Server.exe)をダウンロードし、適当なフォルダに保存する。
  2. サーバーを起動。ウィンドウの右ペインにいろいろメッセージが表示されるが、一段落して Done と表示されたら、一旦終了する。
  3. シングルプレイのデータをサーバーにコピーする。
    • シングルプレイのデータは、
      C:\Users\(Windows ユーザー名)\AppData\Roaming\.minecraft\saves\(ワールド名)
      に保存されている。例えば、Windows にログオンする時のユーザー名(Minecraft でのユーザー名ではない)が tori で、Minecraft のワールド名が karaage の場合は、
      C:\Users\tori\AppData\Roaming\.minecraft\saves\karaage
      に保存されている。
    • シングルプレーのデータをフォルダごと、サーバーを保存したフォルダに保存する。
    • サーバーを
      C:\Minecraft
      に保存している場合は、
      C:\Minecraft\karaage
      に保存する。
  4. サーバーの設定ファイル server.properties を書き換える。
    • 先ほどサーバーを起動した際に、サーバーと同じフォルダに server.properties が生成されているので開く。
    • 5 行目くらいに level-name= で始まる行があり、これがワールド名を指定している行なので、イコールの右側(最初は world になっているはず)をワールド名にする。
    • level-name=karaage
    • 変更した server.properties を保存する。
  5. サーバーを再度起動する。サーバーは基本的に起動しておくだけ。特に操作はしない。
  6. 通常の Minecraft も起動する。
  7. マルチプレイを選び、「ダイレクト接続」で「サーバーアドレス」に
    localhost
    と入力すると、自分のワールドにログインできる。
    • 最初にスポーンした地点からのスタートとなる。
    • スポーン地点周辺 16 マス程度の地形は変えられない(設定により変更可)ので注意。
    • シングルプレイの時に携帯していた道具類はからっぽになってしまう。予めシングルプレイを終える直前に、スポーン地点付近のチェストに保存しておくと良い。
  8. 他人に自分のサーバーに接続してもらうには、自分の IP アドレスを教えて、「マルチプレイ」→「ダイレクト接続」→「サーバーアドレス」に IP アドレス(DDNS 等を利用している場合は http:// 抜きのホストアドレスでも可)を入力してもらう。ルーター使用時はポートの解放が必要なことに注意。他人も自分と同じ場所にスポーンする。
  9. マルチプレイしたデータをシングルプレイの保存場所に書き戻せば、再びシングルプレイにデータを引き継げる。ただし、この時も、手持ちの道具類は失われる。

マルチプレイそのものについてのやり方・サーバーの設定・注意点などは、Minecraft Japan Wiki に詳しく記載されている。

手持ちの道具の引き継ぎ方をご存じの方、教えて下さい。

夕日の見える家2

月別アーカイブ
記事検索
最新コメント
  • ライブドアブログ