第9講 テトリス開発(ゲームオーバー設定まで)
第4話 天井を超えた部分だけ描くようにする
天井を超えた部分だけ描くようにするコード例(変更部分だけ記載)
グローバル変数
int x=4,y=-2; //整数型の箱xとyを用意
void block(){
  int i,j,l;
  if (jyu(KEY_INPUT_DOWN) != 0)y++;
  
for(i=0;i<4;i++){
    
if(y+q[s][k][i]>0)chizu[x+p[s][k][i]][y+q[s][k][i]]=2+s;
  }

  for(i=0;i<4;i++){
    for (j = 0; j < 12; j++) {
      for (l = 0; l < 27; l++) {
        if (chizu[j][l] == 2 + i) {
          if(i==0)  DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, kiiro, true);
          if(i==1)  DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, mizuiro, true);
          if(i==2)  DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, aka, true);
          if(i==3)  DrawBox(20 * j, 20 * l, 20 * (j + 1) - 1, 20 * (l + 1) - 1, ao, true);
        }
      }
    }
  }
  for(i=0;i<4;i++){
    if(y+q[s][k][i]>=25){
      t=1; //0:作動停止 1:作動
      y=-2;
    }
  }
}
コピペ用添付ファイル

今回も1例だけとレースしてみましょう。
トレースすることによって解説してみましょう。
といっても16パターンありますので、
一例だけ選んで、トレースします。
s=2,k=2011の場合
i=0のとき、
char p[4][4][4] = {
   ・

-1,0,0,0,
   

char q[4][4][4] = {
   ・
0,0,1,2,
   ・

   if(y+q[
s][k][i]>0)chizu[x+p[s][k][i]][y+q[s][k][i]]=2+s;
       ↓
   if(y+q[
s][k][0]>0)chizu[x+p[2][3][0]][y+q[2][3][0]]=2+2;
       ↓
   if(y+
0>0)chizu[x+(-1)][y+0]=4;
       ↓
   if(y>0)chizu[x-1][y]=4;
ということで、011の一番左側の正方形が下限の0を超えていないか調べ、
超えている場合に4を代入しています。
代入されない場合には、0のままですからブロックを構成する該当の正方形はテトリスの画面には描かれません。
chizusakuseiで毎回0に初期化され直していることを思い出して下さい。
 
i=1のとき、
char p[4][4][4] = {
   ・

-1,0,0,0,
   

char q[4][4][4] = {
   ・
0,0,1,2,
   ・

   if(y+q[
s][k][i]>0)chizu[x+p[s][k][i]][y+q[s][k][i]]=2+s;
       ↓
   if(y+q[
s][k][1]>0)chizu[x+p[2][3][1]][y+q[2][3][1]]=2+2;
       ↓
   if(y+
0>0)chizu[x+0][y+0]=4;
       ↓
   if(y>0)chizu[x][y]=4;
ということで、011の赤い正方形のy座標が下限を0を超えているかを調べ、
超えている場合に4を代入しています。  
i=2のとき、
char p[4][4][4] = {
   ・

-1,0,0,0,
   

char q[4][4][4] = {
   ・
0,0,1,2,
   ・

   if(y+q[
s][k][i]>0)chizu[x+p[s][k][i]][y+q[s][k][i]]=2+s;
       ↓
   if(y+q[
s][k][2]>0)chizu[x+p[2][3][2]][y+q[2][3][2]]=2+2;
       ↓
   if(y+
1>0)chizu[x+0][y+1]=4;
       ↓
   if(y>0)chizu[x][y+1]=4;
ということで、011の下から2番目の正方形のy座標が下限を0を超えているかを調べ、
超えている場合に4を代入しています。
i=3のとき、
char p[4][4][4] = {
   ・

-1,0,0,0,
   

char q[4][4][4] = {
   ・
0,0,1,2,
   ・

   if(y+q[
s][k][i]>0)chizu[x+p[s][k][i]][y+q[s][k][i]]=2+s;
       ↓
   if(y+q[
s][k][3]>0)chizu[x+p[2][3][3]][y+q[2][3][3]]=2+2;
       ↓
   if(y+
2>0)chizu[x+0][y+2]=4;
       ↓
   if(y>0)chizu[x][y+2]=4;
ということで、011の一番下の正方形のy座標が下限を0を超えているかを調べ、
超えている場合に4を代入しています。
i=3のとき、

以上から、ブロックを構成するすべての正方形について、
y座標が下限の0を超えているときだけ、4を代入して、
天井より下に現れた正方形だけを描くことに成功しているわけです。

さて、次の課題は↓キーではなく時間とともに自動的に落ちてくるようにするには、
どうするかです。
現在時刻を利用します。
DXライブラリーでは、現在時刻はGetNowCount()で取得できます。
これは、コンピュータが起動したから過ぎた時間をミリ秒単位で報告する社員ですから、
int型の関数です。
つまり、int型の整数を返してくる社員です。
グローバルint型変数hajimenojikokuを用意して、
ゲーム起動時の時刻をゲットしておいて、
現在時刻とhajimenojikokuの差を1000等の数で割った数をyの値にすればよいのです。
1000という値を例示したのは、単位がミリ秒(1/10000秒)ですから、
1000で割ったときに、秒単位になるからです。
ブロックを自動的に下ろしていくという課題が成就できます。



第3話へ   第5話へ

002

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

数独のシンプルな解き方・簡単な解法の研究
VB講義へ
VB講義基礎へ
初心者のための世界で一番わかりやすいVisual C++入門基礎講座
初心者のための世界で一番わかりやすいVisual Basic入門基礎講座
初心者のための世界で一番わかりやすいVBA入門講義(基礎から応用まで)
初心者のための VC++による C言語 C++ 入門 基礎から応用まで第1部
ecliqse java 入門
java 入門 サイト 基礎から応用まで
本サイトトップへ