...ing logging 4.0

はてなブログに移行しました。D言語の話とかいろいろ。

int a, b, c, d, ... , A, B, ... , aA, aB, ... , ZZ; // ・゚・(ノД`)・゚・ウワァァン

スーパーバイザーらしく話を聞いてみたのだが。
ぜひ考えてみよう。
Blokusではブロックの数が1人当たり21個。
それぞれのブロックはx座標、y座標を持っている。
最初のブロックの変数はx座標がa、y座標がb。
さらにグローバル変数でタイトルのように宣言されていたら。

C言語で行くのはまあいいのですが、ぜひ配列という便利なものを使っていただきたい。
ちなみにいろいろ省略して書くと


// 1人あたりのブロックの数
#define BLOCK_NUMBER 21
...
// ブロックの座標用の配列を用意(後でxとyに中身を入れてね)
int x[BLOCK_NUMBER], y[BLOCK_NUMBER];
...
// ブロックの表示
for(int i=0; i < BLOCK_NUMBER; ++i) {
pDC->BitBlt( x[i], y[i], ... );
}

という風にすればいいのです。
楽でしょう?
もっと言えば、構造体を使いましょう。


// 1人あたりのブロックの数
#define BLOCK_NUMBER 21
...
// 構造体の宣言
struct BlockPoint {
int x;
int y;
};
// 構造体変数を作る(後でxとyに中身を入れてね)
BlockPoint blockPosition[BLOCK_NUMBER];
...
// ブロックの表示
for(int i=0; i < BLOCK_NUMBER; ++i) {
pDC->BitBlt( blockPosition[i].x, blockPosition[i].y, ... );
}

さらに言えば、C++言語の領域にも挑戦してみよう。
構造体に関数を足したような形ですね。


// 1人あたりのブロックの数
const int BLOCK_NUMBER = 21;
...
// 1つのブロックを表すクラスを定義する
class Block {
public:
int x;
int y;
void Draw(CDC* pDC) {
pDC->BitBlt( x, y, ... ):
}
Block() {
x = y = 0;
}
};
...
// ブロックを作る(後でxとyに中身を入れてね)
Block block[BLOCK_NUMBER];
...
// ブロックを表示
// CDC* pDC(this); // OnPaint() とかにあるよね
for(int i=0; i < BLOCK_NUMBER; ++i) {
block[i].Draw( pDC );
}

欲を言えばクラスはカプセル化して欲しいですね(^^;
カプセル化とは、勝手に外から内部変数の値を変更されないようにすること。
それによって頑丈なクラスになります。
あと、ついでに細かい部分も直すと


// 1人あたりのブロックの数
const int BLOCK_NUMBER = 21;
...
// 1つのブロックを表すクラスを定義する
class Block {
private:
int m_x; // ブロックの座標
int m_y; // ...
public:
// 座標を設定する関数
void SetPosition(int x, int y) {
m_x = x;
m_y = y;
}
// ブロックを描画する関数
void Draw(CDC* pDC) {
pDC->BitBlt( m_x, m_y, ... ):
}
Block() : m_x(0), m_y(0) {}
};
...
// ブロックを作る
Block block[BLOCK_NUMBER];
...
// 座標を入れる
for(int i=0; i < BLOCK_NUMBER; ++i) {
block[i].SetPosition( i*20, 100 ); // 例
}
...
// ブロックを表示
// CDC* pDC(this); // OnPaint() とかにあるよね
for(int i=0; i < BLOCK_NUMBER; ++i) {
block[i].Draw( pDC );
}

こんな感じでしょうか。
上から順番に、変化の歴史を感じてもらえれば・・・(大層な