日記帳

プログラミングのことをつぶやく日記です。

最近ゲーム作りで見たサイト

円周率を定数で使用する

角度とラジアンの変換で円周率が必要になった。

hayakute.kantan-sakusaku.com

learn.microsoft.com

三角関数を使った楕円軌道のアニメーション

縦移動のオブジェクトの作り方を完全に忘れていたので、この辺で復習した。

gihyo.jp

wakariyasui.sakura.ne.jp

2点の物体間の直線的な移動方法

2点の物体間の移動での移動方法は知恵袋の実装をよく観察して、自分のプログラムに落とし込んで使った。

2Dゲームのプログラミングシューティングアクションを作っているのですが、... - Yahoo!知恵袋

cos - cpprefjp C++日本語リファレンス

2点のラジアンが必要なのでarttan関数を使用した。

atan2 - cpprefjp C++日本語リファレンス

構造体の要素の比較

構造体の要素Aの文字列Bを持つものはVectorの中でいくつあるのか数える必要があった。

www.appsloveworld.com

DXライブラリのαブレンド

αブレンドのイメージが湧かなかったが、パラメータを徐々に変化させる例があり参考になった。

https://dixq.net/g/39.html

「ゲーム開発 プロジェクト管理の基本」を読んだ

「ゲーム開発 プロジェクト管理の基本」を読んだ。読んだ理由はゲーム開発のプロジェクト管理について何も知らないのでWEB開発とどこが違うのか比較しようと思ったからである。

direct.gihyo.jp

TD;TL

基本的にゲーム開発もIT業界の一部であるため、ゲーム特有のプロジェクト管理は少ないと感じた。したがってこの本はIT業界に詳しい人はあまり得るものが少ないかもしれない。

製品リリースまでの流れ

  • 後の章でも書いてあったが、企画のコンセプトがぶれる、または見直しになると工程にかなりの手戻りが必要になり現実的でない
    • そのため、コンセプトはかなり吟味する必要がありそう
    • コンセプトがブレブレなゲームはたまに見るが、やっぱ見直すとなると工数が膨大になってしまうから、リリースしてしまう側面もあるんだろうと推測する
  • 開発の段階は以下がある
    • プロト版:プロトタイプ、基本部分やコンセプトの面白さなどの確認
    • α版:使用を全体的に実装して確認
    • β版:α版からバグや細かな調整をしてほぼ完成させたもの。最終確認する
    • マスター:完成版

プロジェクトの構成

  • プロジェクトの前提として前提と制約条件を明確化する必要がある
    • 前提を明確にするために、市場の状況分析や企画の経緯、組織の状況などをまとめる
    • 目的はプロジェクトをスムーズに理解してもらうための導入
  • プロジェクトの立ち上げ段階ではゲーム開発特有のゲーム開発の特徴としては「5W1Hが不明確」である
    • 本ではサッカー大会プロジェクトとゲーム開発プロジェクトの5W1Hの比較がある
      • サッカー大会プロジェクト
        • Who:サッカー大会運営者が
        • What:サッカー大会を
        • Whom:大会参加するチームのために
        • Where:サッカー競技場に
        • When:サッカーチームにとって参加しやすいシーズンに
        • How:サッカー大会を開催する
      • ゲーム開発プロジェクト
        • Who:不明(一応開発者が)
        • What:ゲームを
        • Whom:(購入者?)
        • Where:不明
        • When:不明
        • How:遊ばせる
    • こうしてみると、プロデュサーなどは不明の部分を明確化していくの仕事であると察せられる

チーム開発プロジェクトの計画管理令

  • 目的の洗い出し
    • 「小学生に県内の地理を楽しく覚えてもらう授業中に使用するゲームの開発」を行う目的があるとき
      • 楽しさと学習を両立させることが大事、またユーザーが小学生であることを考慮する必要がある
      • 「目的」と「目標」の違いについて述べている
        • 上記の目的はたどり着くべきゴール、つまりMUST
        • 目標は目指す基準、例として「ゲームのユーザーの80%が面白いと評価してもらえること」のように定義することができる
        • 目的には「行動」、目標には「結果」を設定すると良いらしい

マイルストーンを活用する

  • タスク管理や仕様書レビューの説明もあったが、ここは私にとってはあまり読まなくてよさそうだった。
  • マイルストーンの中であまり聞きなれない「パーティカルスライス」という単語が出てきた
    • パーティカルスライスとはゲームの序盤から途中までが完成しており、そこだけを切り出して通しでプレイできるというもの
      • 目的は、コンセプト確認用のプロト版と仕様がすべて実装されているα版では乖離が大きい。その乖離を埋めるためゲーム全体を正しく検証するためである
      • これだけ書くと分かりづらいが、RPGの1章だけを通しでプレイできるか?を検証することである
      • 1章の中には戦闘、マップ移動、イベント、ミニゲーム、メニューなどが実装されていて、結合して動かして確認する
      • これはゲームクリアという目標を用意していることの多いゲームならではのやり方だと思った
  • プログラムのバグについて
    • 全世界で1人しか発生しないバグがあることもあり対応が難しい
      • 著者が遭遇したもので一番不可解なものは冬の北海道のよく冷えたPCだけに発生するバグがあったらしい
        • PCを冷蔵庫に持ち込むことで再現
      • このバグに対応するかは微妙なところだなという感想
    • ゲームのコンセプトは面白いけど低品質なゲームが存在する
      • ゲームの処理が想定より重すぎて快適にプレイできない
      • 表示負荷が大きすぎてスローモーションになる
      • ロードに15分かかる
    • ゲームの低品質化はプログラマの技術力に寄与する部分も大きそう
    • 面白いけど品質がなぁというゲームは確かにあったな
      • スローモーション:地球防衛軍2、とにかく敵が多くなると重くなってまともに動けない
      • ロードに時間がかかる:クラッシュバンディクー4、ステージのロードに5分くらいかかってなかったかな?

仕様の見直し

  • ゲームは使用の独立性が低いので、こまめに見直しされると全体にも見直しがこまめに発生してタスク全体が混乱する
    • 例えばRPGで武器の仕様を変更してパラメータを一つ追加すると、戦闘の仕様、プレイヤーキャラの仕様、敵キャラの仕様、アイテムの販売、アイテム入所の設定など全体に影響を及ぼす
    • WEBアプリケーションだと、ケースバイケースだけどデータベースなどの基幹部分を変更しないときは影響範囲はここまでにはならないイメージ

不具合から出たテクニック

  • 当初、キャンセル技はなしというコンセプトで開発されたゲームがあった
  • しかしプレイヤーが仕様の穴を衝いてキャンセル技を生み出した
  • コンセプトには反するもののキャンセル技はゲームプレイを膨らませてくれるとして残すことに
  • 多彩なテクニックを駆使してプレイするようになり、ゲームが盛り上がった
    • ここまで聞くとガンダムVSガンダムのフリーダムにのみ搭載されてた覚醒キャンセルがNEXTでは全機体に搭載されたようなものか

ウォーターフォールアジャイルについての説明もあったが、ほぼ知っていることだったので目を通して終わった。

経済学から工学(夜間大学)へのシフトしたときに感じたギャップなど

この記事は社会人学生 Advent Calendar 2023 の 20 日目の記事です。私は2023年3月に電気通信大学 先端工学基礎課程(以下K課程)を卒業しました.私は、文系大学を卒業し、社会人になってから理系大学に入り直しました。K課程入学後にギャップに感じたことや卒業後の進路についてまとめました。

入学理由

こちらの記事に書いてます.

大学受験をする - 日記帳

卒業した今だから言えますが,この課程はとにかく私立中堅大学程度の学力の文系学生にはつらいことが多いです.言い換えると、最初の大学受験で数学物理化学を使わないことによって起きる弊害です。

卒業までに感じたギャップ

夜間のカリキュラムだけではCSを学ぶには足りないものが多すぎる

先端工学基礎課程時間割

https://www.uec.ac.jp/department/ie_evening/k/curriculum.html

CSのことを学びたいが、K課程のカリキュラムは幅広い工学知識をカバーする目的のため電通大Ⅱ類(「情報」と「理工」の融合)寄りです。Ⅰ類で学べるCS分野の中で、K課程で選択できる専門科目の中でおおよそ1/4程度です。CSを学びたい意欲があり、なおかつ院進学を視野に入れた卒業研究(以下卒研)をやらないのであれば、K課程は選択しないほうが良いです。私は院進学を考えていたので、専門科目のCS分野の少なさには目をつぶりました。卒研は、研究の基礎を教え込まれるので院進学するのであれば、できればやっておきたいです。

私は、CSのことを中心に学びたかったので、Ⅱ類寄りの科目である「電気回路学および演習」「制御工学」「電磁波工学」「アナログ回路実験」「信号処理論」「基礎電子工学」「電磁気学および演習」「電磁波工学 」などは、私は興味が持てなくて、特に苦労しました。これらの科目に高い興味がない人で、そつなくこなせる人は本当に尊敬しています。

逆にK課程でやってほしかった科目は、「確率論」「情報領域演習」「複素関数論」「オペレーションズ・リサーチ基礎」「コンピュータ設計論」「コンピュータサイエンス実験」「数理計画法」「グラフとネットワーク 」あたりです。昼間に時間を作ることができれば、昼間の授業を履修することは可能なので、この問題は一応解決可能です。

基礎学力の低さによる勉強のキツさ

文系大学入学時、および入学後には数学、物理、化学などの理系知識はほとんど使わなかったうえに、大学へは付属校進学だったため、入学時は理系の学力が恐ろしく低い状態でした。入学後の様々なサポートにより何とかなりましたが、一度理系を卒業して再入学した人に比べて著しい学力差を感じます。ここは後悔しても仕方なかったので、毎日コツコツやっている部分もありました。同じK課程の人々でも、文系から来た人は、軒並み辛そうです。特に1年次に受ける微分積分学で1/3~1/4ぐらいの生徒が単位を落とします。

フルタイムで働いている社会人の割合は思ったより少ない

入学して気が付いたのが、入学時に18~20歳ぐらいの学生がおおよそ1/2程度を占めていることです。残りの半分は、それ以上の年齢ですが、週5で7~8h程度勤務するフルタイムで働いている人は、さらにその半分ぐらいでした。入学時なので、その後状況が変わってる人はいましたが、最初は8割程度は社会人かなとは思っていました。後述する卒業後の進路で現職の人が2~3割なので、ここで感じたことは的外れなことではないと思います。

趣味の時間または気力が確保できない

私の平日(1年次)のスケジュールは以下の通りでした。授業時間を除いた机に向かっていられる自習時間が最長で2.5h程度でした。会社から大学までの移動時間が往復2h程度あり、行きは満員電車だったのがきつかったです。電車内も色々勉強しなくてはならなかったのですが、ヘトヘトになっていることも多かったです。

土曜日のスケジュールはおおよそ以下の通りでした。授業終わりは皆でファミレスに集まって課題をやっていました。日曜日は課題が残っていれば課題をやっていました。大体5~6時間ぐらいは課題をやっていたと思います。あとは炊事洗濯掃除などを片付けて買い物をしたりして1日が終わってました。

平日、休日ともに自由時間が夜の1h程度しかなく、仕事で消耗した気力をあまり回復することもできませんでした。なので趣味をやる気力がだんだんなくなってきました。3年次はあまり本を読む気力がなくなっていました。

時間割を見る限り4年間ギッチリ授業が詰まっています。4年生になったら卒研に集中できる昼間の学生とは違って、授業をそれなりに取らないと卒業できません。後でわかったことなのですがK課程は本来は5年で完了するようにカリキュラムを組んでいるそうです。(要出典)4年での卒業は難しく、標準修業年限で卒業できるのは令和4年の場合は4割でした。令和4年度情報理工学域卒業者等の状況│電気通信大学

入学ガイダンスでも言われると思いますが、4年で卒業するには苦労すると思います。(実はこのデータは編入組も統計の母数に入れられているので、実際の卒業率はもうちょっと上です)

仕事に使える気力が目に見えて減少している

前述したとおり、有職者にとっては、とにかく時間に余裕がないスケジュールです。そのため仕事での疲れをとる機会が中々設けることができません。実験レポートやテスト前は睡眠時間を削らなければならない状態になることもあり、精神的にきつかったです。仕事に対して使える気力が徐々に減少していき、日々の業務を如何に労力を使わないでやり遂げるかにシフトしてしまいました。本来であれば、もうちょっと頑張って成果を上げたがったですが、私の能力だと難しかったです。

健康状態が悪くなる

健康問題が結構深刻な問題だったと思います。私はK課程在学中に、病気は何度かの血尿と軽度の睡眠障害程度で済みました。精神的に苦しくてメンタルヘルスに通ってもいました。(これは、だんだん先生の予約時間と私のスケジュールが合わなくなってしまい辞めました。)白髪も結構増えました。私の友人たちも、ストレス起因の何かしらの病気になったり、精神的な病になったりして大変そうでした。自由度の低い学部の社会人学生は、日常生活へのしわ寄せが多くストレスを貯めやすいです。継続したストレスが続くようならば、長期履修も良いかもしれません。ただし過剰なストレスを受け続けると正常な判断がしづらくなるので、1年生のうちに早めに長期履修申請をしたほうが良いかもしれません。

進路について

K課程卒業後の進路は年度によって結構違います。大体2~3割程度の人が現職のままです。3割がおそらく新卒での就職です。その他は就職浪人か院浪人であることが多いです。以下が過去2年間のK課程の進路です。

2022年3月卒進路

2023年3月卒進路

院進学

私は院進学したので、これに該当します。K課程の授業だけでは、院の一般入試の範囲をカバーできないことがほとんどです。したがってそれなりの準備期間が必要になります。指導教員によっては社会人入試を勧められると思います。社会人入試は、聞いた話によると、口頭試問で大学程度の数学や物理の問題を聞かれるそうです。私は推薦入試で入学しました。指導教員曰く推薦を取れるなら、そのほうがよいとのことでした。年々、さまざまな要因によりK課程の推薦入試の難易度が上がっているので、私は運が良かっただけです。推薦入試については過去記事にまとめています。

leokun0210.hatenablog.com

就職

これも聞いた話ですが、K課程事務局に行くと企業への推薦が得られる場合があるようです。なのでその制度を使って就職する人もいるようです。周りに新卒就職するひとがほとんどいないかったので、あまり書けることはありません。

現職

私の周りでは現職が多かったです。これは特に書くことはありません。

その他

私の卒業年度では、院浪人や就職浪人が多かったように思います。2~3年次はコロナにより通学機会が少なく学生同士の情報連携が少なかったためではないかと推測しています。下の学年では、Discordなどを用いて学生間で積極的な交流をしているようです。

最後に

いろいろとりとめのないことを書きましたが、卒業して得られたものは想定範囲内であり、それを書くのは面白くなかったので、他の人があまり書かないであろう卒業後の進路や私が感じたギャップを中心に描かせてもらいました。K課程は、正直なところ私が気軽に他人に勧められるコースではなかったです。卒業するにあたり、それなりの覚悟が必要だったと痛感しています。もし、この記事が入学を考えてる人の一助になれば幸いです。

C++のstd::max_elementの計算量はO(N)なので,知らないうちに計算量がO(N^2)になる

D - Election Quick Report

競技プログラミングの上記の問題がTLEになって原因を調べた.TLEになったコードは以下の通りである.

    // 繰り返し部分のみ
    vector<ll> c(200010, 0);
    ll max = 0;
    ll t;
    REP(i, M) {
        c[A[i]]++;
        auto max = max_element(c.begin(), c.end());
        cout << *max << endl;
    }

結論としては計算量がO(MN)になるためである.(N=200010とする)制約として1≤N,M≤200000であるため,MNは最大4*1010となる.一見ループを見ると計算量がO(M)に見えるが,std::max_elementは要素の数だけ比較するので計算量はO(N)となる.以下はリファレンスより抜粋.

max((last - first) - 1, 0)回の比較を行う

max_element - cpprefjp C++日本語リファレンス

以上より,std::max_elementを使用しない実装を考える必要がある.以下のようにコードを変更した.

    vector<ll> c(200010, 0);
    ll max = 0;
    ll t;
    REP(i, M) {
        c[A[i]]++;
        if (max < c[A[i]]) {
            max = c[A[i]];
            t = A[i];
        } else if (max == c[A[i]]) {
            if (t > A[i]) {
                max = c[A[i]];
                t = A[i];
            }
        }
        cout << t << endl;
    }

以下のようにmax値を変数に持つことでstd::max_elementを使用しないようにした.計算量はO(MN)からO(M)に減った.

C++の2進数の左ビットシフト,右ビットシフトの挙動

C++の2進数の左ビットシフト,右ビットシフトの挙動を確認する機会があったのでメモする.

左ビットシフト

  cout << (1 << 0) << endl;
  cout << (1 << 1) << endl;
  cout << (1 << 2) << endl;
  cout << (1 << 3) << endl;
  cout << (1 << 4) << endl;
  cout << (1 << 5) << endl;
  cout << (1 << 6) << endl;
  cout << (1 << 7) << endl;
  cout << (1 << 8) << endl;

出力結果

1
2
4
8
16
32
64
128
256

2進数の1に対して2Kを掛けていることが分かる.

右ビットシフト

左ビットシフトと比べると,ちょっとルールが増えるので,MicrosoftのDocを参考にした.

learn.microsoft.com

  unsigned short short11 = 1024;
  bitset<16> bitset11{short11};
  cout << bitset11 << endl;  // 0b00000100'00000000

  unsigned short short12 = short11 >> 1;  // 512
  bitset<16> bitset12{short12};
  cout << bitset12 << endl;  // 0b00000010'00000000

  unsigned short short13 = short11 >> 10;  // 1
  bitset<16> bitset13{short13};
  cout << bitset13 << endl;  // 0b00000000'00000001

  unsigned short short14 = short11 >> 11;  // 0
  bitset<16> bitset14{short14};
  cout << bitset14 << endl;  // 0b00000000'00000000

出力結果

0000010000000000
0000001000000000
0000000000000001
0000000000000000

右ビットシフトは,2Kを割る処理であることが分かる.増えたルールとしては,左側の空きは0で埋める.右側にはみ出たビットは無視されることが分かる.shortは2バイトなので,16ビットである.