0521078-20080831

C++でRPGシステム制作
~第18回・暗号~
北海道情報大学 情報メディア学部
情報メディア学科 新井山ゼミ
0521078 綾部 豊
今回の発表内容
• セーブデータの作成方法
– セーブデータの概念・作成方法・暗号化について
説明する
セーブデータとは
• 当然ながら何かしらの記録を保存すること
– 今回の場合は特にゲームの中断状況を記録する
ことを示す
– コンピュータは全ての処理を計算によって行って
いるので突き詰めて言えば数字を記録すること
– 「データ」と名が付いているので正確には記録を
保存したファイルを指し示すのが正しい
データを記録するには
• プログラム言語に用意されている「fopen」な
どの関数を使用して変数を書き込む
• 例
– 名前
– 顔番号
–力
– 魔力
「ナインゲイツ」
1
123
77
データはそのまま書き込まない
• そのまま書き込んでしまうと
– データをユーザが容易に読み取れてしまう
• データの改ざんも楽にできる
– 必要のない空白のデータを大量に保存すること
になる
• セーブデータの容量が肥大化
• そこで何かしらの工夫を行う
データの選別
• 他のデータがあれば復元できるデータは保存
の対象から除外
• 必要最低限の
データを選別
– 容量の圧縮を図る
左のデータから復元できるので
右のデータは不要
データを数値化
• 保存する際は「long int 型」の変数を使用
• 「long int 型」とは
– 0~4294967295 の数字を表せる変数
• または -2147483648~2147483647
– 容量に直すと4バイト
– 0~F(16)の数字を8つ,または0・1のビットデータを
32保存するデータとして見ることもできる
1バイト
16進数
2進数
FFFFFFFF
1111
1ビット
1つの変数に複数のデータを保存
• 保存するデータはその数字の範囲によって必
要なビット数が分かる
– 0・1
– 0~3
– 0~15
– 0~1023
2通り
4通り
16通り
1024通り
1ビット
2ビット
4ビット
10ビット
1
11
1111
1111111111
• ビットを小分けにして保存することで1つの変
数に複数の数字を記録することができる
複数のデータ保存例1
• 何かしらのON・OFFを記録するデータは「0」
か「1」かの2通りしかないので必要な容量は1
ビットでたりる
• 「long int 型」は32ビットで構成されているの
で32のデータを保存できる
16進数 A0B6731D
• 1つのデータに1つの変数を 2進数
1101
使用した場合に比べて容量を
OOO
NFN
F
1/32に節約できる
スイッチの役目を果たす
これら一つ一つのビットを
フラグと呼ぶ
複数のデータ保存例2
• キャラの基本能力を保存する場合
– この値は0~999の範囲をとる
• 1000通りあるデータなので10ビットあれば保存できる
– 「long int 型」は32ビットなので1つの変数に3つ
分のデータを保存可能
•例
16進数
0521347B
=
86062203 10進数
2進数 0001 0011 0100 0111 1011
能力B 77 能力A 123
• このように保存すると容量の節約になるだけでなく読
みとりにくいデータにもなる
暗号化
• 変数に複数のデータを持たせることでデータ
が読みとりづらくなるのでこれも1つの暗号化
といえる
• しかし各変数の意味を知っていたりビットを小
分けしたりすればデータをそのまま読み取れ
てしまう
• そこでデータをファイルに書き込むときは暗号
化を行う
簡単な暗号化
• ファイルに書き込むときにデータに適当な値
を足す
規則正しく並んだデータも・・・
不規則な状態になる
(16進)100000FF + (10進)12345678 → (16進)10BC624D
• こうすることでビットを分割してもデータを読み
とれなくすることができる
– 足した適当な値を暗号化の「鍵」とする
• パスワードやマスターコードのようなもの
– 読みとるときはこの値を引けば復号できる
おまけについて
• アップロードしているフラッシュのファイルは
本編とは何の関係もないです
– 適当に作ってみました
• ボールにマウスポインタが重なるとちょっと気
持ちいいです
– 遊んでやってください
次回までの成果誓約
• できれば戦闘シーンの作成を開始する