見出し画像

就活終わんなくて逆に暇だったから株式会社Sekappyさんのプログラミングチャレンジに参加した話

はじめに

実はまだ就活が終わっていません。

数社掛け持って絶賛返事待ちですが、応募多数とかで返事が延期されています。

夏休み入ったときもそんな感じでした。

7月末に夏休み入って、ちょうどSekappyさんのプログラミングチャレンジが始まったので参加をしようと思い立ちました。

↓リンク

画像12

当時は書類送っても盆休み挟むとかでどこの会社も返事延期状態でした。

暇だったし、1~2年生の時に培ったプログラミングスキルを試したかったというのもあります。

画像1

優秀者にはMTGの新弾が1箱貰えるようで、腕試し兼アド狙いで参加を決意。

画像2

お題は、、、

未経験(実務3年以内):パック開封シミュレータ
経験者①:一人回しシミュレータ
経験者②:シールドデッキジェネレータ

の3つ。

ワイ「全部やれば最強では?」

天才かな?

結果から言うとパック開封シミュレータで割と凝ってしまい、夏休みも終わってしまったので未経験部門しか応募していないです。

どうやって組んだのかを残りで軽く綴って残しておくことにします。

これから参加する人の参考になるかもしれないので。

完全にプログラム初心者の人はわかんないかもしれない。


制作工程

【自己スキル紹介】

予め僕のスキルをば。

専攻はゲームプランナー。役割はプログラマーとアートデザイナー以外の仕事全部。
脱線して説明すると、地味な書類作成やチーム内のゴタゴタ処理や先生からのダメ出しを一身に受けるタンク系魔法剣士的な職業。なんなら僕の場合は手が足りないならプログラミングやモデリングやアートデザインもやったりします。でも結果至上主義の職業なのでどれだけ頑張っても結果が伴ってないと就活難民になります。

C言語:ネイティブで2Dゲームを作れる程度。DirectX9.0を習ったので2Dゲーはなんでもござれ。2年位授業で触りました。

C#言語:Unityでお勉強した。3Dと2D両方触ったので多分どっちでもゲームを作れる程度の実力はあります。あんまり難しいことはできないです。授業でも触ったけど独学の部分が多いです。というか授業でやる内容なんて大体C言語でやったことの焼き増しだからね…

C++言語:C言語から書き方が飛躍しすぎて諦めた。C#触っててなんとなく理解し始めてます。簡単なコードを読むくらいならできます。

Python:Blenderでオブジェクトをプログラムから呼び出すのとかやった。簡単な内部計算程度しか扱えないです。

HTML:1年位授業でやったが完全に頭からすっぽ抜けてるので勉強からスタートになると思われ…。

微妙だな…

C言語かC#言語あたりが良さげかな…?

【要件+α】

今回のお題はテキスト形式での出力でいいらしい。

しかし捻りがあったほうが得点が高いとか。

そこで入れようと思った要素は以下、

・MTGAのようにGUI(グラフィカル ユーザ インターフェース)で開封できるようにする。
・1パックずつだけでなく、1箱丸々剥けるようにする。

やはり箱剥きは男のロマン。

あと剥いたカードも観たいからね、GUIじゃないとね。

最初はC言語+DirectXでゴリゴリ組もうかとも考えたが、普通に考えて効率が悪すぎる。

それにWeb用にビルドデータを出力するのは骨が折れる。

じゃあはじめからHTMLで書けばいいかと言われると、ブラウザ画面でのポジション取りなどをゼロから組むと、DirectXでゴリゴリ組むのと同レベルの面倒臭さになるのは知っている。

面倒だな…

Unityしか勝たん…

実はUnityには、PC / スマホアプリ / ブラウザ と様々な形式でビルドデータを吐き出すことができる機能がある。

話を脱線するが、Windows上でしか動かないはずの某PCゲームが、Unityを媒介にすることでNintendo SwitchをWindowsだと誤認識して動作できたという話もある。

もとの話に戻る。

というわけで開発がくっっっっそ楽なUnityを使用してコードを書くことに決定。

【制作開始】

まずは想像図を書く。

脳内でしか書いてないから今から書きます許して。

無題

こんな感じ。

これを実現するためには、

・内部でのボックス生成機能(1箱分のプール作成)
・ボックス内カードのパック詰め機能
・開封機能
・開封カード表示機能
・開封数調整機能
・パック数管理機能
・各種ボタン

辺りが必要になる。

こうやってやるべきことを書き出すと、あとからプログラムの大幅変更をしなければならなくなるケースを回避できる。

まあ、プログラムを書く上での僕のポリシーは拡張性の高い柔軟なプログラムを書くことだが。

デカイこと言ってるけど、結局言いたいのは1つの関数にゴリゴリ機能入れるんじゃなくて、関数同士で呼び合って柔軟な動きのできる構築をしようなってことです。

ま、最後の方はかなり疲れててそんなのガン無視でゴリゴリ書いちゃったわけなんですが。

一人で2週間箱詰め状態でプログラミングゴリゴリ書くのほんとキツかった…

【プログラミング開始】

やることリストも固まったのであとは書くだけ。

プログラミングってある程度理解するとほんとに書くだけなんですよね。

やりたい挙動させるだけ。

仕様書渡して開口一番「できません。」が飛んでくるプログラマーが本当に嫌いです。(私怨

まずはテキストの読み込みから。

上2つのサイトを読み、CSVデータなるものを使うことにしました。

画像4

とりあえずカードNoとカード名と色とレアリティとマナコストを手打ちしました。

ゲームプランナーの鋼のメンタル舐めんなよ。

多分スキルがある人は公式サイトからデータぶっこ抜いた方が早いです。

最初は白のカード群から、パック生成に必要な枚数の各レアリティカードだけを入力しました。

組んだプログラムのデバッグさえできればデータの中身なんてほとんどどうでもいいんですよね。

んで出来上がったコピペキメラがこちら、

画像7

通常のCSVデータをご存知の方は「は?」となっていることでしょう。

そう、文の間の「,(コンマ)」は両側に空白を入れないのが普通です。

これには訳があります。

MTGのカードは人名を付けたりしているため、「外交官、マンガラ/Mangara, the Diplomat」のように名前に「,」を含むカードがあります。

これらを読み込みながら整理するためには予めデータの方を特殊な形式にする必要がありました。

これは僕の実力不足な部分が大きいと思われ、後悔している部分でもあります。

次への課題ですね。

続いてボックス生成プログラム。

画像5

まずは

・カードリストのテキストデータ読み込み
・カード整理用のタグテキストデータ読み込み
・読み込んだカードの整理

を行っています。

内部に全部を記入してしまうと後から中身入れ替えて遊べないので外部から入れ替えるだけで別のプールや別の整理データで遊べるようにしています。

画像6

カードの整理はこんな感じ。

ボックスの中身はレアリティ毎に枚数がほぼ決まっているので、レアリティ毎で予め整理しておきます。

ボックス内容の作成関数は、レアリティ毎に多少の遊び(枚数の前後)が有ったため冗長になってしまい、考えるのが面倒で短縮させずに放置してあります。くっそ長くて汚いので割愛させてください。

その後、ボックス内のカードをパック詰めしていきます。

これも一部の遊びによって冗長になっているため割愛。

1つ躓いたのは同じ名前のカードが入ってしまうところでしたが、チェック用のループ文を書くことで対処しました。

続いてパックの開封と描画。

画像8

カードの開封パック数と、オープン済のパック数を初期化しています。

カード画像と一緒に右側にカードのテキストデータも表示できるようにするため、各種テキストの内容も初期化しています。

画像9

更新処理では、各種コンポーネントの取得と、開けようとしているパック数の管理と、開封したカードの拡大表示のON/OFFを管理しています。

画像10

パックの開封処理です。

長くなっているのはポリ板の生成と、そこに対応したカード画像の貼り付けを行っているからです。

また、FoilカードについてはシェーダでFoilシートとの合成を行っています。

シェーダ合成は透明部分がゴニョって変になったので成功とは言えないですが…

画像11

これは入手カードをクリックで拡大表示する関数です。

拡大状態ならそれを消し、拡大状態でないなら拡大できるようにしています。

クリック判定は古典的な矩形判定です。

以上、僕が夏休みの2週間を使って書いたプログラムの大まかな概要です。

まだいくつか細かい関数がありますが割愛しています。


完成

画像13

左枠に上から15枚ずつのカードを表示、右枠にそれのカード情報を15枚塊で出力しています。

予め想定していた任意数のパック開封や、1箱単位でのパック開封もできます。

追加要素として、作成されたテキストデータの保存が可能です。

これにより、シールド戦やドラフト戦用のパックデータを出力でき、練習にも最適です。

いや~疲れた。

制作開始が8月頭、終了が8月18日のようで、合計18日。

そこから、仕様決定、カード情報のテキストデータ作成、公式サイトのカード画像拝借時間の合計約4日を引いて、大体14日(2週間)くらいのプログラミングで完成させました。


結果発表

画像14

や り ま し た

1ボックスゲット!

友人に自慢しながら開封したいと思います。

今回のコンテスト、かなり良い経験になったと感じます。

改めて、Sekappyさん、ありがとうございました。


さいごに

【完走した感想】

最後の方は夏休みが終わる前に書ききることしか考えておらず、とても見せられたもんじゃないですが、達成感と課題の両方を得られました。

僕はプログラマーでは無いんですが(重要)、もっと基本設計から見直し、最初から定義をしっかりしていればもっとキレイに書けたのかなと。

また機会があれば、今度は経験者の方も挑戦したいと思います。

【その他】

質問や意見などあれば受け付けます。

ここのコメント欄は多分気付かないのでTwitterででも話しかけてください。(@nezimaki00)

長々とした文章かつ汚いコードでしたがお読みいただきありがとうございました。


本当に就活終わらない…

夏休みの宿題やってないまま登校してる気分だな…

この記事が気に入ったらサポートをしてみませんか?