[ペチパーの大冒険] ゲーム制作#19「プログラミング謎解き 中級編1」

2025/02/17

ゲーム 開発

t f B! P L
eyecatch プログラミングスクールに通っても、すぐに仕事で使えるプログラムを習得できないのは何故なのか? というのを考えてみました。 実際のプログラミングというのは、仕事で考えると、ビジネスドメインというその仕事特有の処理をちゃんと理解して、 それをアルゴリズムに落とし込むという設計も必要になるし、 それらを何度も体験する事で、課題に対するプログラミングのコツというのが分かってきます。 プログラムだけ学習してもビジネスドメインへの対応方法が未経験なのは、プログラミングを仕事で行う時にまだ未熟児という状態なワケですね。 ゲームシナリオに沿った、プログラミング問題を解くというのは、このビジネス課題と、そのビジネスにおいての作業を、どういうアルゴリズムで解くかと言う、 ビジネスドメイン対応に相当できるように思うんですよね。 実際は、いろいろな要因で、プログラミングの構築設計を行わなければいけないのですが、そのミニマム版をゲームの世界観で楽しめると言うゲーミフィケーションも 学習向上の大きな要素になるから、ゲーム学習、イケるかもしれませんね。 というわけで、今回は少し難しめの1問をご紹介します。

謎解き: 謎の暗号を解読せよ

シナリオ

古代の呪文書には、特定のルールに基づいた暗号が記されています。以下の関数 decodeMessage を完成させて、指定された暗号文字列を解読してください。

問題

  1. 入力は1つの文字列 message と、数列 key です。
  2. messageの文字は、対応するkeyの値に基づいて変換されます。 ルール: - 英字の場合: アルファベット順を基に、key の値分シフトする(ループする)。 例: key が 1 の場合 : 'a' → 'b'、key が 2 の場合'z' → 'b'。 - 数字の場合: key の値分加算し、結果を文字列に置き換える。 例: '4' → '7'(key が 3 の場合)。 その他の文字はそのまま。
  3. key の要素数が message より少ない場合、key を繰り返して適用する。
  4. messageと、keyの値は、毎回変更されてしまいます。

入力例

const message = "hello-world-123" const key = 3

出力例

decodeMessage(message, key) の結果は次の文字列になります。 "khoor-zruog-456"

解答プログラミングを打ち込む

※ decodeMessage関数を仕上げてください。

ヒント

アルファベットのループ処理には、String.fromCharCode と charCodeAt を使用すると便利です。 key を繰り返すには、モジュロ演算(%)を活用してください。

この問題で学べるポイント

  1. 文字列操作(正規表現の活用)
  2. ASCIIコードを使ったアルファベットのループ処理
  3. 配列のインデックス操作(モジュロ演算)
  4. 条件分岐と各種データ型の操作
この問題は、文字列操作や配列の扱いに慣れた中級~上級者向けの演習になります。解答が正しいか確認してみてください!

解答サンプル

回答

function decodeMessage(message, key) { const result = [] for(let i=0; i<message.length; i++){ const char = message[i] if(/[a-z]/.test(char)){ const code = ((char.charCodeAt() - 97 + key) % 26) + 97 result.push(String.fromCharCode(code)) continue } if(/[A-Z]/.test(char)){ const code = ((char.charCodeAt() - 65 + key) % 26) + 65 result.push(String.fromCharCode(code)) continue } if(/[0-9]/.test(char)){ const code = ((char.charCodeAt() - 48 + key) % 10) + 48 result.push(String.fromCharCode(code)) continue } result.push(char) } return result.join("") }

解説

mesageで与えられた文字を1文字ずつコード変換して、それをスライド処理、ループ処理するようにプログラムが書けるかがポイント。 部分的な処理は以下の通り。 - 文字列を数値(文字コード)に変換する方法 "文字列".charCodeAt() : 1文字ずつ処理する - 文字列の種別を判定 : 正規表現を使って真偽判定する /[a-z]/.test(文字列)

あとがき

プログラミングに慣れてきた人がやってみると、少し楽しめると思います。 文字コードを処理するって、普段のプログラムでも、特殊なケースであまり使うことはないかと思いますが、 例えば、入力フォームなどで、半角数値を全角数値に変換したり、英語の大文字小文字を判定したり、と、皆無なわけではありません。 ゲームでは呪文と交えて処理をすることで、シナリオ連動できるイメージもできたので、 今回のプログラム問題も、ゲームに組み込むことが可能ですね。

人気の投稿

このブログを検索

ごあいさつ

このWebサイトは、独自思考で我が道を行くユゲタの少し尖った思考のTechブログです。 毎日興味がどんどん切り替わるので、テーマはマルチになっています。 もしかしたらアイデアに困っている人の助けになるかもしれません。

ブログ アーカイブ