第16講テトリス開発(4つのブロックを一元的に描くまで)

第3話 64通りの座標を3次元配列で表すにはどうしたらよいか
ブロックの種類、ブロックの回転状態、それぞれのブロックが4個から構成されているので、
char p[4][4][4];
のような3次元配列を用意すればよいことは予想できますが、
それでも、小学生・中学生・高校生やプログラミング初心者にとってはむずかしい問題です。
難しい問題とは最初にどのように初期化するかです。
初期化とは、最初に代入することを指していましたね。
char p[4][4][4]={
?,?,?,?,
?,?,?,?,
?,?,?,?,
?,?,?,?

};
つまり、
?,?,?,?,
?,?,?,?,
?,?,?,?,
?,?,?,?

の内容が問題なのです。

問題が複雑なときには、分析する!という考え方が有効です。
分析するとは、物事を細かい部分に分けて考えることです。
今(x、y)とx座標とy座標を一緒にして考えているために、
事態が複雑になっています。
そこで、x座標とy座標を分けて考えることにしましょう。
そして、配列char p[4][4][4];はx座標に加える数を表し、
char p[4][4][4];はy座標に加える数を表すとしましょう。

まず、x座標から。
x座標をブロックの種類とブロックの回転状態から分類してみましょう。
長方形を0、正方形を1、L字を2、N字を3に対応させ、
回転状態も最初を0、
90°回転した状態を1、
180°回転した状態を2、
270°回転した状態を3で、
表すことにして、x座標に加える数を考えてみましょう。
例えば、001の各正方形のx座標に加える数は左から順に、
p[0][0][0], p[0][0][1], p[0][0][2], p[0][0][3]
に対応すると考えられます。
そして、x座標に加える数は
p[0][0][0]=-1, p[0][0][1]=0, p[0][0][2]=1, p[0][0][3]=2
の値を持ちます。
0はブロックの種類が長方形であることを示し、
0はまだ回転していない状態を表します。
同様に、002の各正方形のx座標に加える数は上から順に、
p[0][1][0], p[0][1][1], p[0][1][2], p[0][1][3]
に対応してその値は、
p[0][1][0]=0, p[0][1][1]=0, p[0][1][2]=0, p[0][1][3]=0
を取ると考えられます。
全部0なのはすべてx座標は同じであるからです。
黄色の正方形のx座標は3つとも赤の正方形と同じですね。
1は最初の状態から90°回転している状態を表しています。
また、
007ならば、左上から時計回りの順で考えれば、
p[1][2][0], p[1][2][1], p[1][2][2], p[1][2][3]
に対応してx座標に加える数は、
p[1][2][0]=-1, p[1][2][1]=0, p[1][2][2]=0, p[1][2][3]=-1
を取ります。

016の場合はどうでしょうか。
x座標とy座標に加える数の組み合わせを左から経路の沿って表示すると(-1,0),(0,0),(0,-1),(1,-1)ですから、
p[3][3][0]=-1, p[3][3][1]=0, p[3][3][2]=0, p[3][3][3]=1
です。

では、皆さん
001 002 003 004
005 006 007 008
009 010 011 012
013 014 015 016
のすべてのx座標に加える数について同様に考えて下さい。




第2話へ  第4話へ
a

初心者のための excel 2016 マクロ VBA 入門講義 基礎から応用まで
vc++ c言語 c++ 入門 初心者 基礎から応用まで
eclipse c++ 入門
魔方陣 数独で学ぶ VBA 入門

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座

初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
eclipse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ