この記事は 一分で読める小ネタのカレンダー | Advent Calendar 2023 - Qiita の7日目
たまにはロジックを考えよう
- 以前はバックエンドもフロントエンドもやっていたし、iPhone ユーザなので Objective-C でアプリを書いてたこともあるんだけど、現在は SRE って職能でお仕事をさせてもらっていて、正直プログラムを書く機会は激減してる
- なので勘所を失わない程度に各言語でプログラムを書く練習をしてる
- 先日書いたように、深掘り対象にしているアプリ(パズルゲーム)のロジックを考えてみようって話
- 自分の好きなゲームでやってみるといいよ
- もちろん言語はなんでもいい
- 複数の言語で、その言語仕様に則った書き方で書いてみるとか、テストを書くとかすると楽しい
今日の本文はここまで。以下は時間外w
今回のターゲットは
- Easybrain ってとこが出しているナンバーサムというゲームがありまして
- ルール等はリンク先を見てもらうとして
- デイリーがあるので1日1問新しい問題が必要
- レベル(ってわけじゃないけど)好きにプレイできる問題がたくさんある(通信追いかけてまで中身見てないので全員同じ問題が提供されているのか、それともランダム生成なのかはわからない)
- というわけでたくさん問題を作るプログラムを考える
問題から逆算して仕様を考える
- 縦横のマスは4から9程度(画面サイズの制約かな。説明文は3x3-10x10ってあるけど見たことない)
- 縦横の合計の数字になるように数字がランダムに配置される
- 0は使用されない
- サンプルの画像にはマス目側に2桁の数字があるけど、実際は見たことないかも(とりあえず1から9までと仮決め)
- モバイルアプリの仕様なので、タップでとか長押しでとかは一旦放置
- ヒント処理もモバイルアプリの仕様ってことでいいはず(CLIで表現するの難しいし)
- ミス判定処理も考えない(問題を作ることだけに専念)
- 今のところ別解がある問題は見たことがない
- 手軽にランダムに何問でも作れるのが望ましい
- ということは
- 縦横の数を決める(4から9)
- 固定はちょっとね
- 引数渡しがベター
- ランダムにして何問も一度に作れる1つのプログラムにしちゃうのも悪くないけど、それは UNIX 哲学から外れるかな
- 生成処理を実行する
- 問題が出てくる
- 縦横の数を決める(4から9)
- という感じになりそう
一旦避けていいものも考える
- 実際の業務ではだいたい許されないけど、細かいこと考えすぎて手を動かせないより、諦めていいことはすぱっと諦めて作ってみたほうがいい
- 可能なら後から追加すればいいのだから(先の仮決めのように)
- なんとなくダメに見える問題は許容する(1とか2ばかりの4マス面とか)
- 別解はなるべくなくす(検算機能は別の話)
- issueとして検討課題にしておくといい
できた
- これをこうしてこうじゃ。ってポケモンは世代じゃないので元ネタよく知らないんだけど
- 頭の体操だと思って読者のみんなもぜひ考えてみて欲しい
※画面はスプレッドシートに貼った合成です。実際解けるのでやってみて。
おわりに
- ロジックを考える癖はあって困らないので時々がんばろう
- TTP(徹底的にパクる)ってやつ、あんまり好きじゃないんだけど、個人の頭の体操なら許されるかなって
改善依頼
- (別の、あなたが好きな)このゲームのロジック考えたぜ、とか
- 仕様検討における注意点とか
- パズルゲームの検算(実際検算やってない)で、別解がないことを保証する方法ってないですかね?(人力しか経験がなくて。。。w)
- 自動回答するロジックを書いたらそのロジックに依らない解法で解けるケースがぬける?