スポンサーサイト

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

フラグをビット演算で管理する

プログラム全文はこちら


タイトル通りビット操作でフラグを管理するプログラム
フラグを作る方法としてはint型とかで0,1,2,3とかで管理するもあり、
boolでfalse(0) true(1)で管理するもありと色々な方法がありますが、
この方法を使用することで1ビットにつき1フラグを管理することが可能となります。

つまりint型なら8バイト=32ビット=32個ものフラグを管理することが可能になるわけです

詳細なことはプログラム全文にコメントで説明してあったりします
スポンサーサイト
line

乱数の取得

プログラム全文はこちら


C,C++で乱数を取得する場合に用いられる方法、別に特別なものでもないのですがよく忘れるので(特に初期化部分)

その初期化部分と言うのが


#include
srand((unsigned)time(NULL))


という部分です、timeを使うにはtime.hが必要なのでincludeをするように

必要な値、たとえばサイコロのように1~6の値を入れたい場合はサンプルのように剰余算を使って

rand() % 6 + 1;

としてあげればいい
line

一つの変数に二つの値を入れる

プログラム全文はこちら


ちょっとした小技の一つだと思ってます
タイトル通り一つの変数に二つの値を入れることができます、しかしその大きさは0~15までです
しょぼいように見えて実は使えます

ゲームに使用するならブロック崩しとかですかね
本来ならブロックのオブジェクトを作る時に種類(type)と耐久力(life)を変数として使用する場合、char型で宣言したとしても1byte+1byte、30ブロック作るとしたら2byte * 30=60byte使うことになったりします


しかしこの小技を使うとtypeとlifeを一緒にすることができ、1byteで済ます事が出来ます

まぁ30ブロック程度じゃふーん程度しか思いませんが1000ブロックとかあったら本来2000byte使うところを半分に減らす事が出来るってすごいです

ってのは本当に雑談


この小技は配列に16進数を入れることが重要です、サンプルのプログラムでは

unsigned char index[4];という配列の中に
index[0]=0x69;
index[1]=0x91;
index[2]=0x35;
index[3]=0xF1;

という感じに入ってます。この0x69とか0x91とかの数字そのものは別にどうでもいいです
問題なのは0x69の6と9にあります、今回はこれを分けて使用することで2つの値を得ることが可能になります


説明に使用するのは[0]の0x69を使用します、最初に左の6の部分を抜き取ってみます
まずは[0]を2進数にしてみます
index[0]=0x01101001

ここで欲しいのは左の6の部分、つまり0x01101001の部分です
そのためには右の0x01101001は不要となります
そこで、論理積を利用して右半分を全て0にしてみます
ans=index[0] & 0xF0;

これで0x01100000となります、しかしこのまま普通に代入したりすると96という値が返ってきたりします

そうしないために右に4ビットシフトします(シフト演算使用)

index[0]=0x01100000 >> 4(右に4ビットシフト) -> 0x0110


これで代入することで期待通りの6という値を得ることができます


ちなみに右端の1001の値、つまり9を得たい場合は先ほどと同じように論理積で左側を0にしてください
index[0] & 0xF0;

こうすることでindex[0]=0x00001001、つまり0x1001、つまり9という値が得られるわけですね


これを使うにはシフト演算や論理積とかを理解してないと使いずらいかもしれません

line

バイナリサーチ

プログラム全文はこちら


バイナリサーチとは探索アルゴリズムの一つですね
基本的な探索アルゴリズムは[0]~[50]とかまでの配列を順に見ていき値があればありました的なflgを立てれば終了です
10や20程度の要素数を持った配列ならそれでもかまいませんがもし配列が1000や2000あったら・・・
順に見ていくのはちょっと処理的に良くないです、ということで登場したのがバイナリサーチ・・・だと思いますw
とりあえず成り行きとかはwikiとかが詳しいかと・・・


ちなみにこのアルゴリズム、実は使用条件があります、それは配列の中身が降順か昇順になっていることです
(昇順 -> 小さいものから大きいものへ順)
(降順 -> 大きいものから小さいものへ順)


この流れを簡単にまとめます(自分なりに)
int left=0; //< 配列場所(左)
int right=6; //< 配列場所(右)
int center; //< 配列場所(中央)

配列
[0][1][2][3][4][5][6]
(今回は見つけたい値が[6]に入っているとします)
(値は昇順に入っているとします)



while文を実行します、条件は(left <= rigth)

最初にcenterを設定 -> center=(int)((right+left) / 2);

この時点での変数の中身は以下の通り
left=0
right=6
center=3

[0][1][2][3][4][5][6]


centerを見て見つけたい値があればwhile文を抜けますが今回は[6]に値が入っているとしますので今回は[3]を見ているので検索続行


続行する場合、centerの値とleft、rightをそれぞれ比べます
昇順なので[6]に入っている値はcenterより大きいです
ということでcenterより小さい値であるleft方面の数(つまり[0]~[3])までは切り捨てます

leftを再設定 -> left=center+1;
(leftの配列を指す位置は[4]になりました)

ここまできたら一旦処理は終了です、while文の最初に戻ります
再びcenterの設定です

この時点での変数の中身は以下の通り(二回目)
left=4
right=6
center=5

[4][5][6]

はい見つからない。ということでleft再設定 & center再設定

この時点での変数の中身は以下の通り(三回目)
left=6
right=6
center=6

[6]


はい見つかりましたね、3回目で発見です


ここで見つからなければleftが再設定され7となります
そうなるとwhile文の条件である(left <= right)を満たなくなるのでwhile文を抜けることになります


サンプルではflgを用意して見つかった時にtrueにするという方法をとっています


ちなみに今回は昇順であることを前提にして考えましたが、降順の場合はcenterの指す配列の中身が
大きければleft=center+1;
小さければright=center-1;と逆にしてあげれば解決します

まぁ答えを書くと
index[center] < ANS -> index[center] > ANS
index[center] > ANS -> index[center] < ANS
と変更するか
if文の中身を逆にすればいいだけです。少し順を追って見れば理解できるのではないかなと思います。
少し複雑なアルゴリズムですがすごく使えるものです


ただし何度も言いますが配列の中身が昇順か降順であることが絶対です
そうでなければこのアルゴリズムは使用できませんのでご注意を・・・

line

バブルソート

プログラム全文はこちら

ソートアルゴリズムの一つ、いわゆる整列させるアルゴリズムですね
大きい順に並べるか小さい順に並べるかするやつです
これは後ろから調べていく形ですが前から調べる方法もあります(そっちの方が基本的かもしれない)

今回は図で表すと面倒なので省略w

配列を用意
[0]=190、[1]=100、[2]=10、[3]=90

次にfor文
(1回目)
i=0,j=3
if([0(190)] > [3(90)])入れ替え実行
[0(90)][1(100)][2(10)][3(190)]


(2回目)
i=0,j=2
if([0(90)] > [2(10)])入れ替え実行
[0(10)][1(100)][2(90)][3(190)]


(3回目)
i=0,j=1
if([0(10)] > [1(100)])入れ替え無し
[0(10)][1(100)][2(90)][3(190)]


j=0となりjのfor文の条件(j > i)を満たさなくなったのでiを1に、jを3にする
そして次のfor文へ・・・


(4回目)
i=1,j=3
if([1(100)] > [3(190)])入れ替え無し
[0(10)][1(100)][2(90)][3(190)]


(5回目)
i=1,j=2
if([1(100)] > [2(90)])入れ替え実行
[0(10)][1(90)][2(100)][3(190)]

と言った感じで後ろから前に見ていくプログラムです
絵は面倒でしたので作ってませんがまぁこんな感じでわかっていただけると嬉しいです?


line

二次元に見える一次元配列

プログラム全文はこちら

二次元配列はゲームなどではあまり使われないとどこかで聞いた事があります、とはいえ場所によって様々なんでしょうがね

今回は一次元配列をあたかも二次元配列として扱う方法です
とはいえ難しいことはないです(稀に忘れますが)


一応も図も表示
疑似二次元配列

配列を[3][4]にしたバージョン
つまり[1*WIDTH+2]とするだけで[1][2]と同じ扱いができるってことですね


ただこれだけだと使いづらいのでクラスとかにして型の一つにしたりすると扱いやすいかもしれませんねぇ
オブジェクト化したもの例
(追記:2013/03/25 プログラムに重大なミスがありましたので修正しました)

なにかあればコメントで、へったくそなプログラムだなぁとか思われてもしゃーない


書籍として「ゲームプログラマになる前に覚えておきたい技術」を参考にさせていただきました
line

はじめに

これからプログラミングのあれこれ練習帳を利用するにあたっての注意点等々・・・

まずこのブログでは自分自身プログラムの大切な技術を忘れないようにするためのメモ帳のようなものです
なので説明とかにはあまり力を入れてません、なにより日本語が難しくてですね(日本人です)
さて、今回はコンソールとOpenGLを使ったプログラムの二種類を作っていきたいと思ってます
OpenGLでは矩形の判定や円の判定などの目に見えないと分かりづらいプログラムを作る時に使用します
DirectXでもいいかなぁと思ったのですがAndroidでOpenGLes慣れしている自分はこっちの方が・・・ねw

コンソールでのプログラムは主に技術的な面々?図で表さなくても良いようなプログラムですね、たとえば値入れ替えのアルゴリズムとか・・・

今のところその2種類を使ってメモしていきたいと考えてます
とりあえず以下環境についてうんぬんかんぬん・・・


①オワタの利用している環境
PC     Windows7 32bit
開発環境  VC++2008
とこんな感じです。VC2010でも大丈夫だとは思いますがとりあえず自分は2008を利用しています。

②-1環境の設定(OpenGLの設定)
とりあえずOpenGLを利用するにあたってglut.hをダウンロードする必要があります。
自分はここを参考にして設定しました。

先にある「2.3 Windows 系 OS にインストールする」を参考にしました。
とりあえず上記のサイト様の説明が一番わかりやすいのでは?と思います。ちなみに32bit版と64bit版だとちょっとだけ違うみたいですね。


②-2環境の設定(lodepng.h & lodepng.cpp)
OpenGLを利用するにあたってPNG画像を利用したい部分が多々あります。まぁBMP画像でもいいんですが容量が多い等々で利用したくないです。(個人的意見)
なので今回はlodepngを利用します。
lodepngは作者様の意向により改変、再配布等が自由に行える模様ですので利用させてもらいます~。

ちなみにこのサイトでも配布しようと思います、というのも現在のlodepngは色々改変されたらしいので自分のサイトでプログラムを動かそうとしたら配布しないと動かないんですねこれが・・・w
ちなみに利用しているバージョンは「LodePNG version 20100314」を利用しています。

配布はプロジェクトをDLしたらついてくる・・・という形でお願いします。



③自作ヘッダーGraphicUtilの利用
このサイトでは練習帳ということでプログラムをそのまま記入する形で進め、最低限のプログラムをこのサイトに記入していきますが、加えてプロジェクトの配布も行おうと考えています。
ですが、プロジェクトの中にはGraphicUtil.hというヘッダーがあります。これは自分が作業を進めやすくするために作った描画ライブラリ?ですw

矩形の描画や画像の描画などの描画関数がたっぷりつまったライブラリなわけですね。
このサイトでは最低限使用する部分しか紹介しませんがプロジェクトをいきなり見るとハァ?となるかもしれません。



2012/08/19現在ではこのくらいですかね、随時なにか追加していくかもしれません
2012/08/25コンソールを使ったプログラムについてを追加



↓ちなみに自分の参考にしたとても素晴らしいサイト様を紹介します↓
HAKUHIN's home page
基本的なアルゴリズムに関しての情報はここが神がかっています
残念ながらActionSctiptを使って説明しているのでFlashを持っていなければサンプルをDL→実行とはいきませんが実行結果がswfでHPに貼ってあるので結果は簡単に見ることができます。


OpenGLプログラミングメモ
OpenGLに関しての知識はここで調べるか何かするといいかもしれません。
描画の方法や設定の仕方、他の拡張機能などのDL方法など様々なことに関しての知識を得ることができます。
オススメですよw


GLUTによる「手抜き」OpenGL入門
OpenGLの設定についてはここが一番わかりやすかったかなぁ・・・と思います。探せばもっとあるかもしれませんがね;
自分は少なくともここを参考にglutをDL & 設定しました。
line

プログラミングのあれこれ練習帳

この先自分の夢と希望と遺産が詰まったPCが壊れるとも限らない & 職場などで自分のPCを持っていくことは出来なかったりすると色々と不具合が起こります。
まぁ簡単に言うとメモ的なものですね、メモ的なものをここに残していきます。

その他もろもろは「はじめに」を参考にしてもらえるとうれしいです。
ここは目次なのでこの場ではここで終了~っと


はじめに


OpenGLを利用したプログラム
・OpenGLを使って描画してみる



コンソールを利用したプログラム
二次元に見える一次元配列
バブルソート
バイナリサーチ
一つの変数に二つの値を入れる
乱数の取得
フラグをビット演算で管理する
リスト構造(チェーンリスト)(単方向)
パーセントを求める
マクロについて
多重定義について
動的メモリ割り当て


C#関連プログラム
イベント(ボタンクリック)
イベント(カーソル出入り)
フローレイアウトパネル
テーブルレイアウトパネル
ラベル
ボタン(普通のボタン)
ボタン(チェックボックス)
ボタン(ラジオボタン)
テキストボックス
リストボックス
コンボボックス
メニュー
C#でのメインループ
カーソルの位置取得
フォームの枠の判定あれこれ
クリックを感知
line
line

FC2Ad

line
プロフィール

否健康食品オワタ

Author:否健康食品オワタ
27.142.178.77 (1)
27.142.178.77 (2)

2714217877.gif

line
最新記事
line
最新コメント
line
最新トラックバック
line
月別アーカイブ
line
カテゴリ
line
検索フォーム
line
RSSリンクの表示
line
リンク
line
ブロとも申請フォーム

この人とブロともになる

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