セキュリティを楽しく学ぶ、触れる。セキュリティごった煮ブログ

ネットエージェント
セキュリティごった煮ブログ

 コース:元祖こってり

「元祖こってり」記事はネットエージェント旧ブログ[netagent-blog.jp]に掲載されていた記事であり、現在ネットエージェントに在籍していないライターの記事も含みます。

趣味で(というより業務の合間に)作っているゲーム(?)について

愛甲健二

 こんにちは、愛甲です。今日は私が趣味で(というより業務の合間に)作っているゲーム(?)について紹介したいと思います。正直、セキュリティとはまったく関係ありませんが...(汗)。

-----

■Robocode(ロボコード)
 Robocodeというプログラミングゲームをご存じでしょうか? Robocodeとは、Javaを使ってプログラミングしたロボット(戦車)同士を戦わせるというゲームであり、RobocodeのWebサイトからフリーでダウンロードできます。
 プレイヤーはロボットを動かすプログラムをあらかじめ記述しておき、そのプログラムをソフトウェアに読み込ませて他プレイヤーと対戦します。Robocodeは、戦車を操作して戦うゲームなので「戦車の移動」や「どの角度に弾を発射するか?」などをプログラミングする必要があります。プレイヤーが直接ゲームのキャラクタを操作するわけではなく、あくまでもJavaというプログラミング言語を通してキャラクタを操作するところが、一般的なコンピュータゲームとは大きく異なる部分です。
 Robocodeは、もともとはJavaプログラミングの学習用教材として開発されたようですが、現在は.NETにも対応しており、学習用に留まらずに多くのユーザから利用され、大会なども開かれています。実は、私も以前Robocodeをやっていた時期がありました。ただ、私自身Javaや.NETについてはそれほど知識を持っていませんでしたので、すぐに止めてしまった経緯があります。

■アセンブラで記述したい
 Robocodeはとても面白いのですが、やはりJavaや.NETよりもアセンブラで記述したいのがリバースエンジニアの本音です。というわけで、アセンブラを利用したプログラミングゲームを新たに作成しようと考えました。実行ファイルはこちらからダウロードできます(まだまだ開発の途中なので不具合が多くあるかと思いますが...)。
sg1 プレイ画面は右図のようになります。上下にある赤と青のテーブルを動かして真ん中にあるボールを打ち合うゲームです(普通です(汗))。上下のテーブルはアセンブラライクなスクリプト言語で操作できるようになっており、下がscriptフォルダ以下のred.kbファイル、上がscriptフォルダ以下のblue.kbファイルを読み込んで適用しています。
 毎フレームごとにプレイヤーが用意したスクリプトが呼び出され、テーブルの動作を決定します。スクリプト側では、呼び出された段階で以下のデータにアクセスできます。

 1. 自テーブルの位置(x, y)サイズ(width, height)
 2. 相手テーブルの位置(x, y)サイズ(width, height)
 3. ボールの位置(x, y)サイズ(width, height)

 さらに出力結果として、テーブルの移動方向(上下左右)をセットします。これらのメモリマップは右図になります。
sg2 レジスタはeax、ecx、edx、ebx、esp、ebp、esi、ediの8つと、cmp命令の結果を反映させるflagレジスタのみ用意しています。
 スクリプトが呼び出された直後は、espとebpのレジスタ以外はすべて0であり、espとebpには キー入力情報の場所のアドレスが格納されています。また、スクリプトで使用できるアセンブラ命令は、mov、push、pop、call、leave、ret、jmp、add、sub、inc、dec、cmp、je、jne、jl、jle、jg、jge、xor、and、or、shl、shr、nopとなります。
sg3 そして、これらを用いた実際のソースコードは右図のようになります。

■アルゴリズムを考える
 ボールとテーブルの位置(x, y)が分かるので、まずはそれらのx軸を合わせるようにプログラミングすれば、とりあえずはそれっぽく動きそうです。しかし、それだけだと面白くないので、ところどころに上下運動を取り入れたり、あと何フレームでボールがどこへ移動するか、などを推測しながらテーブルを移動させていくことで、より強いキャラクタ(ただのテーブルですが...)を作成できそうです。
 プログラミング言語は、本来「何かを作るため」に存在するツールですが、Robocodeを初め、こういったプログラミングを題材としたゲームでは、プログラミング技術を通して、一種の「対戦」を実現できます。勝ったから、負けたからといって何か得することがあるわけではないですが、より強いアルゴリズムを考えようとすれば、それだけプログラミング技術も鍛えられるかと思います。仕事の息抜き程度に挑戦してみるのも面白いかもしれません。

-----

 今回はセキュリティとは関係のない話となりましたが、いかがだったでしょうか。
 そもそもなぜこのようなものを業務の合間に作れるのか、というと、実は、弊社の研究開発部には「20%ルール」というものがあります。20%ルールとは「業務時間の20%は自分の好きなリサーチをやってよい」というものであり、例えば、一般的な会社の完全週休二日制の場合、1週間に月~金までの5日間働くことになりますが、この5日のうちの1日、つまり業務時間の20%は自分の好きな研究に使用できます。これを利用すると、セキュリティとはまったく関係のない、ただのゲームを作ったりできます(汗)。

 さて、少し話がそれてしまいましたが、たまにはこういうのもよいかな、と思い、ブログに書かせていただきました。楽しんで頂けたら幸いです。
 なお、当ソフトウェアはまだ未完成ですので、動作環境の確認等は行っておらず、動作保障もできません。ブログのネタ程度に考えていただけると有難いです。

メルマガ読者募集 採用情報 2020年卒向けインターンシップ

月別