FreelyApps

個人によるアプリ開発の日記です。アプリの収入だけで生活できるようになるのが目標です。UnityでAndroid向けのゲームアプリを作成しています。


    アプリ『トランプ・ジン・ラミー』を公開しました。
    Android/iOS https://goo.gl/PYKFYG

    タグ:トランプ・ナポレオン

      このエントリーをはてなブックマークに追加 Clip to Evernote
    アプリ『トランプ・ナポレオン』の通信対戦の説明です。

    1. 概要
    2. ルーム検索
    3. ルーム参加
    4. ルーム作成
    5. 備考

    1.概要
    通信対戦とは、インターネットを介して他のプレイヤーと対戦することができるものです。2~5人のプレイヤーが参加することでゲームを開始することができます。通常の対戦と異なり操作には時間制限があります。
    通信対戦を行うにはルームが必要です。ルームとはプレイヤーがゲームに参加するための待ち合わせ場所のことです。プレイヤーはルームを作るか、ルームに参加するのが基本になります。
    ルームを作る場合は他のプレイヤーが参加してくるのを待ちます。後述の4.ルーム作成をお読みください。
    既にルームが存在している場合は、ルームに参加することができます。後述の3.ルーム参加をお読みください。
    ルームに2人以上のプレイヤーが集まったらゲームを開始することができるようになります。
    ルームを作った人をホスト、ルームに参加する人をクライアントと呼びます。ホストがいなくなるとルームがなくなるので、ホストのプレイヤーは通信がなるべく途切れないようお願いします。
    アプリが中断してしまうと通信が切れるので、アプリが中断しないよう定期的に画面をタップしてください。
    通信が切れた場合は通信対戦を続けることはできませんが、そのまま通常の対戦に移行して遊び続けることができます。通信対戦が行われているときは画面左上に紫色のアンテナのアイコンが表示されています。
    Screenshot_2015-10-25-19-17-03

    2.ルーム検索
    ルームの名前を指定して検索することができます。特定の人と遊ぶためにあらかじめルーム名を決めておいて一緒に遊ぶといった使い方が可能です。
    ルーム名を入力し、「ルーム検索」ボタンを押すとそのルーム名でルームがあるか検索をします。ルームの一覧は定期的に更新されます。
    ルームが見つかった場合は、ルーム名と参加人数が表示されるボタンが現れるのでそれを押してルームに参加することができます。
    Screenshot_2015-10-25-19-17-47 Screenshot_2015-10-25-19-18-09 Screenshot_2015-10-25-19-20-07

    3.ルーム参加
    存在しているルームを見つけて表示します。ルームの一覧は定期的に更新されます。
    ルームが見つかった場合は、ルーム名と参加人数が表示されるボタンが現れるのでそれを押してルームに参加することができます。
    Screenshot_2015-10-25-19-18-15 Screenshot_2015-10-25-19-20-16

    4.ルーム作成
    ルーム名を指定してルームを作ることができます。ルーム名はなくても問題ありませんが、他の人と違う名前をつけることで区別しやすくなるためつけることをお勧めします。
    ルーム作成後はホストとして他のプレイヤー(クライアント)が参加してくるのを待ちます。真ん中の画像のようにはじめ自分の名前だけが表示されていて、このときは戻るを押して通信対戦をやめることができます。
    クライアントが1人でも参加すると、開始ボタンが表示され戻ることはできなくなります。誰かが開始を押すことでゲームが開始されます。5人まで参加可能です。
    Screenshot_2015-10-25-19-17-53 Screenshot_2015-10-25-19-19-08 Screenshot_2015-10-25-19-19-27
     
    5.備考
    プレイヤーの名前は設定から行えます。初期設定では「ユーザー」になっていますので、お好きなものに変更をしてください。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』に通信対戦機能を作っていると以前の記事で書きました。

    現在は通信対戦の機能を作り終え、テストを行っているところです。早ければ来週か11月の初旬にリリースできるかと思います。はじめは試験版と銘打っておこうと思っています。
    マッチングをルームの作成、参加で通信対戦を行っているので、少し面倒かもしれないと感じています。全自動で通信対戦を行う機能を追加すると自分の参加したいルームに参加できなくなってしまいます。これだと誰かと遊ぶということが難しくなります。ユーザーの意見があれば対応というところですが、まずはルームの作成・参加という方式でリリースします。

    通信対戦を作っていてわかったことは、進行不能になることや通信の切断への対処が難しいということです。どのような対応をするのが良いかはアプリによるので、以降の話は『トランプ・ナポレオン』についてということになります。

    トランプゲームでは誰かが札を出さなくするだけで進行不能になります。通信対戦ではこれが起こると遊ぶのが苦痛になります。
    対処としては時間制限をかけることで解決します。一定時間が経ったら、自動でカードを出すようにしてしまえば良いのです。
    『トランプ・ナポレオン』では全員の進行を止めるような判断を行うところでは必ずそのように作ることにしました。
    宣言、副官指定、カード交換、トリックでのカード選択のときには時間制限を設けています。時間制限が来たら、AIで勝手に処理を行うことにしています。

    切断の対処は、注意をダイアログで表示して「なるべく切らないようにしてね」とお願いしています。これだけで済めば良いのですが、おそらくそうはいきません。

    お願いしても切断されるでしょうから、その時はなんとかゲームを続けられるようにしています。ホスト(サーバーの役割があるクライアント)がいなくならなければ、クライアントが抜けても通信対戦が継続されます。ホストがいなくなった場合はどうしようもないので、クライアントが個々にゲームを続けられるようにしてあります。

    まとめると、以下のような対応をしています。

    <通信を切った人(アプリの中断も含む)>
    • 通信対戦は終了し、そのままオフラインでゲームを継続する。

    <通信を切られた人>
    • ホストがいなくなった場合は通信対戦が終了し、そのままオフラインでゲームを継続する。
    • クライアントがいなくなった場合はそのプレイヤーはAIで処理されるようになるが、通信対戦は継続する。ただしホストだけになってしまった場合は通信対戦は終了し、そのままオフラインでゲームを継続する。
    書くとそんなに処理が多くないように思います。しかしながら実際にこれを対応するのはかなり骨が折れます。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    『トランプ・ナポレオン』に通信対戦機能を入れようとしています。

    元々トランプゲームなので、人が集まらないとできないゲームです。しかもナポレオンは5人で遊ぶのが一番バランスが良く面白いので、5人専用といっても良いです。ナポレオンのルール自体が複雑で分かっている人は少ないでしょうから、同じくらいの力量の人を5人集めるというのはかなり難しいです。
    トランプ自体は人と遊ぶのが当然楽しいですが、実際に人を集めて遊ぶというのは簡単なことではありません。

    そんなわけでインターネットを介して通信対戦するというのが手軽になります。通信の遅延とか切断などの問題も起こってしまいますが、自分がどこかへ行く必要はないので手軽です。(現在の通信の問題はどうしようもないです。)

    この通信対戦機能というのは作るのが難しいものになります。離れた場所で実行されているアプリケーション同士が通信して整合性を保ちながら、実行されていかなければならないからです。うまく作らないと、あるプレイヤーだけが進行しすぎてしまいおかしくなるようなことは簡単に起こります。
    トランプゲームの場合は誰が何のカードを持っていて、今誰が番なのか、何を出したのかということが重要になります。このタイミングがずれてしまうと全員が進行できなくなってしまったりするバグが生まれます。

    ナポレオンではプレイヤーが操作するタイミングが4つあります。
    宣言、副官指定、カード交換、トリックでの手札決定です。これらを全て行えるようになると一応ゲームができるようになります。
    少し前に宣言部分の動作をツイッター上にあげたので以下に載せておきます。

    現在は全ての操作ができるところまできていますが、ゲームに参加するという部分がありません。これはオンライゲームでいうルームを作る、ルームに参加するといったものになります。当然、これがないとオンラインでのゲームが始まらないので作る必要があります。
    アプリのバージョンが違えば、一緒に遊ぶとおかしくなることが普通なので、バージョン違いで接続ができないようにした方が良いです。
    UnityのNetworkMatch.CreateMatchでルームを作る時にCreateMatchRequestのmatchAttributesにバージョンの情報を入れておき、NetworkMatch.ListMatchesでルームを取得するときにListMatchRequestのmatchAttributeFilterEqualToにバージョン情報をいれ比較するようにすれば実現できそうです。

    人が集まらないと対戦できないので、人が集まってくれることを期待したいです。できれば記事の拡散やアプリ『トランプ・ナポレオン』の拡散をお願いしたいです。

      このエントリーをはてなブックマークに追加 Clip to Evernote
    10/1に「トランプ・ナポレオン」を1.2にアップデートしました。

    使っているテクスチャをすべて無圧縮にしてみました。圧縮フォーマットによっては対応できない端末がありそうなので、無圧縮にしてどのような端末でもテクスチャが正しく表示できるはずです。
    このあたりは機種依存(というかGPU)によって、読み込めないフォーマットがあるようで簡単には見つからないバグです。簡単にはというのは端末を持っていなければわからないという意味です。起動すれば確実に発生するバグなのですが、その端末でないと起こらなかったりして前もって防ぐことは難しいです。

    ユーザーから表示がされないUIがあるとの連絡があったので、わかる範囲で調べてみました。 該当の端末を買うのが最も簡単に調べられる方法ですが、コストがかかりすぎるのでそれは行えません。

    表示されていないUIを調べると、ある特定のテクスチャを参照しているプレハブだということがわかりました。その時点でテクスチャが非常に怪しいわけです。
    テクスチャをインスペクタで見ると圧縮フォーマットがETCになっていて、もしかしたらこれが原因なのではないかという気になりました。 (ETCはAndroid 2.0以降の端末であれば、全て使えるはずなのですが……)

    使っているテクスチャの量はそれほど多くないので、全て無圧縮にしてもほぼAPKサイズに影響はありませんでした。(数十KB程度)  

      このエントリーをはてなブックマークに追加 Clip to Evernote
    9/26に『トランプ・ナポレオン』を公開しました。
    Screenshot_2015-09-17-23-42-44

    トランプゲームの「ナポレオン」を遊ぶことのできるアプリです。
    本来、5人プレイヤーがいないと遊べないゲームですが、『トランプ・ナポレオン』ではコンピュータとの対戦により1人で遊ぶ用のゲームになっています。
    1回あたり長くても5分程度で終わりますので、ちょっとしたときに遊ぶにも適しています。

    ルールが複雑なため、ゲームのルールについてはこの記事で公開しています。説明を見ずに遊ぶこともできますが、ルールを知ってから遊んだ方が楽しめますので一読をお勧めします。

    ユーザーが増えたら、通信対戦を作りたいと思っています。技術的にはUnity Multiplayerを使って実現可能ですが、ユーザーがある程度いないと対戦ができないのです。最大5人同時対戦で2人から対戦できるように作ろうかと思っています。
    通信対戦実装のためにもアプリ『トランプ・ナポレオン』の拡散をお願いします。

    YouTubeとニコニコ動画にアップした紹介動画を載せておきます。内容は同じですので、お好きな方をどうぞ。
     


      このエントリーをはてなブックマークに追加 Clip to Evernote
    アプリ『トランプ・ナポレオン』のルール説明です。ナポレオンには色々なルールがあるようなので、このアプリで採用しているルールを説明します。

    1. 概要
    2. ゲームの流れ
    3. カードの強さ
    4. 特殊なルール
    5. 操作方法
    6. 参考

    1.概要
    プレイヤー数は5人。
    使用するカードは各スートの1~13とJokerの計53枚です。

    ナポレオン副官からなる「ナポレオン軍」と残りのプレイヤーからなる「連合軍」の2チームに分かれ、絵札を取り合うゲームです。このゲームにおける絵札とは各スートのA、K、Q、J、10の全部で20枚です。
    ナポレオン軍は取ると宣言した枚数以上の絵札を取得できればナポレオン軍の勝ちです。連合軍は逆にナポレオン軍を勝たせないようにすれば、勝利です。必ずどちらかの軍が勝ちます。

    プレイヤーに10枚ずつ手札を配り、ナポレオンを決めるために宣言を行います。宣言はナポレオン軍が取る枚数と切り札のスートの指定をします。(スペードで13枚、ハートで15枚といった宣言になります。)最も強い宣言をしたプレイヤーがナポレオンになります。
    ナポレオンが決まったら副官の指定を行います。ナポレオンは53枚のトランプの中から1枚を指定し、そのカードを持っている人が強制的に副官になります。
    副官の指定後、ナポレオンはカード交換を行います。配ったときに余った3枚のカードを渡し、13枚の手札から自由に3枚を選んで捨てます。捨てられたカードはゲームで使わないことになります。

    以上の準備が整ったら、トリックと呼ばれるゲームを手札がなくなるまで行います。すべてのトリックが終了した時点で勝敗を決めることになります。

    2.ゲームの流れ
    <配札>
    はじめに53枚のカードをシャッフルし、プレイヤーに10枚ずつ配ります。余った3枚のカードは後で使うので、場に裏向きに置いておきます。

    <宣言>
    ナポレオンを決めるために宣言を行います。
    ディーラーから時計回りに宣言をするかパスをするかしていきます。宣言は切り札のスートと取る枚数の組で行います。取る枚数は13枚以上です。宣言するときは既にされている宣言よりも強いもので行わなければなりません。
    宣言の強さは取る枚数が多いほど強く、同じ枚数の宣言であれば切り札のスートがスペード>ハート>ダイヤ>クラブの順で強くなります。スペードで20枚が最も強いのでそれが宣言された場合はパスするしかありません。
    あるプレイヤーが宣言してから、他のプレイヤーがパスを続け宣言したプレイヤーまで回ったらその人の宣言に決定しナポレオンになります。宣言が通った場合ナポレオンを降りるということはできません。
    自分の番が回ってくるたびに自由にパス、宣言のどちらかを行います。
    全員がパスして一周してしまった場合は配札からやり直しになります。

    一般的にはナポレオンになる気がないなら、宣言しない方が無難です。宣言すると、その切り札を多く持っているだろうと予想されますし何らかの役札を持っているのではないかと周りのプレイヤーに勘ぐられます。宣言によって自身の勝敗が決すると言ってもいいくらい重要なことなのです。ナポレオンの宣言枚数をつり上げるためや撹乱のために宣言しても構いませんが、それが通ってしまうとナポレオンにならなくてはなりません。

    <副官指定>
    ナポレオンが決まったら、ナポレオンは副官を指定します。
    ナポレオンは53枚のトランプの中から1枚を指定します。そのカードを持っている人が強制的に副官になります。
    後述するカード交換時に受け取るカードに指定したカードが入っていることがあります。その場合はナポレオンが副官を兼ねることになります。予想外に副官を兼ねることになっても副官指定を変更することはできません。

    一般的には自分の持っていない強いカードを指定します。自分の持っているカードを指定するのは、自分の手札がよほど強く勝利を独占する場合くらいでしょう。

    <カード交換>
    副官指定が終わったら、ナポレオンは配札時に余った裏向きに置かれている3枚のカードを受け取ります。13枚になった手札から任意に3枚を選び、それを捨てます。捨てた3枚のカードはゲーム中で使われなくなります。
    絵札を捨てた場合はその得点がなくなります。捨てる枚数によっては絶対に宣言を満たすことができなくなるのでご注意ください。
    副官指定のカードを捨てた場合、ゲーム中は副官が判明しませんが終了時にナポレオンが副官を兼ねていたことが判明します。

    一般的には弱いカードを捨てます。絵札を捨てると取得できる得点が減ってしまうので基本的に捨てない方が無難です。切り札の比率を高めるために絵札を捨てるとか副官をわからなくするために副官指定のカードを捨てるという戦略もあります。

    <トリック>
    カード交換が終わったら、トリックと呼ばれるゲームを手札がなくなるまで繰り返します。

    トリックでは決められたプレイヤーから時計回りに1人1枚ずつ手札からカードを出していきます。トリックの最初のプレイヤーは任意のカードを出すことができます。2番目以降のプレイヤーは最初のプレイヤーが出したカード(トリックの初めに出されたカードを台札という)と同じスートのカードを出さなければいけません。台札と同じスートのカードを持っていなければ、任意のカードを出すことができます。全員が出し終えたら、後述するカードの強さからトリックの勝者を決めます。
    トリックで出されたカードはこの後のゲームでは使えなくなります。トリックに出されたカードに絵札が含まれていた場合は、トリックの勝者がすべて取得します。絵札以外のカードはゲームから取り除いておきます。

    1回目のトリックではナポレオンがトリックの最初のプレイヤーになります。2回目以降のトリックでは前のトリックの勝者がそのトリックの最初のプレイヤーとなります。

    各トリックで勝者を決めますが、あくまでそれはトリックでの勝者でありゲームの勝敗には関係ありません。絵札を取得するためにトリックの勝者が決まるだけなので、トリックに勝つことは絵札を得るための手段にすぎません。

    トリックの途中で副官指定のカードが出ることがあるかも知れません。そのときは全員が副官を知ることになります。副官がわかるかどうかでゲームの流れが変わりますので、副官が誰なのかということには注意を払ってください。

    一般的にはナポレオンはトリックを勝ち続けるのが理想です。副官はナポレオンが勝てなかったトリックを勝ったり、ナポレオンに絵札が行くようにしたりすることになるでしょう。連合軍はナポレオンに絵札を取らせないように自分が勝ったり、まとめて絵札がトリックに出ないよう少しずつ絵札が出るように調整したりすることになります。
    トリックにおいてどのようにカードを出していくかというのは副官が最も難しく、次にナポレオン、連合軍が難しくなります。

    <勝敗決定>
    10回のトリックを終え、手札がなくなった時点でゲーム終了です。トリックが終わっても副官が判明していない場合はナポレオンが捨てたカードに副官指定のカードが含まれているはずなので、ナポレオンが副官を兼ねていたことになります。
    ナポレオンと副官の取得した絵札の枚数の合計がナポレオンの宣言した枚数以上であればナポレオン軍の勝利です。そうでなければ連合軍の勝利です。

    3.カードの強さ
    強い順に以下の順になります。
    1. よろめき
    2. オールマイティ
    3. 台札のJoker
    4. 正ジャック
    5. 裏ジャック
    6. セイム2
    7. 切り札
    8. 台札と同じスートのカード
    9. その他
    オールマイティはスペードのAのことです。

    台札のJokerはトリックの初めに出たJokerのことです。詳しくは特殊ルールで説明します。

    正ジャックは切り札のJのことです。切り札とはナポレオンが決まったときに宣言されているスートのカードのことです。

    裏ジャックは切り札のスートと同じ色の別スートのJのことです。(例えば正ジャックがハートのJなら、裏ジャックはダイヤのJ。)

    オールマイティ、正ジャック、裏ジャックの3つは役札とも呼ばれます。

    セイム2は2のことですが、全員が同じスートを出したときのみ有効です。詳しくは特殊ルールで説明します。

    切り札はナポレオンが宣言したスートのカードです。1~13の13枚があります。(オールマイティ、正ジャック、セイム2と被ることがあります。被った場合はより強い方を採用します。)切り札どうしでのカードの強さはA、K、Q、・・・、4、3、2という順です。

    台札はトリックの初めに出されたカードのことであり、その台札のスートと同じスートのカードは他のスートよりも強くなります。1~13の13枚があります。(オールマイティ、正ジャック、裏ジャック、セイム2、切り札と被ることがあります。被った場合はより強い方を採用します。)台札と同じスートのカード同士での強さは切り札同様A、K、Q、・・・、4、3、2という順です。

    その他は上記以外のカードのことになります。台札が必ず存在するため、その他のカードが勝つことはありません。

    4.特殊ルール
    <よろめき>
    オールマイティとハートのQが同じトリックに出た場合、よろめきが成立します。よろめきが発生したときはハートのQを出したプレイヤーが勝ちます。
     
    <セイム2>
    トリックで出されたカードのスートが全て同じ(Jokerを含んで良い)場合、誰かが2を出していればセイム2が成立します。
    オールマイティ、台札のJoker、正ジャック、裏ジャックに次いでセイム2が強くなります。セイム2が成立した場合、最弱である2で勝つ可能性があります。

    <Joker>
    Jokerはいつでも好きな時に出すことができるカードです。

    台札として出されたときのJokerはオールマイティに次いで2番目に強いカードとなります。またこのときJokerのスートは切り札のスートとして扱います。後続のプレイヤーは切り札を出さなければならなくなります。

    台札以外で出されたJokerは最弱カードになります。またスートはないものとして扱います。

    Jokerが出されていても他の4枚が同じスートであればセイム2が成立します。

    <Joker請求>
    ゲーム中Jokerがまだ出ていない場合でクラブの3が台札で出されると、Joker請求が成立します。Joker請求時にはJokerを持っている場合は出さなければなりません。
    Joker請求を行った人がJokerを持っていたり、カード交換時にJokerが捨てられていたりすると、Joker請求が発生してもJokerを誰も出さないことがあります。

    5.操作方法
    『トランプ・ナポレオン』での実際の操作方法について説明します。

    操作は大きく分けて、宣言、副官指定、カード交換、トリックでのカード選択の4つです。宣言とトリックでのカード選択は全てのプレイヤーが行いますが、副官指定とカード交換はナポレオンのみが行います。

    <宣言>
    d

    宣言するときは上の画面でスートと枚数を選んで宣言かパスを選びます。順番が回ってくるたびにこのウィンドウが表示されます。

    <副官指定>
    a

    宣言が通りナポレオンになった場合、副官指定を行います。上の画面でスートと数字を選ぶことで1枚のトランプを指定します。画面上部にショートカットキーが用意されています。Jokerを指定するにはショートカットキーを押してください。
    下部にあるボタンを押すことで決定します。

    <カード交換>
    c1 c2 c3

    副官指定をしたら場に置いてある3枚のカードを手札に加え、左の図のように13枚の手札になります。最上段の3枚が追加されたカードです。この中から不要な3枚のカードをタップして選択してください。選択状態になると色が変わり、選択状態のものを再度タップすると非選択状態になります。
    捨てたいカードを3枚選ぶと真ん中の図のように問われるので、「はい」と答えると次に進みます。「いいえ」の場合は選び直しになります。
    右の図は「はい」と答えた後の手札です。

    <トリックでのカード選択>
    t1 t2

    左の図のように出せるカードは明るく表示されています。出せないカードは暗く表示されていて押しても選択することができません。
    出せるカードを一度タップすると、右の図のように色が変わり選択状態になります。選択状態のカードをもう一度タップするとそのカードを出します。出せる非選択状態のカードをタップした場合はそれが選択状態に切り替わります。

    6.参考
    トランプの用語を解説したサイトやナポレオンのルールを解説したサイトを載せておきます。「トランプ・ナポレオン」を作るときに参考にしました。違ったルールのナポレオンがあるということも知ってほしいのでリンクを列挙します。

    【ナポレオン】
    Wikipedia
    トランプスタジアム
    ニコニコ大百科
    コウタロウのナポレオン譜

    【用語】 
    Wikipedia
    Trump House

    このページのトップヘ