この記事はデジクリAdvent Calendar 2025 2日目の記事です。デジクリは芝浦工業大学の創作サークルです。デジクリについて、詳しくは芝浦工業大学デジクリをご覧ください。1日目の記事はnewtさんの「サークル内SNSの投稿から投稿者を判定する分類器を作ってみた」ですあいさつこんにちは気分はハードウェアエンジニアのたここです。アドカレ2日目です!このアドカレはテーマが特に決められていないみたいなので、(公序良俗に反していなければ)なんでも書き放題です。ヒャッホー!とりあえず川柳を書きますねむねむいねむねむねむいねむねすやぁあと、叫び声に使えるゲームタイトルTier表とか作ろうと思ったんですけど、フリーダムなアドカレ2日目で飛ばしすぎると後続の人が書き方に困りそうなので自粛します。クライマックスは最後に持っていったほうが良いですよね記事で扱う内容を真面目に検討したところ、ややこしいカードゲームをどうやって楽に作ろうか考えているたここの脳内を文字に起こすことになりました。読んでいってくださいカードゲームを作ろう!皆さんカードゲームは遊んだことありますか?まぁカードゲームと一言に言ってもかなり定義が曖昧なのですが、ここではざっくり「特殊効果の書かれたカードがいっぱいあるゲーム」を指すことにします。ポケポケとか大富豪とかのことです。図1:カードゲームの例アレ〜かなり面白いです。カード効果の組み合わせを脳内で考えるだけで無限に楽しめます。実際に使ってみると大抵はうまく行かないのも含めて面白いです。奥深い...そんなカードゲームを作りたいと思ったので作ります作ろう作るぞ作ると、いつもならいきなりコードを書き始めるのですが、今回は過去を振り返って反省から始めようと思います。(あと、今はノベルゲームをグループで制作中なので実際の制作には進みません。考えて計画を立てるだけにします)まずは反省から実を言うと、過去に一度だけカードゲームのようなものを作ったことがあります。拙作『無限神経衰弱』では、無謀にも神経衰弱とカードゲームを混ぜようと試みました。アレも勢いで作りましたがまぁまぁ面白くなったのでOKです。%3Ciframe%20width%3D%22560%22%20height%3D%22315%22%20src%3D%22https%3A%2F%2Fwww.youtube.com%2Fembed%2FFn1njmv74OU%22%20title%3D%22YouTube%20video%20player%22%20frameborder%3D%220%22%20allow%3D%22accelerometer%3B%20autoplay%3B%20clipboard-write%3B%20encrypted-media%3B%20gyroscope%3B%20picture-in-picture%22%20allowfullscreen%3D%22%22%3E%0A%3C%2Fiframe%3E%0A動画1:前に作ったゲームのPVあのカードゲームを作る時に一番大変だった点は、やはりカード効果を実装する段階です。どんな作り方をしていたのかと言えば...何番のカード効果が発動したか?1番なら手数を1増やす2番なら隣のカードもめくる3番ならお金を増やす4番なら...このように、カード効果を追加する度にコードも書き足していったので負担がヤバかったです。ゲーム制作、使い回せるところは使い回せるようにしないと作業量が大変なことになります。1週間で作り終えると決めていたとは言え、もっと良い方法があったんじゃなかろうか。そんな理由から前作はカード効果を7種類しか用意できなかったのですが、これから作る『無限神経衰弱2』はカード効果を100種類くらい用意してやりたいと思っています。なのでカード効果を実装する仕組みについては特に計画を練ってから作り進めたいところです。図2:無限神経衰弱2のイメージカードゲームの仕組みを考えよう!長い時間をかけて、便利で万能な基盤を作ったとしても、一部の機能しか使わなければ本末転倒なので、ゲームを完成させるために必要最低限の仕組みを用意して楽していきたいです。なので、まずはカード効果から考え始めることにしました。その後に、それらを素早くゲームにできる仕組み(ゲームエディタとも言うのかも?)を考えていきます。回収時、手数を2増やすめくった時、手数が0であれば手数を最大手数に戻す揃った時、他のめくられたカードは全て裏向きになり、その枚数分手数を得るめくった時、他のカード1枚を自身と同じにするめくった時、隣り合うカードをめくる回収時、所持コイン/30倍スコアするめくった時、他のランダムなカード1枚を破壊する。破壊されたカードのスコア分だけ自身のカードのスコアを倍にするスキマ時間にたくさんカード効果を考えました。結構楽しかったです。その一部を抜粋したものが上になります。この混沌なカード効果たちをさっさとゲームにできる仕組みを考えていきます。うーん「めくった時」とか「揃った時」とか、どのタイミングでカード効果が発動するのかは絶対に決める必要がありそうなので、カードごとにトリガーを設定できる仕組みを作っておけば楽できそうです。また、「他のカード1枚を」とか「隣り合うカードを」とか、どのカードを効果の対象とするかを指定できる仕組みもあると便利そうです。あと、「所持コインを基に」「破壊したカードの枚数だけ」みたいな、プレイ状況からフィードバックを受けるものについても考えないといけないです。カードごとに値を持たせて、それを簡単に増減させたり参照できるようにするとかどうでしょうか。結果に行き着くまでの過程は今話したような仕組みを使い回して楽できそうですが、「めくる」「破壊する」「スコアを倍にする」といったカード効果がもたらす具体的な効果については流石に1つ1つ実装していくことになりそうです。...と、検討に検討を重ねていたら、「いつ」「誰を」「何を基に」「何する」この4要素で全てのカード効果を表現できる気がしてきました。こいつらを積み木みたいに重ねていけば、いくらでもオリジナルなカード効果を作れそうです。作業効率化の糸口が掴めてきた気がします。図3:カード効果は4つの要素で表せる?言語を作ろうそんなわけで、上の4要素をどうやって記述するかを色々考えたんですけど、プログラミング言語みたいなモノを自作してしまえば良いんじゃないかと思いました。図4:カード効果はプログラミング言語っぽく書けるんじゃないか「何する」を処理するためには「いつ」の判定が必要ですし、「何を基に」は「何する」がある前提で存在できます。カード効果の処理って、要素ごとで順番に判定していくことになりそうです。これってプログラミング言語してる気がします。ということでプログラミング言語作りました。前にDTMを勉強した時に作ったコード進行は「たここ進行」と名付けたので、この言語は「たここ言語」と命名することにします。たここ言語、良ければカードゲームを作る際に使ってみてください!デファクトスタンダードにしたいので!!!たここ言語の紹介図5:傲慢不遜たここ言語はカードゲームのカード効果を楽に記述するためのプログラミング言語です。カード効果を「いつ」「誰を」「何を基に」「何する」の4つの視点から具体化して記述する雰囲気が強いです。大体このロジックで動きます区切りまで読み取る読み取った内容に応じて処理を行う(読み取った内容に数値が含まれていた場合は処理に数値を渡す)文末でなければ 1. に戻る。文末であれば次の行に進む例えば回収時、手数を2増やすは、trg gotint n=add_002efc hand_nと書くことにします。説明されなくても何となく意味が分かる。一応説明を書くと、trgは、「同じ行内の文章は『いつカード効果が発動するのか』について記述している」と明示します。次に読み込まれる文はgotなので、このカードは回収した時に効果が発動するようになります。intは、何かしらが保持する数値をいじる際に記述します。次に読み込まれる文字列はnとなっていて、nとはカード自身の持つ数値を指す、とたここ言語では決められています。なので、次に続く処理はカード自身の持つ数値を変更します。次に読み込まれる文字列はadd_002なので、nに2が足されます。efcもtrgと同じように、「『どんな効果が発動するのか』を以降の文は記述している」ことを明示します。efcの次はhand_nが読み込まれるので、手数をnだけ増やす効果を発動させます。さっきnを2にしたので手数は2増えます。こうして文字に起こしてみると、だいぶ言語としての体裁がなっている気がしてきました。良い。そういえば上の例なんですけど、trg gotefc hand_002でも同じことになります。別にnを介さなくても、直接数値を書き込めば同じ事ができます。n要らなくない?と言われれば...まぁそうなんですが、「他の数値を参照した際にその数値を倍にする」みたいなややこしいカード効果も思いついてしまったので、そういったカード効果の対象になるか否かをしっかり明示できるようにnを用意しました。他の理由としては、trg gotefc hand_destroyedCardsScoreみたいに、効力に当たる部分にどの値を参照するかの文字列を直接入れられる書き方を許すと、言語の実装が大変そうだという理由もあります。trg gotint n=destroyedCardsScore efc hand_nこっちのほうが作るの簡単そうです。他のカード効果も書いてみます。めくった時、隣り合うカードをめくるtrg turnedget cards=nextdoor_004efc turn_cardscardsには他のカードの情報を入れられます。他のカードに影響を与えるカード効果を発動するとき、cardsを参照すればnと同じように処理できるってワケです。めくった時、他のランダムなカード1枚を破壊する。破壊されたカードのスコア分だけ自身のカードのスコアを倍にするtrg turnedget cards=other_001efc destroy_cardsint n=destroyedCardsScoreefc double_ndestroyedCardsScoreと記述すると、カード効果によって破壊されたカードのスコアを参照できます。めくった時、手数が0であれば手数を最大手数に戻すtrg turnedint n=handiff n=0int n=maxhandefc hand=n「もし〇〇であれば」みたいな条件文も書けるようにしたいな〜と後から思ったので条件式みたいなものも追加しました。iffの後に続く文章で間違ったことを言っていれば読み込みは中断されます。他にも色々考えたので下に全部まとめておきます。表1:たここ言語お疲れ様でした疲れた~いつも燃え尽きがちで、着実に進めていくゲーム開発に憧れを持っていたので、「次作るゲームは手を動かす時間以上に計画しよう」と考えていました。今回はかなりゲームの土台を固めることができたので個人的には大満足です。カービィのエアライダーで最近有名な櫻井さんも「内圧を高めろ」と、カタチにしたい欲求を我慢して計画し続けろ!みたいなことを言っていた気がしますし、このゲームの開発は最後まで上手く行きそうです。図6:内圧を高めていけ懸念点としては、ゲームの土台を固めたことでゲームがつまらなくなる可能性です。新しいカード効果や仕様を考える時、思考の方法が上に挙げた4要素に偏って、行儀の良い真面目なゲームになってしまいそうです。別にいきなりトランプタワーを作り始めても良いですし、カードを茹でて作られたパスタで経営シミュレーションを始めても良いと思います。型にハマらないようにしていきたいです。おわりにここまで読んでいただいてありがとうございました。頭の中をそのまま書き出すイメージで記事を書いてみました。今見返してみると、扱っている内容は技術寄りなのに、技術記事とは言えない、変な曖昧さの含むムズムズした文章になった気がします。「アーキテクチャ」とか「システム設計」とか、言いたいことを的確に表現できる専門用語はあったと思うんですけど、理解していない言葉はあんまり使わないようにしているのでこんな書き方になったんだと思います。あと、そういうことを知らない人でも読めるような文章を書きたかったというのもあると思います。サークル内で開かれているアドカレなので多分サークル員の方が多く読んでくれています。プログラミング勢そんな多いワケじゃないので...いや〜でも誤用を恐れずに専門用語書き殴っても良かったかもな〜!このままじゃ一生使いこなせないままかも...技術のことも勉強して、分かりやすさと正確さの両方を備えた文章を書けるようになりたいところですね。最後までまとまりのない文章になりましたが記事は以上になります。明日の記事はさばみそさんの「コンビニのシール印刷機能でステッカーを作ってみた」です。たここもステッカー作りたいと思っているのでこれは気になりますね...お楽しみに!