2020.01.06

平和チャレンジ

はじめに


こんにちは。次世代システム研究室のT.Tです。

最近渋谷では再開発が進み、渋スクや渋谷フクラスが開業したり、ビットバレーが始動する等新しい盛り上がりを見せています。そして最近の渋谷と言えば麻雀も忘れてはいけません。麻雀渋谷頂上決戦が開催されてから早4年が過ぎ、それ以来麻雀も盛り上がりを見せています。今回はその優勝チームの一員として、麻雀をテーマにして盛り上がりの一助となるべくブログを執筆しています。といっても自分の麻雀の腕前は平和ちゃんなので、角度を変えて麻雀を題材にした開発チームのビルディングについてご紹介したいと思います。

経緯になりますが、以前Webアプリケーション開発のチーム内で、限られた時間の中で新技術を踏まえて何か(ある程度)動くものを作るハッカソン的な取り組みの取りまとめをしました。その際、引き算による開発を通じてチーム力を高めて欲しかったので、引き合いとしてフルスペックの麻雀をここで作り切るのは難しいので、役が一つだけの麻雀を作ってみるという例え話をしました。その時は飽くまで例え話だったので、実際には違うテーマで取り組みを進めて別の形の面白いアウトプットが出来ましたが、役が一つだけの麻雀は日の目を見ないままとなりました。

それからしばらくして、実際に役が一つだけの麻雀を作ってみるのも面白そうだなとふと思いました。そのポイントとしては、麻雀を知っていて楽しんでいる人がこの麻雀を作ってみても面白い麻雀が出来上がるとは限らず、麻雀を知らない人にとってはまず麻雀を知って面白さを感じるところから初めなければならないというところです。これと似たようなことは開発の現場ではよく起きることなので、それを麻雀を通じて体験できるようなチームビルディングのプラクティスを考えてみました。そうして出来たのが、役が平和だけの実際に遊ぶことができる麻雀を作るという平和チャレンジです。これだけだと具体的に何をやるのか分からないと思うので、本ブログでその一例を取り扱いたいと思います。

前置きが長くなりました。では、わしからまいるっ・・・・!

進め方

最初に(おおよその)制限時間とどのようなものを実現するかの大まかな方針を決めます。あとは時間内に実際に遊べるものを何らかの形で実現するだけです。

課題設定

先述した取り組みでは四人チームで各人24時間以内で実施したので、それに倣って一人でやるのを考慮に入れて96時間(24時間x4)を制限時間としました。次に制限時間内で実現できそうな内容を検討して何を実現するかを決めます。本チャレンジでは次の2点を目指して進めていきたいと思います。
  • 面白く遊べる
  • 四人で対戦できる
これだけでは仕様としては不十分ですが、あとは設計なり実装なりを進めつつ時間と格闘しながら順次検討していきます。実際に取り組む場合は、チーム内で各メンバーが伸ばしたい能力等を色々考慮して方向性を決めると良いと思います。

デモ

本チャレンジで出来上がった麻雀のデモです。四人で対戦できるようになっています。
ゲーム開始から平和を和了するまでとゲーム終了時のデモです。


ソースコード

githubに公開しています。
pinfu-challenge

麻雀のルール(仕様)

実装を進めながら検討して最終的な仕様に落とし込みました。仕様を決めるのに迷った際はなるべく麻雀の形を残すようにしました。詳細はgithubに記載してあります。

要素技術

開発環境

Docker Desktop for Mac上にゲーム管理用のAPI(WebSocket)サーバーと麻雀手牌計算用のAPIサーバーの2つのコンテナを稼働させて開発しました。

ゲーム管理用のAPIサーバー

 DockerイメージにGolangとgorilla/websocketをインストールしてWebSocketサーバーとして稼働させています。

ゲーム管理

 ゲームの進行に必要な情報の管理とプレイヤーに送信する際のデータの変換やマスキングはAPIサーバー内で担当します。

メッセージ送信

 gorillaのサイトにあるチャットのサンプルアプリで使われているclient – hub – broadcastの仕組みを少し変更して各プレイヤーごとに異なるデータを送信できるようにしました。麻雀のイベントごとにメッセージタイプを分けて、メッセージタイプごとに送信用の構造体を定義してメッセージを送るようにしています。実際に送信するための構造体は一つだけです。interfaceを使って適度に構造体の定義を省略できるのがいいですね。余談ですが久しぶりにGolangを使ったらgorillaのコードが理解できなかったので、チュートリアルで復習しました。

麻雀手牌計算用のAPIサーバー

 DockerイメージにPythonと麻雀手牌計算ライブラリをインストールしてWebSocketサーバーとして稼働させています。Pythonの麻雀手配計算用のライブラリがあったので手配計算部分だけ別のAPIサーバーとして独立させました。平和だけでもロジックを組むのは結構大変そうなのでこのライブラリで大分楽ができました。麻雀の役が一通り計算できるので、フルスペックの麻雀も割と簡単に作れてしまいそうです。

デザイン/レイアウト

 HTMLでDOMだけ記述して、デザインとレイアウトはCSSとJavaScriptで制御しています。捨て牌の表示を管理し易くするために一次元のレイアウトにしてfloatで位置調整しています。和了とゲームの結果を表示するのにモーダルウィンドウを使っています。CSSもしばらく使っていなかったので、CSS3 Tutorialで復習しました。

JavaScript

 DOMの操作用にnanoJSを使って、DOM操作を各麻雀オブジェクトのメソッドでラップしてオブジェクトとして動作させています。APIサーバーからメッセージを受信するとオブジェクトの状態を描画して、その後次のメッセージをAPIサーバーに送信してゲームを進めるようになっています。

画像

 画像は麻雀素材を無料で提供している麻雀王国から利用させていただきました。ちゃんとした画材があると麻雀の雰囲気が出ていいです。

評価

動作確認のために四人一役でテストプレイをしたので所感的な評価をしてみました。

まず、思ったより和了のケースが少ないなと感じました。役が平和しかないので、配牌時に最大で13シャンテンということも有り得ます。普通の麻雀ならとてもドキドキする配牌ですが、この世界では最低の配牌です。平和二盃口型の緑一色はただの平和で、宝燈美ちゃんは和了もできません。なんとも平和な麻雀です。

今回は遊べる麻雀を目指して作りましたが他の用途として、まだ平和を上がれる自信がないとか、点数を考慮したゲームメイキングができていないといった入門者レベルの人向けのコンテンツとしても使えそうです。

あと、以下の点を改善するとゲームとしてはよりエキサイティングになりそうな感じがしました。
  • ツモ和了できる
  • 三元牌を除く
  • ドラを一枚だけ決める(ドラだけ決めてドラ表示用に牌を使わない)

まとめ

元は四人のチームで開発する想定のチャレンジでしたが、今回1ヶ月半くらい終業後の時間と週末休みを利用して、そのうち半分くらいはお酒を飲みながら一人で作ってみました。ちゃんと計っていないですが96時間を少し超えるくらいの時間で出来たかと思います(Golangとcssの復習時間除く)。最初に考えた時は一人当たり24時間掛けてなんとか動くものが作れるかなという想定でしたが、出来上がったコードの量からするとそんなに想定は外れていなかったかなと思います。

来年度から小学校でのプログラミング教育が必修化され、プログラミングもより広く認知されていくことかと思います。麻雀を題材にしたプログラミング教育も面白そうですね。

皆さんのチャレンジをお待ちしています。

次世代システム研究室では、アプリケーション開発や設計を行うアーキテクトを募集しています。アプリケーション開発者の方、次世代システム研究室にご興味を持って頂ける方がいらっしゃいましたら、ぜひ 募集職種一覧 からご応募をお願いします。

皆さんのご応募をお待ちしています。

参考リンク

  • Twitter
  • Facebook
  • はてなブックマークに追加

グループ研究開発本部の最新情報をTwitterで配信中です。ぜひフォローください。

 
  • AI研究開発室
  • 大阪研究開発グループ

関連記事