ボドゲ制作するときに使えそうな「3枚のカードの組合せ全網羅リスト」を取得できるプログラムを書きました
セットコレクションのメカニクスを持つゲームを作っていると、任意のカード3枚の全組合せを網羅したリストが欲しくなりませんか? 「別に欲しくない」という人の方が多い気がしますが僕は欲しかったので続けます。
経緯
今作っているゲームは3枚のカードの組合せで戦うのですが、「役」の強さはカードに記載された数字の合計で、3枚の色を揃えているとボーナス点が入るような仕組みになっています。カードは15枚全てがユニークです。
どれくらいの強さの役がどの程度の頻度で出現するかは、通常ならばカードをパターン分けして、高校の数学で習う「場合の数」なんかを駆使してスマートに出したりするのでしょう。けれど、パターン自体が一定以上多くなってくるともはや絶対間違える全パターン作って出現率を弾いた方が楽だったりします。(※表計算ソフトが扱える程度のパターン数であれば)
全パターンが手に入ってしまえば、それぞれのカードのパラメータを展開して前述のボーナスなどを加味した点数を計算するのは楽勝です。今回は15C3=455パターンしかないことも分かっているので安心です。
結果
というわけで早速書いたコードがこちら。
1年振りくらいにコーディングしましたhttps://t.co/VOkPbweKme https://t.co/gRjh0VwSjZ pic.twitter.com/dA25aGiwCH
— かく🎲遊陽ゲームズ (@SusabiG) 2020年7月20日
コピペできるようにコードも貼っておきます。このコードはそのまま Go Playground で実行して結果を取得できます。
また、A~O の文字列がカード一枚一枚に対応しています。この要素リストを増減させればカードの総枚数(種類数)を調整できます。
package main import ( "fmt" "sort" ) func main() { // 結果を格納する連想配列 result := make(map[string]int,0) // 15個数の要素のリスト list := [...] string{"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O"} // 1枚目のドロー for i, _ := range [15]int{} { // 2枚目のドロー for j, _ := range [15]int{} { // 1枚目と2枚目が同じならスキップ if (i==j) { continue } // 3枚目のドロー for k, _ := range [15]int{} { // 1枚目と3枚目、2枚目と3枚目が同じならスキップ if (k==i || k==j) { continue } // 文字列をソート arr := [] string { list[i], list[j], list[k] } sort.Slice(arr, func(l, n int) bool { return arr[l] < arr[n] }) // 文字列を結合 str := arr[0] + arr[1] + arr[2] // 連想配列に入れる if _, ok := result[str]; ok { // 既に入っていたら抜ける continue } result[str] = 1 } } } // 結果出力 fmt.Printf("要素数: %d\n",len(result)) fmt.Println("===== 以下、生成結果 =====") for key, _ := range result { fmt.Println(key) } }
出力結果が以下のように三文字のアルファベットで出るので、予め作っておいたアルファベットとカードの対応表を使えばデータを加工していけます。
エクセルやスプレッドシートで頑張る場合
実はプログラム書く前に一度スプレッドシートを駆使して欲しいリストを得ることができていました。
15枚のユニークカードから3枚選ぶ15C3パターンのリストを作った。
— かく🎲遊陽ゲームズ@ゲムマ秋両日 (@SusabiG) 2020年7月19日
①15枚に15進数の各値を割り振る
➁15x15x15パターンの総当たりリストを作成
③リストの文字列を1文字ずつ分解して昇順ソート
④3文字中2文字が同値の行削除
⑤重複パターンを削除
無事455行を抽出。
参考 https://t.co/JOs4rxElM8
何やらテクニカルなことをしてリストを生成していますが、説明は省きます。ちなみにデータの加工がすごくめんどくさかったのでオススメしません。
まとめ
3枚の組合せ全網羅リストを取得するプログラムを作りました。15枚のユニークカードを前提としたプログラムになっていますが、要素リストの行を書き換えることで枚数は調整できます。
3枚のセットコレクションはかなりたくさんのゲームで使われている仕組みですし、今後もそういうゲームが多く生まれるのではないでしょうか。そんなゲームを作るときには、このブログ記事を思い出して前述のプログラムをぶん回してもらえば良いかと思います。
一応、個人利用の範囲内で使って頂き、使ってお役に立てたならこの記事についてツイートしたりメンションくれたりするとぼくが喜びます。
自家シュリンク包装をやってみて感じた利点と欠点
今はもうシュリンク包装やっていないのですが、またやるかもしれないので備忘録。
自家シュリンク包装をする一番の理由は「見栄え」と思います。一通り機材を揃えて試してみたのですが、今はOPP袋で済ませています。
目次
機材
使用したヒートガン、シーラー、シュリンクフィルムは以下の通り。
作業手順
以下の手順で包装しました。ヒートガンだけでフィルムを収縮させるのは手間だったのでトースターを併用することで時間短縮を計っています。
①ロールからハサミで必要な長さだけのフィルムを切り取る
②片端をシーラーでカット
③箱をフィルムに入れてシーラーで閉じる
④つまようじでフィルムの2箇所に穴を開ける
⑤トースターで加熱
⑥ヒートガンで細かいシワを伸ばす
オーブントースターを使ったシュリンク包装を試しました。
— かく🎲遊陽ゲームズ (@SusabiG) 2019年9月16日
【条件】
・箱寸法120x85x27
・ロール型シュリンクフィルム(20ミクロン厚)
・190度で12秒加熱
・連続して15個を包装
・合計所要時間:約30分
・加熱工程所要時間:約5分
・トースターは網が汚れていたのでアルミホイルを敷設
(続く) pic.twitter.com/ncc9Rs4VJb
最初は1個あたり2分くらいかかりましたが、作業に慣れていけば1個あたり1分くらいでできそうです。
シュリンク包装の利点と欠点
OPP袋への袋詰めと比較した場合の利点と欠点は以下の通りです。
利点
- 機器の減価償却をしてしまえば安い
- 製品感◎
欠点
- 作業を並列化しずらい(もう1セット用意できれば解決はする)
- 電力消費多いのでブレーカー注意
- 高温を扱うので「ながら作業」ができない。暑い。
やってみた感想
綺麗!これお店に並んでいるやつだ!
シュリンク包装をやってみようと思ったきっかけは「包装作業を短縮できないか?」という悩みだったのですが、それに対しては「作業を効率化すれば時間はOPP袋とそんなに変わらない」という結論です。ただ、シュリンク包装では「ながら作業」ができないのが僕にとっては大きな欠点でした。夜中にグダグダとyoutubeやアニメを見ながら作業する僕のスタイルとは噛み合わせが悪かったからです。また、狭い部屋に機材を広げて作業するのはめんどくささが勝ってしまいがちでした。
シュリンク包装は店頭に並んだ時に最も良さを発揮します。一方、商品を対面でアピールできるイベントや物理的な商品棚の無い通販サイトでの販売ではあまり効果が見込めません。(きちんとしている感は出せるので無意味とは思いませんが)イエローサブマリンなどの店舗委託のように他の商品と並べて置かれるシチュエーションではシュリンク包装ができるとベターでしょう。そのあたりは販売方法によって変えても良いかもしれません。
ものぐさな僕はすっかりOPP袋に回帰してしまいましたが、200~300個くらいまでの生産なら頑張れると思います。それ以上になってくると作業スピード重視でOPP袋で簡易的にやってしまいたくなる、という所感です。初期ロットが1000個とかならお金で解決した方が良いでしょう。
まとめ
- 「商品感」はテンションが上がるのでやってみると楽しいし、小ロットできっちり作っていくのには良いと思います。
- 作業の並列化や「ながら作業」に難点があるので、中ロット規模の作業では負荷が高くて大変かもしれません。(個人差あり)
- 販売の形態によってOPPと使い分けるのもありだと思います。
ゲムマ初参加時の生産個数の決め方の一例
「ゲムマ初参加で何個作るか」はTwitterで定期的に上がってくる話題の1つです。多くの場合、「売れそうか?」という製品ポテンシャルや宣伝力の面から語られているように思います。遊陽ゲームズ初参加で制作した『忍尾将棋』では違うアプローチだったので、それについて書いてみます。
結論を先に書いておくと「総原価と利益率を先に固定しておいて、原価と品質のトレードオフの中で生産個数が決まってくる」です。何かお堅い感じがしますが、誰かの参考になれば幸いです。
目次
- 前提
- STEP1: 総原価と利益率を決める
- STEP2: コンポーネント仕様パターンを複数作って原価計算
- STEP3: STEP1~2により、仕様パターン毎の各種パラメータが決まる
- STEP4: 一番良さげな仕様パターンをエイヤッと選ぶ
- あとがき
前提
ここはサークルの活動方針などを書いているので読み飛ばして貰っても問題ありません。
遊陽ゲームズは活動方針として「作り続けること」を大事にしています。作り続けるためには金銭的な話題は避けて通れません。金銭的な安心・安定を得られることによって、もっと面白いコトや品質の高いゲーム作りにチャレンジしていけるからです。(趣味の活動で借金を背負うのも精神的によろしくないので。。。)
という訳で、初戦で大敗しないためにも金銭的な安全を優先して「使う金額の上限(総原価)」と、投資回収ラインと販売価格に直接関係のある「利益率」を決めました。利益率については、「原価に近い金額で販売するのは界隈全体へのダンピングに繋がるのできちんと利益を確保する」というのをサークルのポリシーとして決めていました。(変に意識高い)
サークル立ち上げ時にしたためた文章はこちら。ご興味あればどうぞ。 susabi-games.hatenablog.com
STEP1: 総原価と利益率を決める
まず、総原価(投資できる金額)と利益率を決めます。
イベント販売のみで考えるとおおよそ以下の数式で必要なパラメータが把握できます。イベント出展料や各種経費を原価に乗せるかはお好みで(うちは乗せてました)。
※以降、原価や原価率などは基本的にゲーム一個当たりのものを指します。
- 総原価=生産個数 x 販売価格 x 原価率
- 原価率=1 - 利益率
- 原価=販売価格 x 原価率
- リクープ個数=総原価 / 販売価格
上記パラメータのうち、当サークルでは総原価と利益率を固定しました。利益率が固定されるので原価率も固定です。そうなると、生産個数・原価・販売価格・リクープ個数(原価回収ライン)のいずれか1つでも決まれば自動的に全てのパラメータが決まります。この4つのパラメータの内、どれを次に検討するかというと「原価」です。コンポーネントの品質に直結する原価のコントロールが大きな課題だからです。
つまり、総原価と利益率を固定して、問題を原価と品質のトレードオフにまで絞り込んだということになります。
原価はコンポーネント仕様とその品質によって決まります。原価を低減するには、印刷のグレードを下げる・既製品を使う・原材料から手作りする…などがあります。
自分の理想のゲームを作れるのが同人の醍醐味なので、品質を妥協せず原価を固定する方法ももちろん十分ありです。その場合は販売価格(=利益率)、生産個数(=総原価)などで調整することになります。この場合も生産個数を増やすことで品質を維持したまま一個あたりの原価を下げることができますが、リクープ個数が増えたり多量の在庫を抱えたりといったリスクが生まれます。
STEP2: コンポーネント仕様パターンを複数作って原価計算
原価と品質のトレードオフにまで絞り込んだので、具体的にいくつかのコンポーネント仕様パターンを検討していきます。通販や100均を探し回ったり実際に材料を集めて試作してみるなど、ここに多くの時間をかけました。
まずはゲームの主要なコンポーネントに優先順位をつけ、順位が高いほど「妥協できない要素」として扱います。ぶっちゃけ何も妥協したくないのですが、もう原価と品質にしか調整の余地が残っていないので心を鬼にして順位をつけます。
忍尾将棋では、
カード > 箱 > プレイマット > 説明書 > サマリーカード
を優先順としました。
ベストと思われる仕様を作ってみて販売価格やリクープ個数が満足できればハッピーです。しかし、ベストな仕様そのままでGOできるかというと、多くの場合そう上手くいかないものです。となると、優先順位が低いコンポーネントから順に原価低減のための工夫をしていくのですが、そもそも優先順位が高いコンポーネントほど原価が高かったりするので、最終的にはそこにもメスを入れていく必要があったりします。ゲーム性を変えずにグッと原価を下げられるなら、情緒的な体験を犠牲にすることも考えられるでしょう。(例えば、大量のチップを使わずにダイスでリソース量を表示する、などです)
忍尾将棋でいうとプレイマットは布から手作りにし、箱は貼り箱ではなく市販の折り箱に印刷したシールを貼る方法で原価を抑えています。その2つで原価が大きく抑えられたので、カードはマットPPにしてカードスリーブを付けることもできました。ちなみに、検討の過程では「マスの交点に当たる部分6か所にマーカーを置いて12マスの格子を表現する」という案がありましたが、プレイアビリティの観点から却下したりしました。他には、箱を「100均のペンケース+紙のスリーブケース」とする案もありました。
コンポーネントに工夫を凝らすのは面白く、人生で一番100均巡りを楽しめました(笑)
自作プレイマットは、使い勝手と原価の低さを両立したちょっとした発明だったと思います。(量産ができないので今は作っていません)
💠忍尾将棋こだわりポイント③
— かく🎲忍尾xダグ8コラボ中! (@SusabiG) 2019年5月15日
【プレイマット】
・コンパクトに収納できる
・折り目を気にしなくて済む
・コマ(カード)をストレスなく取れる
など、プレイ感を考慮して厚めの生地で作りました。
ハトメで格子を表現するのはちょっとした発明だったのですが、手作業で作るので大変(^_^;) pic.twitter.com/5ZaVcYBuRS
STEP3: STEP1~2により、仕様パターン毎の各種パラメータが決まる
仕様パターンを松竹梅の3パターンくらい作ったら、冒頭の数式に原価をぶち込んでみて生産個数・販売価格・リクープ個数などを確認します。(実際は生産個数によって原価が変わるので、仕様パターンを作る時点である程度は生産個数のアタリを付けておく必要があります)
機械的に数値を入れたらそれを眺めたり変えたりしながら調整可能な金額感がどれくらいなのかを把握します。もし「販売価格が高すぎてこれはさすがに買ってもらえない」や「リクープ目標が高すぎて原価回収できそうにない」などとなれば前のステップに戻って見直します。
STEP4: 一番良さげな仕様パターンをエイヤッと選ぶ
あとはもう勘と度胸です。後悔しない仕様パターンを選びます。
Twitterで複数の制作者さんがつぶやいているのでそれを参考にしたり質問したりするのが良いでしょう。また、「ペンとサイコロ」さんのアンケートは客観的なデータとしてある程度参考になります。
あとは事前にゲームマーケットに行って「どんなゲームがどういう仕様で出していて何個くらい売れていそうか」を観察し、肌感を持っておければなお良しです。
あとがき
趣味の活動のはずなのに仕事みたいなことやってんなぁという感じですが、Quality-Cost-Delivery の最適解を探すのは楽しかったです。
また、金銭面の条件を固定したため、品質と原価のトレードオフになり「沢山の人に遊んで貰いたければ、なるべく品質を落とさずに原価を下げる努力をしないと数が作れない」となったのは良い方向に働いたと思います。
結果はというと、お世話になった人への謝礼などを除いた販売用88個を完売することができました。仮にリクープしなかった場合でも、投資金額(総原価)を抑えているため心が折れるほどのダメージにはならず、再チャレンジできたんじゃないかなと思います。
ただし、当たり前なのですが、お金回りをきちんと考えているかと買ってもらえるかどうかはあまり関係がなく、宣伝活動による認知によるところが結構大きいです。それでも、ゲームのクオリティとお金のバランスは避けては通れないですし、そのための努力には価値があると考えています。「制約がクリエイティビティの源泉である」というのはゲームに限らずエンタメ業界全般で言われていることなのですから。
『忍尾将棋』大会シーズン2開始とコルクコースター追加について
※現在はコロナのため交流会の開催を停止しています。今後の開催やコースターの追加は未定です。
本記事は忍尾将棋の交流会運営について記載するものです。
交流会および大会の基本的な情報は以下の記事をご覧ください。
シーズン2(2020年7月~10月末)で追加されるオリジナルコルクコースターは 「鎌」「双」「銃」「鉤」です。
シーズン2に入って初めてとなる第五回交流会は、こちらのtwiplaから参加表明の上、ご参加ください。
Garakutarium ~Artifact or Fiction~ English Manual
English manual are located in Q&A support page!! susabi-games.hatenablog.com
Evilpact English Manual
English manual are located in Q&A support page!!(text only)
susabi-games.hatenablog.com
ゲームシステムを作り込んでいくときのTips
ゲームの大枠が決まり、「さあ作り込んでいくぞ!」というときに気を付けていることやチェックの観点について、記事のネタにしようと思って貯めていたモノ達を供養する記事です。それぞれ腰を据えて書くのが億劫になったので、とりあえず公開してしまいます。気が向いたら個別に記事書くかもしれません。
内容はだいぶ偏っています。ゲームジャンルや対象ユーザによって変わるだろう話もあるので、普段ぼくが作っているようなゲームをイメージして読んでもらえると良いかと思います。思いつきの内容も多いので、根拠や具体例が無かったりするのもあります。
以上、諸々踏まえた上でお読み下さい。ご意見・感想・ディスカッション歓迎。
- プレイヤーは勝利から逆算してアクションを決めるので、報酬の置き方を変えると同じシステムでもアクションが変わる。
- プレイヤー間の干渉が強いゲームほど「相手を得させない」方向に力学が生まれやすくなる。
- プレイヤーのやりたいことはなるべくやらせてあげる。必殺技カードがあるなら1ゲームに一度は必ず発動できるくらいが良い。山札に入れちゃうと引けなかったら使えない。
- アクションの結果を理不尽と感じないようにする。リスクとリターンが異なる選択肢を用意して選んでもらうと、自分の選択の結果は理不尽と感じにくい。
- 非公開情報の種類と数はなるべく絞る、もしくはプレイヤーに意識させない。絞る場合のマジックナンバーは3。プレイヤーにカウンティングさせるかどうか。大量の山札はカウンティングさせない意思表示になる。
- ヒトが覚えておけるカードは多くても5~7種類までと思え。サマリーがあってもだ。
- 1つのアクションカードでできることは原則1つにする。複数の意味を持つカードは上級カード。
- ゲームがどういう局面になっているか(進度やトッププレイヤー)が分かるようきなっているか?ワーカー増やすのやめて得点行動に移るタイミングとか、アイツを止めないとゲームが終わるとか、ライフが少ないからリーサルに注意するとか。
- 手番の流れで触るものの順番を意識してコンポーネントのUI的なデザインや配置を決める。手があっちこっち行かないように。適切な配置は、特定の処理を忘れないようにするのにも効く。
- 注意をどこに向けたいか、感情をどう動かしたいかなどによってシステム的に不必要なルールやコンポーネントを追加しても良い。
- 負け抜けルールは1ゲームが短いゲームでしか採用しない。待ち時間が暇だから。脱落するタイミングが終盤に固まるなら許せる。
- 意図的に強いカードや弱いカードを混ぜるとそこが駆け引きや状況判断の起点になる。全てのカードが同じくらいの強さだと平坦で無味乾燥なゲームになる。
- ゲームのゴールに向けて、プレイヤーが適切な中間目標を設定できているか?また、それが明示されているか?
- バランス調整の起点となるのは平均的な強さのカードではなく、最弱のカード。
- ルールはとにかくシンプルさが大事。迷ったら削る方向で。
- ゲーム中で一番面白い瞬間はどんなシチュエーションか?それはどれくらいの頻度で起こるか?
- 先手有利/後手有利 問題への対策はおおまかに、システムでバランスとるか、2本先取制にするか、カードでバランスとるかの順で検討する。小手先のカード調整で対応しようとするとたぶんハマる。情報が重要なゲームの場合、情報が出てくる順番も加味しておく。一見先手有利だったとしても、たいてい情報アドバンテージは後手にある。
- ターンの最初にドローか、最後にドローか。たいていの場合は最後にドローの方がテンポが良いが、相手のターンに行動や意思決定があるゲームでは最後ドローによる行動の選択肢や意思決定が影響を受ける。
気が向いたら随時追加していきます。