記事一覧

14:

//GameMain.cpp GameMain.h

/プロトタイプ宣言
・変数
int BlockSpin(); //ブロックの回転処理

・関数
struct _Player
{
int x,y;
}Player[4],;
にPlayer_next[4];を追加
   //回転後のブロック予定値を入れる

//ブロックの回転
int BlockSpin(){
int x,y,base;//回転後の基準値を入れる
switch(nowBlock)
{
case 1:
Player_next[0].x=Player[0].x; Player_next[0].y=Player[0].y;
Player_next[1].x=Player[1].x; Player_next[1].y=Player[1].y;
Player_next[2].x=Player[2].x; Player_next[2].y=Player[2].y;
Player_next[3].x=Player[3].x; Player_next[3].y=Player[3].y;

break;//回転処理なし
case 2:
if(Player[0].y==Player[1].y)//横1列の場合
{
x=Player[2].x;y=Player[2].y;base=2;
Player_next[0].x=x; Player_next[0].y=y-2;
Player_next[1].x=x;Player_next[1].y=y-1;
Player_next[2].x=x; Player_next[2].y=y;
Player_next[3].x=x;Player_next[3].y=y+1;
}
else//縦の場合
{
x=Player[2].x;y=Player[2].y;base=2;
Player_next[0].x=x-2; Player_next[0].y=y;
Player_next[1].x=x-1; Player_next[1].y=y;
Player_next[2].x=x; Player_next[2].y=y;
Player_next[3].x=x+1; Player_next[3].y=y;

}
break;
case 3:
if(Player[0].y==Player[1].y)//zの場合
{
x=Player[1].x;y=Player[1].y;base=1;
Player_next[0].x=x; Player_next[0].y=y-1;
Player_next[1].x=x;Player_next[1].y=y;
Player_next[2].x=x-1; Player_next[2].y=y;
Player_next[3].x=x-1;Player_next[3].y=y+1;
}
else//z縦の場合
{
x=Player[1].x;y=Player[1].y;base=1;
Player_next[0].x=x-1; Player_next[0].y=y;
Player_next[1].x=x; Player_next[1].y=y;
Player_next[2].x=x; Player_next[2].y=y+1;
Player_next[3].x=x+1; Player_next[3].y=y+1;

}
break;
case 4:
if(Player[0].y==Player[1].y)//zの場合
{
x=Player[1].x;y=Player[1].y;base=1;
Player_next[0].x=x; Player_next[0].y=y-1;
Player_next[1].x=x;Player_next[1].y=y;
Player_next[2].x=x+1; Player_next[2].y=y;
Player_next[3].x=x+1;Player_next[3].y=y+1;
}
else//z縦の場合
{
x=Player[1].x;y=Player[1].y;base=1;
Player_next[0].x=x+1; Player_next[0].y=y;
Player_next[1].x=x; Player_next[1].y=y;
Player_next[2].x=x; Player_next[2].y=y+1;
Player_next[3].x=x-1; Player_next[3].y=y+1;

}
case 5:

break;
}

//回転先にブロックがあるかどうか
int flag=0;
//現在地のブロック消去
for(int i=0;i<4;i++)
{
Block[Player[i].x][Player[i].y].num=0;
}

for(int i=0;i<4;i++){
if( (Block[Player_next[i].x][Player_next[i].y].num!=0 && i!=base) || Player_next[i].x>9 ||Player_next[i].x<0 || Player_next[i].y>19 )
{
flag=1;
}//ブロックがあればflagを1
}
//ブロックがなければブロックを入れる
if(flag==0){
for(int i=0;i<4;i++)
{
Player[i].x=Player_next[i].x;
Player[i].y=Player_next[i].y;
}
}
//ブロックセット
for(int i=0;i<4;i++)
{
Block[Player[i].x][Player[i].y].num=nowBlock;
}

return flag;

}

モチベーションが上がらない|´・ω・)

ルール

wikipediaを見てたら
http://ja.wikipedia.org/wiki/%E3%83%86%E3%83%88%E3%83%AA%E3%82%B9
テトリスの項目にルールが書いてあった。

今更だけど、これにしたがって作ろう。

13:

//GameMain.cpp GameMain.h

/プロトタイプ宣言
・変数
・関数


・Block_Move
//移動先のブロックが自ブロックだった場合
if(Player[i].y+1==Player[j].y)
このままだとxが違っても除外するから
if( (Player[i].y+1==Player[j].y)&&(Player[i].x==Player[j].x) )


・Block_Move2

//移動先のブロックが自ブロックだった場合
if(Player[i].x+move==Player[j].x)
このままだと高さが違っても除外するから
if( (Player[i].x+move==Player[j].x)&&(Player[i].y==Player[j].y) )

に修正

テトリスって1段消したら上のブロックは1段下がる
で良かったんだっけ・・?
ファイル 28-1.jpg
浮いてる状態を見るとなんか不安になった(;´д`A``

携帯のテトリスも浮いてたからこれでいいのかな?

それとも1列全部空いてるとき下がるのか(結局1列消えたときだから同じか)


まぁ置いといて、次は回転

12:

//GameMain.cpp GameMain.h

/プロトタイプ宣言
・変数
・関数

・Block_Set

case 1://四角
Player[0].x=3;Player[0].y=3;
Player[1].x=4;Player[1].y=3;
Player[2].x=3;Player[2].y=4;
Player[3].x=4;Player[3].y=4;
break;
case 2://棒
Player[0].x=2;Player[0].y=4;
Player[1].x=3;Player[1].y=4;
Player[2].x=4;Player[2].y=4;
Player[3].x=5;Player[3].y=4;
break;
case 3://z
Player[0].x=3;Player[0].y=3;
Player[1].x=4;Player[1].y=3;
Player[2].x=4;Player[2].y=4;
Player[3].x=5;Player[3].y=4;
break;
case 4://zの逆
Player[0].x=5;Player[0].y=3;
Player[1].x=4;Player[1].y=3;
Player[2].x=4;Player[2].y=4;
Player[3].x=3;Player[3].y=4;
break;
case 5://とつ
Player[0].x=3;Player[0].y=3;
Player[1].x=2;Player[1].y=4;
Player[2].x=3;Player[2].y=4;
Player[3].x=4;Player[3].y=4;
break;
他の形のブロックの初期値を設定(仮)

・GameFrame

//停止フラグが立って
if(flag==1){
//まだ止まっていない場合
if( PlayerTime==0){...}
//ブロックが落ちなくなって一定時間たったら次のブロックを出す
else if( (gl_nowTime-PlayerTime > PlayerWaitTime) ){
if(flag==1){Block_Set();}
...}
}


if(flag==1){Block_Set();}

if(flag==1){nowBlock=rand()%5;Block_Set();}


とりあえず、これで全部の種類のブロックが出るようになった
次は当たり判定の修正

11:

//GameMain.cpp GameMain.h

・GameFrame()

//停止フラグが立って
if(flag==1){
//まだ止まっていない場合
if( PlayerTime==0){
//停止時間
PlayerTime=timeGetTime();
}
//ブロックが落ちなくなって一定時間たったら次のブロックを出す
else if( (gl_nowTime-PlayerTime > PlayerWaitTime) ){
if(flag==1){Block_Set();}
PlayerTime=0;
//ブロック判定
BlockCheck();
}
}

修正

10:

//GameMain.cpp GameMain.h

/プロトタイプ宣言
・変数
ロ:int BreakFlag; ブロックが1列以上そろっている時 1
ロ:DWORD BreakTime; ブロックがそろったときの時間
・関数
ロ:int BreakCheck(); ブロックがそろってるかチェック そろてったら消して1を返す
ロ:void BlockDown(); ブロックが消えたら上のブロックを落とす


・GameInit

BreakFlag=0;
BreakTime=0;

・GameFrame

ブロック処理の開始を
if(BreakFlag==0){}
でくくる
その下
else if(BreakFlag==1)


//ブロックの判定
・BlockCheck
//BreakFlag ブロックの削除があったら1にする

for(int i=5;i<25;i++){
int check=1;
for(int j=0;j<10;j++)
{
if(Block[j][i].num==0){ check=0; break;} //1箇所でもブロックがない場合 0にしてbreak
}
//ブロックが10個そろってる場合
//ブロックの削除
if(check==1)
{
for(int j=0;j<10;j++){Block[j][i].num=0;}
BreakFlag=1;
BreakTime=timeGetTime();
}
}

・BlockDown

for(int i=24;i>5;i--)
{
//ブロックが1個もない状態が0
int check=0;
for(int j=0;j<10;j++)
{
if(Block[j][i].num!=0){ check=1; break;}//1個でもブロックがあったら 1
}
//ブロックが1個もない場合
if(check==0){
for(int j=0;j<10;j++)
{
if(Block[j][i-1].num!=0){ check=1; break;}//1個上に1個でもブロックがあったら 1
}
if(check==1)
{
//入れ替え処理
for(int y=i;y>5;y--)
{
for(int x=0;x<10;x++)
{
Block[x][y].num=Block[x][y-1].num;
}
}
BlockDown();
}
}
}

ファイル 25-1.png

9:

//GameMain.cpp GameMain.h

/プロトタイプ宣言


・Block_Move2

Block_Moveを改良して横移動をできるようにする

void Block_Move2()
{

 int flag=0;//移動フラグ、移動先にブロックがあれば1
 int move=-(InKey[LEFT].flag==1)+(InKey[RIGHT].flag==1);

for(int i=0;i<4;i++)
 {
  // 移動先にブロックがある場合画面外
  if( Block[Player[i].x+move][Player[i].y].num!=0 || ( Player[i].x+move <0 || Player[i].x+move >9 ) )
  {
    flag=1;//移動フラグを立てる
//画面内のとき移動先ブロックの識別
  if(( Player[i].x+move >=0 && Player[i].x+move <10 ) ){
for(int j=0;j<4;j++){
//移動先のブロックが自ブロックだった場合 
 if(Player[i].x+move==Player[j].x)
 {           flag=0;    break;
      }//フラグを0にして移動をさせる
}
   }

   if(flag==1)break;//移動できないからループから抜ける
  }
 }
//移動フラグが0のとき移動処理
if(flag==0){
 for(int i=0;i<4;i++)
  {
   Block[Player[i].x][Player[i].y].num=0;
   Player[i].x+=move;
  }
 for(int i=0;i<4;i++)
  {
   Block[Player[i].x][Player[i].y].num=nowBlock;
  }
 }

}

とりあえず
・移動先にブロックがあるかどうか
・移動先は画面内か
を判定するようにした


・GameFrame

//キーの入力
InKey_Frame();

ブロックの落下判定で
if( (gl_nowTime-BlockTime > BlockWaitTime))

if( (gl_nowTime-BlockTime > BlockWaitTime) || (InKey[DOWN].flag==1) )
に変更して、下キーが押されたら時間関係なしで落下するようにした

//ブロックが落ちなくなって一定時間たったら次のブロックを出す
if( (gl_nowTime-PlayerTime > PlayerWaitTime) && PlayerTime!=0 )
{
PlayerTime=0;
Block_Set();
}

if( (gl_nowTime-PlayerTime > PlayerWaitTime) && PlayerTime!=0 )
{
PlayerTime=0;
if(flag==1){ Block_Set(); }
}
一度ブロックの上に置く→横へ移動
をすると空中で停止するバグがあったから修正

//ブロックの横移動
if( gl_nowTime-BlockTime2 > BlockWaitTime2&& (InKey[LEFT].flag==1||InKey[RIGHT].flag==1) )
{
 BlockTime2=timeGetTime();//今回の落下時間
 Block_Move2();
}

8:

//GameMain.cpp GameMain.h

/プロトタイプ宣言

/* キーの識別*/
#define KEY_TIME500// キーを離した後の認識時間
#define UP0
#define DOWN1
#define LEFT2
#define RIGHT3
#define JUMP4
#define DUSH5

・構造体
キー入力用構造体
 typedef struct _KeyFlag{
 int flag;// 0:押していない 1:押してる 2:押した後
 DWORD time;// 時間
 }KeyFlag,*LPKeyFlag;

・変数
 グ:KeyFlag InKey[256];
・関数
ちょっと無駄かもしれないけど落下と横移動で関数を分ける
 ロ:void Block_Move2(); //ブロックの横移動よう関数
 グ:void InKey_Frame();//キー入力


・void InKey_Frame()
DWORD tmpTime=timeGetTime();

if(g_diKeyState[DIK_UP] & 0x80){ InKey[UP].flag=1; InKey[UP].time=tmpTime; }
else if(InKey[UP].flag==1){ InKey[UP].flag=2; InKey[UP].time=tmpTime;}
else if(InKey[UP].flag==2 && gl_nowTime - InKey[UP].time > KEY_TIME){ InKey[UP].flag=0; }
同じようにLEFT,RIGHT,DOWN,Z,X

7:

//GameMain.cpp GameMain.h

/プロトタイプ宣言
・変数
 ロ:DWORD PlayerTime;//落下中のブロックが止まった時間時間
 ロ:int PlayerWaitTime;//止まってから次のブロックへ移すまでの時間
・関数


・GameFrame()

//停止フラグが立って、なおかつまだ止まっていない場合
if(flag==1 && PlayerTime==0){
//停止時間
PlayerTime=timeGetTime();
}

//ブロックが落ちなくなって一定時間たったら次のブロックを出す
if( (gl_nowTime-PlayerTime > PlayerWaitTime) && PlayerTime!=0 )
{
PlayerTime=0;
Block_Set();
}

ファイル 22-1.png

6:

//GameMain.cpp GameMain.h

/プロトタイプ宣言

・構造体
//今落ちてるブロックの位置
struct _Player{
int x,y;
}Player[4];

・関数
 ロ:void Block_Set(); 新たに落ちるブロックのセット
 ロ:int Block_Move();
・変数
 ロ:int nowBlock;//今落ちているブロック
 ロ;DWORD BlockTime;//前回ブロックが落下した時間
 ロ:int BlockWaitTime;//ブロックの落下感覚

/処理

・GameInit()

テスト用初期化
nowBlock=1;
Block_Set();
BlockWaitTime=500;
BlockTime=0;


・GameFrame()

//ブロックの落下
int flag=0;//ブロックがこれ以上落下できない場合 1 にする
if(gl_nowTime-BlockTime > BlockWaitTime )
{

BlockTime=timeGetTime();//今回の落下時間
flag=Block_Move();
}


・Block_Move()

int flag=0;//移動フラグ、移動先にブロックがあれば1
for(int i=0;i<4;i++)
{
// 移動先にブロックがある場合 一番下まで来た場合
if((Block[Player[i].x][Player[i].y+1].num!=0 || Player [i].y>=24 ) )
{
flag=1;//移動フラグを立てる
for(int j=0;j<4;j++){
//移動先のブロックが自ブロックだった場合
if(Player[i].y+1==Player[j].y)
{
flag=0;
break;
}//フラグを0にして移動をさせる
}
if(flag==1)break;//移動できないからループから抜ける
}
}
//移動フラグが0のとき移動処理
if(flag==0)
{
for(int i=0;i<4;i++)
{
Block[Player[i].x][Player[i].y].num=0;
Player[i].y++;
}
for(int i=0;i<4;i++)
{
Block[Player[i].x][Player[i].y].num=nowBlock;
}
return flag;
}

ページ移動