事の発端
ある日、近所の電子パーツ屋でジャンク市が開催されていました。
そこで、社内の「ものづくり部」メンバーで遊びに行きました。
店内を物色していると、箱に詰められた大量のバーコードリーダーを発見!!!

その価格、なんと1台100円!!!
その瞬間、頭をよぎったのは――
バーコードバトラー
バーコードバトラーだ!
我々にはバーコードバトラーしかない!!!!!!
…というわけで、
今回は 「バーコードバトラー」 を作ってみることにしました。
バーコードバトラーーーーーーーーーー!!!!!!!
皆様、「バーコードバトラー」をご存知でしょうか?
私は『こち亀』で存在を知り、
YouTubeにアップされているプレイ動画で
「なんとなくの雰囲気」を知っている程度です。
せっかくなので、ここで Wikipedia を開いて確認してみましょう。
バーコードバトラー(Barcode Battler)は、1991年にエポック社から発売された電子ゲーム機。または、そのシリーズ。
本体に備わったスリットにバーコードの付いたカードを読みとらせ、その数値情報からキャラクターやアイテムのデータを生成し、1vs1(バーコードバトラーII2 C0では最大4人)で遊ぶゲーム。専用のカードが同梱されてはいるが、一般商品などについているバーコードを使ってオリジナルキャラクターを作ることができるというのが肝である。
ゲームモード選択後、カードを本体にスライドさせることでデータを読み取らせ、液晶に生命力(HP)、攻撃力(ST)、守備力(DF)などのデータを持つキャラクターを表示させる。対戦モードの場合、二人がそれぞれ持ち寄ったバーコードを読み取らせた後、ランダムあるいは潜在能力(液晶に表示されない隠しパラメータ)により先攻・後攻が決められる。その後、戦闘が開始される。
ゲーム自体は非常にシンプルであり、プレイヤーの操作はゲームモードを選択すること、バーコードを読み込ませることと、交互に訪れる各自のターンに「攻撃」か「回復」を選択することのみである(バーコードバトラーII以降は魔法の使用も可能となった)。
まとめると、
- バーコードを読み取り
- 生命力・攻撃力・守備力を何らかのアルゴリズムを用いて算出
- ランダム or 潜在能力 で先攻・後攻を決定
- 戦闘開始
上記4ステップで戦闘が開始される流れですね。
楽しそうですね!早速作っていきましょう!!
バーコードリーダーの仕様
メーカー/型式
オプトエレクトロニクス社製 OPL-6845S-V-WHT-USB
読み取れるバーコード
UPC-A, UPC-A Add-on, UPC-E, UPC-E Add-on, EAN/JAN-13, EAN-13 Add-on, EAN/JAN-8, EAN-8 Add-on, Code 39, NW-7 (Codabar), Industrial 2 of 5, Interleaved 2 of 5, Code 93, Code 128, GS1-128, MSI/Plessey, Matrix 2of5, Code 11, GS1 DataBar, GS1 DataBar Limited, GS1 DataBar Expanded
日本で流通している基本的なバーコードはほとんど対応できます
PCへの入力方式
Full-Speed 12 Mbps USB(HID/COM)プラグ-A
今回のバーコードリーダーはUSB仕様、
読み取り時にキーボード入力(読み取った番号+Enter)される仕様だった
実際に作ってみた
気軽に遊びたいので、今回はWeb上で動くようにします。
Ruby on Rails 入門のついでに作成しました。
また、不正なバーコードが読み取られて競技として成立しないことを考慮し、バーコードを検証します。
そこで、Yahoo!ショッピングの商品検索APIを用いて、
「実際に商品がこの世に存在するのか」を検証します。
また、商品ごとに面白いキャラクター名を付けたいので、
Gemini 2.5 Flash-Lite を用いて、キャラクター名を生成させることとしました。
ついでに、バーコードに対する各特性も生成させてみることにしました。
ゲームの名称
「バーコードファイター」
バーコードを使って戦わせるから、「バーコードファイター」。
システムプロンプト
Geminiで生成させる際の雑に考えたシステムプロンプトはこちら
ユーザーから与えられた商品名や説明を使って、
面白く親しみのある、ソーシャルゲームに出てくるようなかわいいキャラクター名を作成し、生命力/攻撃力/守備力を出力してください。
値のMAXは 999999 です。なるべくランダム性があり、数値のMAXは大きいことも考慮して決定させてください。
また、連続した数字はインパクト的に寒いネタなので、できる限りやめてください。稀に出すことは許可されます。
バトルで燃えるような、インパクトのある値がいいです。
リクエストボディ
構造化出力を使ってバトルの際に使いやすくしています。
{
systemInstruction: {
parts: [
{
text: "{システムプロンプト本文}",
},
],
},
generationConfig: {
temperature: 1.75,
responseMimeType: "application/json",
responseJsonSchema: {
type: "object",
properties: {
character_name: {
type: "string",
description:
"ユーザーから与えられた商品名や説明を元に生成した、ソーシャルゲーム風で面白く親しみのある、かわいいキャラクター名",
},
vitality: {
type: "integer",
description:
"生命力。1〜999999 の範囲で、バトルで燃えるようなインパクトのある値",
},
attack: {
type: "integer",
description:
"攻撃力。1〜999999 の範囲で、バトルで燃えるようなインパクトのある値",
},
defense: {
type: "integer",
description:
"守備力。1〜999999 の範囲で、バトルで燃えるようなインパクトのある値",
},
},
required: ["character_name", "vitality", "attack", "defense"],
},
},
contents: [
{
parts: [{ text: "商品名: #{name}\n説明: #{detail}" }],
role: "user",
},
],
}
ワタガラス VS 新里ウイスキー
今回の選手
- 大城海産物加工所 ワタガラス
- 新里酒造 新里ウイスキー
読み込む
バーコードリーダーを使って読み込みます!
読み込まれた瞬間に、「ピッ!」という音がします。
オフィスの中で読み取り音が響くくらい大きいです。
ワタガラス 選手
新里ウイスキー 選手
Ready Fight!!!
読み込む瞬間からバトルの様子までをお届けします!
感想
「ピッ!」と読み込んで商品名が出た時、すごく楽しい気持ちになりました。
バトルは非常にシンプルなものですが、商品同士が戦う姿を見ていて非常に楽しいです。
今は一人で遊んでいますが、オフィスにいるメンバーを呼んで対戦したいなと思いました。
終わりに
近々、ソースコードを公開しようかなと思っています!
公開された際は、「レッツファイト!!!」してくださいね!
※この記事は、AI文章校正ツール「ちゅらいと」で校正されています。