C++编写俄罗斯方块游戏(三)

2014-11-24 10:37:43 · 作者: · 浏览: 5
][j] == 1)
{
TRACE("i = %d, j = %d\n", i, j);
Russian[p.x+i][p.y+j] = 0;
}
}
}


for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (a[i][j] == 1)
{
TRACE("上下左右:i = %d, j = %d\n", i, j);
switch(direction)
{
//左移动
case 1:
if ((p.y+j-1)<0)
goto exit;
if (Russian[p.x+i][p.y+j-1] == 1)
goto exit;
break;
//右移动
case 2:
if ((p.y+j+1)>=m_col)
goto exit;
if (Russian[p.x+i][p.y+j+1] == 1)
goto exit;
break;
//下移
case 3:
if ((p.x+i+1)>=m_row)
goto exit;
if (Russian[p.x+i+1][p.y+j] == 1)
goto exit;
break;
//变换
case 4:
if (!Change(a, p, Russian))
goto exit;
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
GameSquare[i][j] = GameSquAfter[i][j];
a[i][j] = GameSquare[i][j];
}
}
return false;
break;

}
}

}
}

int x, y;
x = p.x;
y = p.y;
//移动位置,重新给数组赋值
switch(direction)
{
case 1:
y--;
break;
case 2:
y++;
break;
case 3:
x++;
break;
case 4:
break;
}


for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (a[i][j] == 1)
{
Russian[x+i][y+j] = 1;
}
}
}
return false;


exit:
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (GameSquWill[i][j] == 1)
{
Russian[p.x+i][p.y+j] = 1;
TRACE("p.x+i = %d, p.y+j = %d\n", p.x+i, p.y+j);
}
}
}
return true;
}


bool CWndMain::Change(int a[][4], CPoint p, int b[][100])
{
int temp[4][4];
int i, j;
int k=4, l=4;


for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
a[i][j] = GameSquWill[i][j];
}
}


//存放变换后的方块矩阵
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
temp[i][j] = a[j][3-i];
}
}


for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (temp[i][j] == 1)
{
TRACE("111111:i = %d, j = %d\n", i, j);
TRACE("222222:k = %d, k = %d\n", k, l);
if (k>i) k=i;
if (l>j) l=j;
TRACE("333333:k = %d, k = %d\n", k, l);
}
}
}


for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
GameSquWill[i][j] = 0;
}
}


//把变换后的矩阵移到左上角
for (i=k; i<4; i++)
{
for (j=l; j<4; j++)
{
GameSquWill[i-k][j-l] = temp[i][j];
TRACE("4444444:i= %d, j = %d\n", i, j);
TRACE("5555555:i-k= %d, j-l = %d\n", i-k, j-l);
}
}


//判断是否接触,是:返回失败
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (GameSquAfter[i][j] == 0) continue;
if (((p.x+i)>=m_row) || ((p.y+j)<0) ||((p.y+j)>m_col))
{
return false;
}
if (b[p.x+i][p.y+j] == 1)
{
return false;
}
}
}
return true;
}




void CWndMain::LineDelete()
{
int i,j, k, l;
//本次共消去的行数
int m=0;
bool flag = 0;
for (i=0; i {
//检查要不要消行
flag = true;
for (j=0; j {
if (Russian[i][j] == 0)
{
TRACE("检查要不要消行:i = %d, j = %d\n", i, j);
flag = false;
}
}
//如果要消行
if (flag == true)
{
m++;
TRACE("///////m = %d\n", m);
for (k=i; k>0; k--)
{
//上行给下行
for (l=0; l {
TRACE("赋值前:k = %d, l = %d\n", k, l);
Russian[k][l] = Russian[k-1][l];
TRACE("赋值后:k = %d, l = %d\n", k, l);
}
}
//第一行为0
// for (l=0; l // {
// Russian[0][1] = 0;
// }
}
}
DrawWill();


//加分
switch(m)
{
case 1:
m_Score++;
break;
case 2:
m_Score += 3;
break;
case 3:
m_Score += 6;
break;
case 4:
m_Score += 10;
break;
default:
break;
}


//速度
m_Speed = m_Score/50;


//游戏结束
for (i=0; i<4; i++)
{
for (j=0; j<4; j++)
{
if (GameSquare[i][j] == 1)
{
TRACE("消行:i = %d, j = %d\n", i, j);
//到了顶点
if (Russian[i+NowPosition.x][j+NowPosition.y] == 1)
{
TRACE("i+NowPosition.x = %d, j+NowPosition.y = %d\n", i+NowPosition.x, j+NowPosition.y);
m_End = TRUE;
MessageBox("游戏结束");
return;
}
}
}
}
}


void CWndMain::OnKeyDown(UINT nChar, UINT nRepCnt, UINT nFlags)
{
// switch(nChar)
// {
// case VK_LEFT:
// MessageBox("向左");
//
// // g_wndMain.MoveDir(1);
// break;
// case VK_RIGHT:
// // g_wndMain.MoveDir(2);
//
// MessageBox("向右");
// break;
// case VK_DOWN:
// // g_wndMain.MoveDir(3);
//
// MessageBox("向下");
// break;
// default:
// ASSERT(0);
// break;
// }

CWnd::OnKeyDown(nChar, nRepCnt, nFlags);
}


BOO