ExcelVBAゲームプログラミング?

初心者でもきっとできる!
Excelさえ持っていれば特別なソフトは不要!
すぐにでも始められる簡単ゲームプログラミング!
今すぐ始めよう!

サンプルやゲームのダウンロードができる別館も好評運営中です。
ご意見やご質問、ゲームの感想等は掲示板までお気軽に。是非、皆さんの声を聞かせてください。運営、開発の励みになります。



各種ダウンロードはコチラ ↓ 意見・感想・質問はコチラ ↓
影倉庫 Shadow warehouse サポート掲示板
ブログの全体像はコチラ ↓ リンクのページはコチラ ↓
サイトマップ 自分本位なリンク


スポンサーサイト

上記の広告は1ヶ月以上更新のないブログに表示されています。
新しい記事を書く事で広告が消せます。






Chapter.123 [ テキストファイル操作:復号化編 ]

■もとに戻すのだ

前回は出力するファイルの暗号化に取り組みました。

使える文字は半角の英語などに限られるものの、文字列を暗号化して、ひとめではなんのデータなのかわからないようにすることが可能でしたね。このような暗号化処理をものにすることができれば、ゲームにかかわるデータの出力に大きな力を発揮します。あとは、この暗号化されたデータを、元に戻して再活用することができれば、外部データを用いたゲーム処理の幅が大きく広がることになります。

前回の暗号化講座をしっかり読んでいる方なら、復号化の手法についてもおおよその見当がつくはずです。文字列の一文字一文字を順番に処理し、それぞれの文字コードを取得したあと、それをビット反転処理することで、暗号化を実現することができたのでしたね。ということは、今度は逆に、ファイルに記述されているデータをビット反転しながら読み込みすれば、文字列は全てもとの形に戻るはずです。今回は、これをやってみましょう。


暗号化の際には、バイナリモードを用いてファイルに書き込みました。復号化の場合も同様にバイナリモードでの処理を行います。まずはバイナリモードでファイルを開き、データを読み込みます。

このときポイントとなるのが、ファイルの読み込み方法です。

今までは、読み込んだデータの受け入れ先に文字列変数を使ってきましたね。Input ステートメントを使って、文字列変数にデータを取得していました。しかし、この方法では復号化は難しいです。もちろんできないわけではないのですが、スマートとは言えません。

暗号化の際にバイト型の配列変数を用いた処理を行いましたが、今回もこのバイト型配列がキーポイントになります。


■ファイルの大きさ

暗号化を行う際には、文字列の長さを調べ、それと同じ要素数を持ったバイト型配列を宣言しましたね。憶えているでしょうか。

暗号化では、文字をひとつずつ処理するために、文字数と同じだけの要素を持った配列が必要でした。復号化の場合には、ファイルサイズと同じ分だけの要素を持った配列が必要となります。そのために、まずファイルサイズを調べなくてはなりません。

ファイルのサイズを調べるには、いくつか方法があります。
ひとつ目は FileLen 関数を用いた方法です。この関数は引数にファイルのパスを与えることによって、指定されたファイルのサイズを返してくれます。
そしてもうひとつが LOF 関数を用いた方法。こちらの関数は、既に開かれているファイルのサイズを教えてくれる関数で、引数には、ファイルを開いた際に指定したファイル番号を与えます。

今回は、LOF 関数を用いて、ファイルの大きさを調べてみることにします。LOF 関数を使って、バイナリモードで開いたファイルのサイズを調べます。このとき得られたファイルサイズと、同じだけの要素数を持ったバイト型配列を宣言することによって、読み込んだデータを 1 バイトずつ処理することが可能になります。

実際に、復号化を行っているコードを見ながら、考えてみましょう。

Sub encryption_read()

    Dim fName As String
    Dim fNumber As Integer
    Dim fString As String
    Dim L As Long
    Dim LL As Long
    Dim B() As Byte

    fNumber = FreeFile
    fName = ThisWorkbook.Path & "\test.txt"
    
    Open fName For Binary As #fNumber '①
    
    L = LOF(fNumber) '②
    ReDim B(L - 1) '③
    
    Get #fNumber, , B() '④
    
    Close #fNumber
    
    For LL = 0 To L - 1
        B(LL) = Not B(LL) '⑤
        fString = fString & Chr(B(LL)) '⑥
    Next
    
    Debug.Print fString

End Sub

それでは順を追って考えていきましょう。

まず、①の部分でバイナリモードでファイルを開いていますね。この段階ではとくに難しいことはしていません。ただ単に、バイナリモードでファイルを開くだけです。

次に②です。ここでは、先ほど解説した LOF 関数が登場しています。既に開かれているファイルのサイズを取得するには LOF 関数を使うのでしたね。この時点で、変数 L にファイルのサイズが取得されます。

③では、先ほど取得したファイルサイズをもとに、バイト型配列の再宣言を行っています。こうすることで、ファイルの大きさに応じてその都度必要な要素を持ったバイト型の配列変数が用意されます。

ファイルを読み込んでいるのが④の部分です。ここでは、Get ステートメントを用いてファイルからデータを読み込んでいます。以前の講座でも解説したように、Get ステートメントの第一引数にはファイル番号を、第二引数は省略して、第三引数にデータの読み込み先となる変数を指定します。
このとき、バイト型配列にカラの括弧をつけた状態で引数として渡していますね。暗号化の際、ファイルに書き込むときにもこのようにカラの括弧をつけたバイト型配列をそのまま渡しました。それと同じことをしています。

補足コラム:カラの括弧と配列変数
よくC言語などでポインタという言葉を耳にします。理解するのが難しいものとして有名です。今回登場しているカラの括弧を使った一連の処理は、このポインタを用いた処理とよく似ています。
変数とは、データを一時的に格納しておく箱のようなものです。そして、その箱が置かれている場所は厳密に管理されています。プログラムが動作する際には、箱の置かれている場所を参照することで、そこにあるデータを使うことができるのですね。
配列の場合は、同じ大きさの箱がたくさん並んでいる光景をイメージするとわかりやすいですね。バイト型の配列であれば、1バイト分の大きさの箱が、たくさん並べられている状態になっているわけです。今回のようにカラの括弧をつけて配列を引数として渡すと、プログラムは箱のある場所を探しに行きます。しかし、括弧がカラの状態なので、何番目の箱の中身を見ればいいのかわかりませんね。このような場合、プログラムは並んでいる箱の先頭の場所を見に行きます。そうすることで、結果的に、並べられている箱全体を参照することができるようになっています。
今回の場合は、読み込むデータの格納先として、カラの括弧つき配列を渡しています。これにより、データは順番に、指定された配列に格納されていきます。十分な大きさの配列さえ用意しておけば、勝手にひとつひとつの箱にデータを割り振ってくれるのです。なんとも便利ですね。


さて次に⑤の部分です。
ここは、ビット反転処理を行っている部分ですね。先ほどバイト型配列にデータを読み込みましたので、配列の各要素には既にデータが取得されています。ただ、ここで各要素に入っているデータは、前回の暗号化処理でビット反転された状態のデータです。これをもう一度ビット反転することで、もとの形に戻すことができます。

⑥では、ビット反転してもとに戻ったデータを、今度は文字列に変換しています。文字コードから文字への変換を行ってくれる Chr 関数を使って、ビット反転したデータを文字列に変換していきます。変換されたデータは、最終的に変数 fString に格納されていきます。

最後に、変換した文字データをイミディエイトペインに出力して完了です。

今回のコードでは、イミディエイトペインにデータを出力していますが、実際のゲームで処理を行う場合には、取得されたデータをもとに、自由にそのあとの処理を組み立てればいいわけです。これで、復号化処理は完璧です。


■まとめ

さて、前回までの暗号化処理、そして今回の復号化処理、理解できたでしょうか。

バイナリモードを使って、データを 1 バイトずつ処理するということは、普段はなかなかありません。それほど特殊なことをしているわけではないのですが、VBA という言語の特性上、なかなかバイトデータを取り扱うことがないので、仕方ないですね。

しかし、その効果は実際に体験してもらえればわかるでしょう。暗号化を施して出力されたデータは、見た目は全く意味のわからないデータになります。ただ、復号化の方法さえわかっていれば、それを意味のあるデータに再変換することが可能なのです。

このようなバイトレベルの処理が理解できるようになると、プログラミングのさらに奥深い世界に入っていけるようになります。DirectX のような高度なテクノロジーを理解するためには、必ずバイト単位の処理を理解しておかなければなりません。その足がかりとして、こういったテキストファイルの操作を習得しておくことは必ず役に立ちます。少しだけ難しいかもしれませんが、焦らずひとつずつ、覚えていきましょう。



■格言

ファイルサイズを取得して配列を宣言
文字コードから文字への変換にはChr関数


DirectX なんてまだまだ先の話。
まずは、バイト単位で処理を行うことに慣れていきましょう。
関連記事






Comment

Name
E-mail
URL
Comment
Pass  *
Secret? (管理者にだけ表示)
「複合化処理」のところ、「複合化」じゃなくて「復号化」ではないでしょうか?
勘違いだったらすみません。

メールフォーム

影斬に物申すという方はこちら

名前 :
メール:
件名 :
本文 :

可能な限り要望には応えますが、必ず返信や回答ができることを、保障するものではありません。
ご了承ください。

Chapters

コンテンツ一覧


■Chapter 一覧■
    全てのChapterの一覧です。
    直接アクセスしたい方はこちらをご利用下さい。

    Chapter.1 [ 知っておくべき心得 ]
    Chapter.2 [ Excelってなんだろう ]
    Chapter.3 [ Excelの基本画面 ]
    Chapter.4 [ VBAとは? ]
    Chapter.5 [ モジュールについて ]
    Chapter.6 [ 変数 ]
    Chapter.7 [ 変数の型と宣言 ]
    Chapter.8 [ プロシージャとスコープ ]
    Chapter.9 [ ゲームつくる様々な手法 ]
    Chapter.10 [ ユーザーフォーム ]
    Chapter.11 [ プロパティウィンドウ ]
    Chapter.12 [ 乱数 ]
    Chapter.13 [ 条件分岐 ]
    Chapter.14 [ ゲーム画面のデザイン ]
    Chapter.15 [ コード記述の基本作法 ]
    Chapter.16 [ じゃんけんゲーム:1 名前をつける ]
    Chapter.17 [ じゃんけんゲーム:2 フォームの起動 ]
    Chapter.18 [ じゃんけんゲーム:3 乱数の種 ]
    Chapter.19 [ じゃんけんゲーム:4 イベント ]
    Chapter.20 [ じゃんけんゲーム:5 引数 ]
    Chapter.21 [ じゃんけんゲーム:6 役判定 ]
    Chapter.22 [ じゃんけんゲーム:7 予測と制限 ]
    Chapter.23 [ Withステートメント ]
    Chapter.24 [ 画像を表示させる ]
    Chapter.25 [ 画像表示の発展形 ]
    Chapter.26 [ 繰り返し処理 For文 ]
    Chapter.27 [ 繰り返し処理 Do~Loop文 ]
    Chapter.28 [ Exitステートメント ]
    Chapter.29 [ フォーム上の位置情報 ]
    Chapter.30 [ API基礎知識 ]
    Chapter.31 [ API補足知識 ]
    Chapter.32 [ メインループを考える ]
    Chapter.33 [ 同期処理の概念 ]
    Chapter.34 [ 移動処理その1:画面設定と考え方 ]
    Chapter.35 [ 移動処理その2:DoEvents ]
    Chapter.36 [ 移動処理その3:キー入力判定API ]
    Chapter.37 [ 条件分岐のさらなる探求 Select Case ]
    Chapter.38 [ アニメーション ]
    Chapter.39 [ 配列変数 ]
    Chapter.40 [ ゲームの初期化 ]
    Chapter.41 [ シューティングゲーム1:ゲーム設計 ]
    Chapter.42 [ シューティングゲーム2:メインプロセス ]
    Chapter.43 [ シューティングゲーム3:構造体 ]
    Chapter.44 [ シューティングゲーム4:定数 ]
    Chapter.45 [ シューティングゲーム5:プレイヤーキャラクター ]
    Chapter.46 [ シューティングゲーム6:ショットを撃つ① ]
    Chapter.47 [ シューティングゲーム7:ショットを撃つ② ]
    Chapter.48 [ シューティングゲーム8:Mod演算子の活用 ]
    Chapter.49 [ シューティングゲーム9:敵キャラクター登場 ]
    Chapter.50 [ シューティングゲーム10:衝突判定 ]
    Chapter.51 [ シューティングゲーム11:衝突の実体 ]
    Chapter.52 [ シューティングゲーム12:敵の攻撃 ]
    Chapter.53 [ シューティングゲーム13:爆発エフェクト ]
    Chapter.54 [ シューティングゲーム14:残機数表示① ]
    Chapter.55 [ シューティングゲーム15:残機数表示② ]
    Chapter.56 [ シューティングゲーム16:スコアの表示 ]
    Chapter.57 [ シューティングゲーム17:タイトル画面 ]
    Chapter.58 [ シューティングゲーム18:ボスキャラクター ]
    Chapter.59 [ シューティングゲーム19:最後の仕上げへ ]
    Chapter.60 [ シューティングゲーム20:いよいよ完成STG ]
    Chapter.61 [ カードゲームで使えるめくり効果 ]
    Chapter.62 [ ラジアンと角度 ]
    Chapter.63 [ ラジアンの活用:円運動 ]
    Chapter.64 [ ラジアンの活用:任意の角度へ移動する ]
    Chapter.65 [ APIによるサウンド再生:基礎 ]
    Chapter.66 [ APIによるサウンド再生:MIDIと多重再生 ]
    Chapter.67 [ APIによるサウンド再生:MCIコマンドとループ再生 ]
    Chapter.68 [ Function プロシージャ ]
    Chapter.69 [ 値渡しと参照渡し ]
    Chapter.70 [ デバッグ1:イミディエイトウィンドウ ]
    Chapter.71 [ デバッグ2:ローカルウィンドウ ]
    Chapter.72 [ デバッグ3:コード実行の中断 ]
    Chapter.73 [ オブジェクトってなんだ ]
    Chapter.74 [ プロパティ・メソッド・イベント ]
    Chapter.75 [ オブジェクト変数 ]
    Chapter.76 [ オブジェクトとコレクション ]
    Chapter.77 [ 特殊な繰り返し:For Each ]
    Chapter.78 [ エラー処理 ]
    Chapter.79 [ On Error と GoTo文 ]
    Chapter.80 [ Resumeステートメント ]
    Chapter.81 [ バイトとビット ]
    Chapter.82 [ ウィンドウメッセージとイベント ]
    Chapter.83 [ 文字列の基礎 ]
    Chapter.84 [ 文字列操作① ]
    Chapter.85 [ 文字列操作② ]
    Chapter.86 [ タイピングゲーム1:仕様を決める ]
    Chapter.87 [ タイピングゲーム2:キー入力検知 ]
    Chapter.88 [ タイピングゲーム3:文字列照合 ]
    Chapter.89 [ タイピングゲーム4:判定関数 ]
    Chapter.90 [ タイピングゲーム5:ゲーム画面設計 ]
    Chapter.91 [ タイピングゲーム6:問題文のソート ]
    Chapter.92 [ タイピングゲーム7:動的配列 ]
    Chapter.93 [ タイピングゲーム8:キーダウンイベント ]
    Chapter.94 [ タイピングゲーム9:正打数の表示 ]
    Chapter.95 [ タイピングゲーム10:タイムの表示 ]
    Chapter.96 [ クリックゲーム1:イベントの種類 ]
    Chapter.97 [ クリックゲーム2:画面設計 ]
    Chapter.98 [ クリックゲーム3:クリック座標検知 ]
    Chapter.99 [ クリックゲーム4:キャラクター準備 ]
    Chapter.100 [ クリックゲーム5:キャラクターの配置 ]
    Chapter.101 [ クリックゲーム6:キャラクター移動とNot演算子 ]
    Chapter.102 [ クリックゲーム7:クリックのヒット判定 ]
    Chapter.103 [ クリックゲーム8:ヒットマークエフェクト ]
    Chapter.104 [ クリックゲーム9:サウンド処理の実装 ]
    Chapter.105 [ クリックゲーム10:マウスカーソルの変更 ]
    Chapter.106 [ ブロック崩しゲーム1:仕様と概要を決める ]
    Chapter.107 [ ブロック崩しゲーム2:基本概念の確認 ]
    Chapter.108 [ ブロック崩しゲーム3:ベクトルとは ]
    Chapter.109 [ ブロック崩しゲーム4:変数や定数の宣言 ]
    Chapter.110 [ ブロック崩しゲーム5:初期化処理の実装 ]
    Chapter.111 [ ブロック崩しゲーム6:ブロックの配置 ]
    Chapter.112 [ ブロック崩しゲーム7:根幹処理とバーの処理 ]
    Chapter.113 [ ブロック崩しゲーム8:線分と線分の交差を判定 ]
    Chapter.114 [ ブロック崩しゲーム9:線分同士の交点 ]
    Chapter.115 [ ブロック崩しゲーム10:ボールの処理 ]
    Chapter.116 [ ブロック崩しゲーム11:最終調整して完成へ ]
    Chapter.117 [ テキストファイル操作基礎 ]
    Chapter.118 [ テキストファイル操作:読み込み編 ]
    Chapter.119 [ テキストファイル操作:CSV読み込み編 ]
    Chapter.120 [ テキストファイル操作:様々な読込編 ]
    Chapter.121 [ テキストファイル操作:バイナリ編 ]
    Chapter.122 [ テキストファイル操作:暗号化編 ]
    Chapter.123 [ テキストファイル操作:復号化編 ]
    Chapter.124 [ クラスモジュールとは ]
    Chapter.125 [ クラスモジュール:メソッド編 ]
    Chapter.126 [ クラスモジュール:プロパティ編 ]
    Chapter.127 [ クラスモジュール:イベント拡張編 ]
    Chapter.128 [ クラスモジュール:イベント自作編 ]
    Chapter.129 [ APIによる描画処理1:ハンドル ]
    Chapter.130 [ APIによる描画処理2:デバイスコンテキスト ]
    Chapter.131 [ APIによる描画処理3:ペン オブジェクト ]
    Chapter.132 [ APIによる描画処理4:ブラシ オブジェクト ]
    Chapter.133 [ APIによる描画処理5:図形描画準備編 ]
    Chapter.134 [ APIによる描画処理6:図形描画実践編 ]
    Chapter.135 [ APIによる描画処理7:画像描画の仕組み編 ]
    Chapter.136 [ APIによる描画処理8:ビットブロック転送編 ]
    Chapter.137 [ APIによる描画処理9:ラスタオペレーション ]
    Chapter.138 [ APIによる描画処理10:マスク描画 概念編 ]
    Chapter.139 [ APIによる描画処理11:マスク描画 実践編 ]


    コードやVBAに関する質問などはサポート掲示板(別館)までお気軽にどうぞ。




fc2 seotool Excel VBA ゲーム プログラミング 講座

Counter

twitter


Shadow BBS - 影掲示板

VBA 関連書籍



上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。