论坛: 编程破解 标题: 谁可以编出俄罗斯方块呢 复制本贴地址    
作者: gaojixiang [gaojixiang]    论坛用户   登录
帮帮吗

地主 发表时间: 05-01-01 12:37

回复: leonshoh [leonshoh]   论坛用户   登录
///
///terris.cpp
///
# include <windows.h>
# include <time.h>

# include "terris.h"

const char MenuName[]=TEXT("TerrisMenu");

int WINAPI WinMain(HINSTANCE hInstance,HINSTANCE hPrevInst,
  LPSTR CommandLine,int CommandShow)
{
MSG msg;

if(!InitClass(hInstance))
return (0);

if(!InitWindow(hInstance))
return (0);

while(GetMessage(&msg,NULL,0,0))
{
TranslateMessage(&msg);
DispatchMessage(&msg);
}
return (msg.wParam);
}

BOOL InitClass(HINSTANCE hInstMain)
{
WNDCLASSEX wc;
wc.cbSize=sizeof(WNDCLASSEX);
wc.style=CS_HREDRAW | CS_VREDRAW;
wc.lpfnWndProc=(WNDPROC)(WndProc);
wc.cbClsExtra=0;
wc.cbWndExtra=0;
wc.hInstance=hInstMain;
wc.hIcon=LoadIcon(hInstMain,"TerrisBig");
wc.hIconSm=LoadIcon(hInstMain,"TerrisSmall");
wc.hCursor=LoadCursor(NULL,IDC_ARROW);
wc.hbrBackground=(HBRUSH)(COLOR_BTNFACE+1);
wc.lpszMenuName=MenuName;
wc.lpszClassName="Terris";
if (RegisterClassEx(&wc))
return (TRUE);
else
return (FALSE);
}

BOOL InitWindow(HINSTANCE hInstMain)
{
HWND hwnd=CreateWindowEx(WS_EX_CLIENTEDGE,
                    "Terris",
"Terris",
WS_SYSMENU | WS_CAPTION | WS_MINIMIZEBOX | WS_VISIBLE,
CW_USEDEFAULT,CW_USEDEFAULT,300,460,
NULL,NULL,hInstMain,NULL);
if(hwnd)
return (TRUE);
else
return (FALSE);
}


LRESULT CALLBACK WndProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
HDC hdc;

PAINTSTRUCT ps;

static HINSTANCE  hInst;

static BLOCK BlockArray[ROWS][COLS];

static TimerInterval;

static bool FlagGameJustStart = TRUE;

switch(uMsg)
{
case WM_CREATE:
hInst=((LPCREATESTRUCT)lParam)->hInstance;
TimerInterval = EasyInterval;
CheckMenuRadioItem( GetMenu(hWnd), IDM_EASY,IDM_DIFFICULT,IDM_EASY,MF_BYCOMMAND);
break;
case WM_TIMER:
if(NeedGenerateNewBlock(BlockArray))
{
KillFullLine(hWnd,BlockArray);
if(GameOver(BlockArray))
{
    KillTimer(hWnd,TIMERID);
EnableMenuItem( GetMenu(hWnd ),IDM_START,MF_ENABLED);
EnableMenuItem( GetMenu(hWnd ),IDM_PAUSE,MF_GRAYED);
FlagGameJustStart = TRUE;
ChangeBlockStyleToGray(BlockArray);
RefreshWindow(hWnd,BlockArray);
MessageBox(hWnd,"对不起,请再来一盘","注意",MB_OK | MB_ICONEXCLAMATION);
}
else
{
MoveBlockFromPreviewToGameArea(hWnd,BlockArray);
        GenerateNewBlock(hWnd,BlockArray);
}
}
else
{
if (CanBlockMoveDown(BlockArray))
    MoveBlockDown(hWnd,BlockArray);
else
{
Moveable2Stable(BlockArray);
}
}
break;
case WM_KEYDOWN:
if ( GetMenuState(GetMenu(hWnd), IDM_START, MF_BYCOMMAND) != MF_GRAYED )
break;
switch(wParam)
{

          case VK_RIGHT:
  if(CanBlockMoveRight(BlockArray))
  {
      MoveBlockRight(hWnd,BlockArray);
  }
  break;
  case VK_LEFT:
  if(CanBlockMoveLeft(BlockArray))
  {
                  MoveBlockLeft(hWnd,BlockArray);
  }
  break;
  case VK_DOWN:
  if(CanBlockMoveDown(BlockArray))
  {
  MoveBlockDown(hWnd,BlockArray);
  }
  break;
  case VK_UP: 
  switch(JudgeBlockStyle(BlockArray))
  {
  case 0:
                    RotateStyleZero(hWnd,BlockArray);
    break;
              case 1:
    RotateStyleOne(hWnd,BlockArray);
    break;
              case 2:
    RotateStyleTwo(hWnd,BlockArray);
    break;
  case 3:
    RotateStyleThree(hWnd,BlockArray);
    break;
  case 4:
    RotateStyleFour(hWnd,BlockArray);
    break;
  case 5:
    break;
  case 6:
    RotateStyleSix(hWnd,BlockArray);
    break;
  }
  break;
}
break;
    case WM_COMMAND:
switch (LOWORD (wParam))
{
case IDM_START:
  if ( FlagGameJustStart == TRUE)
  {
  InitializeBlock( BlockArray );
  RefreshWindow(hWnd, BlockArray );
  FlagGameJustStart = FALSE;
  }
  SetTimer(hWnd,TIMERID,TimerInterval,NULL);
              EnableMenuItem( GetMenu(hWnd), IDM_START, MF_GRAYED);
              EnableMenuItem( GetMenu(hWnd), IDM_PAUSE, MF_ENABLED);
  break;
case IDM_PAUSE:
  KillTimer(hWnd,TIMERID);
  EnableMenuItem( GetMenu(hWnd), IDM_START,MF_ENABLED);
              EnableMenuItem( GetMenu(hWnd), IDM_PAUSE,MF_GRAYED);
  break;
case IDM_EXIT:
  if ( GetMenuState(GetMenu(hWnd), IDM_START, MF_BYCOMMAND) == MF_GRAYED)
  KillTimer( hWnd,TIMERID);
  DestroyWindow(hWnd);
  break;
case IDM_EASY:
  TimerInterval = EasyInterval;
              CheckMenuRadioItem( GetMenu(hWnd),IDM_EASY,IDM_DIFFICULT,IDM_EASY,MF_BYCOMMAND);
  if(GetMenuState(GetMenu(hWnd),IDM_START,MF_BYCOMMAND) == MF_GRAYED)
  {
    KillTimer(hWnd,TIMERID);
    SetTimer(hWnd,TIMERID,TimerInterval,NULL);
  }
  break;
case IDM_MEDIUM:
  TimerInterval = MediumInterval;
              CheckMenuRadioItem( GetMenu(hWnd),IDM_EASY,IDM_DIFFICULT,IDM_MEDIUM,MF_BYCOMMAND);
  if(GetMenuState(GetMenu(hWnd),IDM_START,MF_BYCOMMAND) == MF_GRAYED)
  {
    KillTimer(hWnd,TIMERID);
    SetTimer(hWnd,TIMERID,TimerInterval,NULL);
  }
  break;
case IDM_DIFFICULT:
  TimerInterval = DifficultInterval;
              CheckMenuRadioItem( GetMenu(hWnd),IDM_EASY,IDM_DIFFICULT,IDM_DIFFICULT,MF_BYCOMMAND);
  if(GetMenuState(GetMenu(hWnd),IDM_START,MF_BYCOMMAND) == MF_GRAYED)
  {
    KillTimer(hWnd,TIMERID);
    SetTimer(hWnd,TIMERID,TimerInterval,NULL);
  }
  break;
case IDM_ABOUT:
  DialogBoxParam(hInst,"DLG_ABOUT",hWnd,\
                    (DLGPROC)AboutDialogProc,(LPARAM)0);
  break;
}
break;
    case WM_PAINT:
hdc=BeginPaint(hWnd,&ps);
DrawBackground(hdc);
RefreshWindow(hWnd,BlockArray);
EndPaint(hWnd,&ps);
break;
case WM_DESTROY:
KillTimer(hWnd,TIMERID);
PostQuitMessage(0);
break;
default:
return DefWindowProc(hWnd,uMsg,wParam,lParam);
}
return (0);
}

void DrawBackground(HDC hdc)
{
HBRUSH hBrush;
POINT pt[8];

pt[0].x = OriginXPos;
pt[0].y = OriginYPos + 4 * BLOCKSIZE;

pt[1].x = OriginXPos;
pt[1].y = OriginYPos + ROWS * BLOCKSIZE;

pt[2].x = pt[1].x + COLS * BLOCKSIZE;
pt[2].y = pt[1].y;

pt[3].x = pt[2].x;
pt[3].y = pt[0].y;

pt[4].x = pt[3].x + 5;
pt[4].y = pt[3].y;

pt[5].x = pt[4].x;
pt[5].y = pt[2].y + 5;

pt[6].x = pt[0].x - 5;
pt[6].y = pt[1].y + 5;

pt[7].x = pt[6].x;
pt[7].y = pt[0].y;

    SelectObject(hdc,GetStockObject(NULL_PEN));
SelectObject(hdc,GetStockObject(WHITE_BRUSH));

Polygon(hdc,pt,8);

SelectObject(hdc,GetStockObject(BLACK_BRUSH));

Polygon(hdc,pt,4);


    pt[0].x=OriginXPos;
pt[0].y=OriginYPos;

pt[1].x=pt[0].x + BLOCKSIZE * COLS;
pt[1].y=pt[0].y;

pt[2].x=pt[1].x;
pt[2].y=pt[1].y + BLOCKSIZE * 4;

pt[3].x=pt[0].x;
pt[3].y=pt[2].y;

hBrush=CreateSolidBrush(GetPixel(hdc,0,0));
SelectObject(hdc,hBrush);

Polygon(hdc,pt,4);

SelectObject(hdc,GetStockObject(BLACK_PEN));
SelectObject(hdc,GetStockObject(NULL_BRUSH));

DeleteObject(hBrush);

}
void DrawBlock(HDC hdc,int row,int column,int BlockStyle)
{
POINT    pt[4];

COLORREF BrightBrushColor[8]={RGB(255,0,0),RGB(0,255,0),RGB(0,0,255),\
                          RGB(0,255,255),RGB(255,0,255),RGB(255,255,0),\
  RGB(200,200,200),RGB(200,200,200)};
    COLORREF MediumBrushColor[8]={RGB(180,0,0),RGB(0,180,0),RGB(0,0,180),\
                          RGB(0,200,200),RGB(200,0,200),RGB(200,200,0),\
  RGB(90,90,90),RGB(140,140,140)};
COLORREF DarkBrushColor[8]={RGB(90,0,0),RGB(0,90,0),RGB(0,0,90),\
                        RGB(0,90,90),RGB(90,0,90),RGB(90,90,0),\
RGB(40,40,40),RGB(100,100,100)};

HBRUSH hBrushBright,hBrushMedium,hBrushDark;

    hBrushBright=CreateSolidBrush(BrightBrushColor[BlockStyle]);
hBrushMedium=CreateSolidBrush(MediumBrushColor[BlockStyle]);
    hBrushDark=CreateSolidBrush(DarkBrushColor[BlockStyle]);

SelectObject(hdc,GetStockObject(NULL_PEN));
    SelectObject(hdc,hBrushBright);


pt[0].x=column* BLOCKSIZE + OriginXPos;
pt[0].y=row* BLOCKSIZE + OriginYPos;

pt[1].x=pt[0].x+BLOCKSIZE;
    pt[1].y=pt[0].y;

pt[2].x=pt[1].x-3;
pt[2].y=pt[1].y+3;

pt[3].x=pt[0].x+3;
pt[3].y=pt[0].y+3;


Polygon(hdc,pt,4);

pt[0].x=column* BLOCKSIZE + OriginXPos;
pt[0].y=row* BLOCKSIZE + OriginYPos;

pt[1].x=pt[0].x+3;
    pt[1].y=pt[0].y+3;

pt[3].x=pt[0].x;
pt[3].y=pt[0].y+BLOCKSIZE;

pt[2].x=pt[3].x+3;
pt[2].y=pt[3].y-3;


Polygon(hdc,pt,4);


SelectObject(hdc,hBrushMedium);

pt[0].x=column* BLOCKSIZE + OriginXPos+3;
pt[0].y=row* BLOCKSIZE + OriginYPos+3;

pt[1].x=column* BLOCKSIZE + OriginXPos+BLOCKSIZE-3;
pt[1].y=row* BLOCKSIZE + OriginYPos + 3;

pt[2].x=column* BLOCKSIZE + OriginXPos+BLOCKSIZE-3;
pt[2].y=row* BLOCKSIZE + OriginYPos+BLOCKSIZE - 3;

pt[3].x=column* BLOCKSIZE + OriginXPos +3;
pt[3].y=row* BLOCKSIZE + OriginYPos+BLOCKSIZE - 3;

Polygon(hdc,pt,4);

SelectObject(hdc,hBrushDark);

pt[0].x=column* BLOCKSIZE + OriginXPos+BLOCKSIZE;
pt[0].y=row* BLOCKSIZE + OriginYPos;

pt[1].x=pt[0].x;
pt[1].y=pt[0].y+BLOCKSIZE;

pt[2].x=pt[1].x - 3;
pt[2].y=pt[1].y - 3;

pt[3].x=pt[0].x - 3;
pt[3].y=pt[0].y + 3;

Polygon(hdc,pt,4);

pt[0].x=column* BLOCKSIZE + OriginXPos + BLOCKSIZE;
pt[0].y=row* BLOCKSIZE + OriginYPos + BLOCKSIZE;

pt[1].x=pt[0].x-BLOCKSIZE;
pt[1].y=pt[0].y;

pt[2].x=pt[1].x + 3;
pt[2].y=pt[1].y - 3;

pt[3].x=pt[0].x - 3;
pt[3].y=pt[0].y - 3;

    Polygon(hdc,pt,4);

SelectObject(hdc,GetStockObject(NULL_BRUSH));
SelectObject(hdc,GetStockObject(BLACK_PEN));

DeleteObject(hBrushBright);
DeleteObject(hBrushMedium);
    DeleteObject(hBrushDark);
}
void InitializeBlock(BLOCK BlockArray[ROWS][COLS])
{
int i, j;
for (i = 0; i < ROWS; i ++)
for (j = 0; j < COLS; j ++)
{
BlockArray[i][j].Flag_Is_Filled = FALSE;
BlockArray[i][j].Flag_Is_Moveable = FALSE;
BlockArray[i][j].BlockStyle = 0;
}
}
void EraseBlock(HDC hdc,int row,int column)
{
POINT pt[4];

HBRUSH hBrush;

pt[0].x=BLOCKSIZE * column + OriginXPos;
pt[0].y=BLOCKSIZE * row +OriginYPos;

pt[1].x=pt[0].x+BLOCKSIZE;
pt[1].y=pt[0].y;

pt[2].x=pt[1].x;
pt[2].y=pt[1].y+BLOCKSIZE;

pt[3].x=pt[0].x;
pt[3].y=pt[0].y+BLOCKSIZE;
   

if ((row >= 0) &&  ( row <= 3))
{
hBrush=CreateSolidBrush(GetPixel(hdc,0,0));

SelectObject(hdc,GetStockObject(NULL_PEN));
    SelectObject(hdc,hBrush);

    Polygon(hdc,pt,4);

    SelectObject(hdc,GetStockObject(BLACK_PEN));
    SelectObject(hdc,GetStockObject(NULL_BRUSH));

DeleteObject(hBrush);

}
else
{

      SelectObject(hdc,GetStockObject(NULL_PEN));
  SelectObject(hdc,GetStockObject(BLACK_BRUSH));

  Polygon(hdc,pt,4);

  SelectObject(hdc,GetStockObject(BLACK_PEN));
  SelectObject(hdc,GetStockObject(NULL_BRUSH));
}
}


void MoveBlockFromSrcToDes (BLOCK BlockArray[ROWS][COLS],int SrcRow, int SrcCol, int DesRow, int DesCol)
/* 将某一个方块从源地址移到目的地址 */
{
BlockArray[DesRow][DesCol].Flag_Is_Filled  = BlockArray[SrcRow][SrcCol].Flag_Is_Filled;
BlockArray[DesRow][DesCol].Flag_Is_Moveable = BlockArray[SrcRow][SrcCol].Flag_Is_Moveable;
BlockArray[DesRow][DesCol].BlockStyle      = BlockArray[SrcRow][SrcCol].BlockStyle;

 
BlockArray[SrcRow][SrcCol].Flag_Is_Filled  = FALSE;
BlockArray[SrcRow][SrcCol].Flag_Is_Moveable = FALSE;
BlockArray[SrcRow][SrcCol].BlockStyle      = 0;
}
void MoveBlockFromPreviewToGameArea(HWND hwnd, BLOCK BlockArray[ROWS][COLS])
{
int i,j;

    HDC hdc;

hdc = GetDC(hwnd);

for (i = 0; i < 2; i ++)
for (j = 0 ;j < COLS; j ++)
{
if (BlockArray[ i ][ j ].Flag_Is_Filled == TRUE)
{
MoveBlockFromSrcToDes(BlockArray,i, j, i + 2, j + 3 );
    DrawBlock(hdc, i + 2,j + 3, BlockArray[i + 2][j + 3 ].BlockStyle);
EraseBlock(hdc,i, j);
}
}

ReleaseDC(hwnd,hdc);
}
void GenerateNewBlock(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{

int i,j;

HDC hdc;

srand( (unsigned)time( NULL ) );
    switch ( rand()%7 )
{
case 0:
      BlockArray[0][0].BlockStyle=0;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=0;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
        BlockArray[0][2].BlockStyle=0;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE;
BlockArray[0][3].BlockStyle=0;BlockArray[0][3].Flag_Is_Filled=TRUE;BlockArray[0][3].Flag_Is_Moveable=TRUE;

break;
case 1:
    BlockArray[0][1].BlockStyle=1;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
BlockArray[0][2].BlockStyle=1;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE;
        BlockArray[1][0].BlockStyle=1;BlockArray[1][0].Flag_Is_Filled=TRUE;BlockArray[1][0].Flag_Is_Moveable=TRUE;
BlockArray[1][1].BlockStyle=1;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE;


break;
case 2:
  BlockArray[0][0].BlockStyle=2;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=2;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
        BlockArray[0][2].BlockStyle=2;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE;
BlockArray[1][0].BlockStyle=2;BlockArray[1][0].Flag_Is_Filled=TRUE;BlockArray[1][0].Flag_Is_Moveable=TRUE;


break;
case 3:

BlockArray[0][0].BlockStyle=3;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=3;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
        BlockArray[0][2].BlockStyle=3;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE;
BlockArray[1][1].BlockStyle=3;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE;


  break;
case 4:
BlockArray[0][0].BlockStyle=4;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=4;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
        BlockArray[1][1].BlockStyle=4;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE;
BlockArray[1][2].BlockStyle=4;BlockArray[1][2].Flag_Is_Filled=TRUE;BlockArray[1][2].Flag_Is_Moveable=TRUE;

break;
case 5:
BlockArray[0][0].BlockStyle=5;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=5;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
        BlockArray[1][0].BlockStyle=5;BlockArray[1][0].Flag_Is_Filled=TRUE;BlockArray[1][0].Flag_Is_Moveable=TRUE;
BlockArray[1][1].BlockStyle=5;BlockArray[1][1].Flag_Is_Filled=TRUE;BlockArray[1][1].Flag_Is_Moveable=TRUE;


break;
case 6:
BlockArray[0][0].BlockStyle=6;BlockArray[0][0].Flag_Is_Filled=TRUE;BlockArray[0][0].Flag_Is_Moveable=TRUE;
BlockArray[0][1].BlockStyle=6;BlockArray[0][1].Flag_Is_Filled=TRUE;BlockArray[0][1].Flag_Is_Moveable=TRUE;
        BlockArray[0][2].BlockStyle=6;BlockArray[0][2].Flag_Is_Filled=TRUE;BlockArray[0][2].Flag_Is_Moveable=TRUE;
BlockArray[1][2].BlockStyle=6;BlockArray[1][2].Flag_Is_Filled=TRUE;BlockArray[1][2].Flag_Is_Moveable=TRUE;

break;
}
hdc=GetDC(hwnd);

for(i=0;i<2;i++)
  for(j=0;j<COLS;j++)
if(BlockArray[i][j].Flag_Is_Filled)
DrawBlock(hdc,i,j,BlockArray[i][j].BlockStyle);

ReleaseDC(hwnd,hdc);
}
BOOL GameOver(BLOCK Block[ROWS][COLS])
{
int i;
    BOOL Flag=FALSE;
for(i=0;i<COLS;i++)
if (Block[4][i].Flag_Is_Moveable==FALSE && Block[4][i].Flag_Is_Filled==TRUE)
Flag=TRUE;
return (Flag);
}

BOOL NeedGenerateNewBlock(BLOCK Block[ROWS][COLS])
{
int i,j;

BOOL Flag=TRUE;

for(i = 2;i < ROWS ;i ++)
for(j = 0;j < COLS; j ++)
if (Block[i][j].Flag_Is_Moveable==TRUE)
Flag=FALSE;

return (Flag);
}

BOOL CanBlockMoveDown(BLOCK Block[ROWS][COLS])
{
int i,j;
int Flag=TRUE;

for(i = 2; i < ROWS; i++)
for(j = 0; j < COLS; j++)
{
if (Block[i][j].Flag_Is_Moveable==TRUE)
{
if (i==ROWS-1)
Flag=FALSE;
if(Block[i+1][j].Flag_Is_Filled==TRUE && Block[i+1][j].Flag_Is_Moveable==FALSE)
                    Flag=FALSE;
}
}
return (Flag);
}
BOOL CanBlockMoveRight(BLOCK BlockArray[ROWS][COLS])
{
int i,j;
int Flag=TRUE;

for(i = 2 ;i < ROWS; i ++)
for(j = 0 ; j < COLS; j ++)
{
if (BlockArray[i][j].Flag_Is_Moveable==TRUE)
{
if (j==COLS-1)
Flag=FALSE;
if(BlockArray[i][j+1].Flag_Is_Filled==TRUE && BlockArray[i][j+1].Flag_Is_Moveable==FALSE)
                    Flag=FALSE;
}
}
return (Flag);
}
BOOL CanBlockMoveLeft(BLOCK BlockArray[ROWS][COLS])
{
    int i,j;
int Flag=TRUE;

for(i = 2; i < ROWS; i ++)
for(j = 0;j <COLS ;j ++)
{
if (BlockArray[i][j].Flag_Is_Moveable==TRUE)
{
if (j==0)
Flag=FALSE;
    if(BlockArray[i][j-1].Flag_Is_Filled==TRUE && BlockArray[i][j-1].Flag_Is_Moveable==FALSE)
                    Flag=FALSE;
}
}

return (Flag);

}
void Moveable2Stable(BLOCK Block[ROWS][COLS])
{
int i,j;

for(i = 2; i < ROWS; i++)
  for(j = 0;j < COLS; j++)
  if (Block[i][j].Flag_Is_Filled==TRUE)
  Block[i][j].Flag_Is_Moveable=FALSE;


}
void KillFullLine(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
HDC hdc;

int i,j; int m,n;

int Flag;

hdc=GetDC(hwnd);

for(i=ROWS-1;i >= 4;i--)
{
Flag=TRUE;         
for(j=0;j<COLS;j++)
if (BlockArray[i][j].Flag_Is_Filled == FALSE)
Flag=FALSE;         
if(Flag==TRUE)           
{
for(m=i;m >= 4;m--)   
    for(n=0;n<COLS;n++)    {                  
MoveBlockFromSrcToDes(BlockArray,m - 1, n, m, n);

                    if(BlockArray[m][n].Flag_Is_Filled==TRUE)     
  DrawBlock(hdc,m,n,BlockArray[m][n].BlockStyle);
else
      EraseBlock(hdc,m,n);                       
  }
i++;       
}
}
ReleaseDC(hwnd,hdc);
}



void MoveBlockDown(HWND hwnd,BLOCK Block[ROWS][COLS])
{
int i,j;

HDC hdc;

hdc=GetDC(hwnd);
for(i = ROWS-1;i >= 2;i--) 
  for(j=0;j<COLS;j++)
                   
  if (Block[i][j].Flag_Is_Moveable==TRUE)
  {
MoveBlockFromSrcToDes(Block,i,j,i+1,j);
DrawBlock(hdc,i+1,j,Block[i+1][j].BlockStyle);
                EraseBlock(hdc,i,j);
  }
ReleaseDC(hwnd,hdc);
}

void MoveBlockRight(HWND hwnd, BLOCK BlockArray[ROWS][COLS])
{
int i,j;

HDC hdc;


hdc=GetDC(hwnd);

for(i = COLS-1 ;i >= 0; i--)
    for(j = 2;j < ROWS; j++)
{
if (BlockArray[j][i].Flag_Is_Moveable==TRUE)
{
MoveBlockFromSrcToDes(BlockArray,j,i,j,i+1);
      DrawBlock(hdc,j,i+1,BlockArray[j][i+1].BlockStyle);
EraseBlock(hdc,j,i);
}
}

ReleaseDC(hwnd,hdc);
}

void MoveBlockLeft(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i,j;

HDC hdc;

    hdc=GetDC(hwnd);

for(i = 0 ;i < COLS; i++)
    for(j = 2;j < ROWS; j++)
{
if (BlockArray[j][i].Flag_Is_Moveable==TRUE)
{
MoveBlockFromSrcToDes(BlockArray,j,i,j,i-1);
DrawBlock(hdc,j,i-1,BlockArray[j][i-1].BlockStyle);
EraseBlock(hdc,j,i);
}
}
ReleaseDC(hwnd,hdc);
}

int JudgeBlockStyle(BLOCK BlockArray[ROWS][COLS])
{
int style;

int i,j;

for(i = 2; i < ROWS ; i++)
{
  for(j = 0; j < COLS; j++)
  if(BlockArray[i][j].Flag_Is_Moveable==TRUE)
{
    style=BlockArray[i][j].BlockStyle;
    break;
}
      if (j < COLS) break;
}
    return (style);
}

void RotateStyleZero(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i,j;

int m,n;

    HDC hdc;

hdc=GetDC(hwnd);

for(i = 2 ; i < ROWS ; i++)
{
  for(j = 0 ;j < COLS ;j++)
  {
  if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
  break;;
  }
  if ( j < COLS ) break;
}

if(BlockArray[i][j + 1].Flag_Is_Moveable == TRUE)   
{

if (i == 2)   
    return;

if (i >= ROWS -2)
return ;

if (BlockArray[i-1][j].Flag_Is_Filled==TRUE || BlockArray[i-1][j+1].Flag_Is_Filled==TRUE)
return ;

for(m= i + 1 ;m <= i + 2 ; m++)
{
for (n = j + 1; n <= j + 3; n++ )
{
if ( BlockArray[m][n].Flag_Is_Filled == TRUE )
    return ;
}
}
     

{
MoveBlockFromSrcToDes(BlockArray, i, j, i - 1,j + 1);
DrawBlock(hdc,i-1,j+1,0);
EraseBlock(hdc,i,j);

MoveBlockFromSrcToDes(BlockArray,i,j + 2,i + 1,j + 1);
DrawBlock(hdc,i + 1, j + 1,0);
EraseBlock(hdc,i,j + 2);

MoveBlockFromSrcToDes(BlockArray, i,j + 3, i + 2,j + 1);
DrawBlock(hdc,i + 2, j + 1,0);
EraseBlock(hdc,i,j + 3);
}
}
else
{

if (j >= COLS - 2)
return ;

if (j == 0)
return ;

if (BlockArray[i][j-1].Flag_Is_Filled==TRUE || BlockArray[i+1][j-1].Flag_Is_Filled==TRUE)
return ;

for(m= i + 1 ;m <= i + 3 ; m++)
{
for (n = j + 1; n <= j + 2; n++ )
{
if ( BlockArray[m][n].Flag_Is_Filled == TRUE )
return ;
}
}


{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1,j - 1);
DrawBlock(hdc,i + 1,j - 1,0);
EraseBlock(hdc,i,j);

MoveBlockFromSrcToDes(BlockArray,i + 2,j ,i + 1,j + 1);
DrawBlock(hdc,i + 1, j + 1,0);
EraseBlock(hdc,i + 2, j );

MoveBlockFromSrcToDes(BlockArray, i + 3 , j , i + 1,j + 2);
DrawBlock( hdc, i + 1, j + 2,0);
EraseBlock( hdc , i + 3, j );
}
}
    ReleaseDC(hwnd,hdc);

}

void RotateStyleOne(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;

int m ;

HDC hdc;

hdc=GetDC(hwnd);

for(i = 2 ; i < ROWS ; i++)
{
  for(j = 0 ;j < COLS ;j++)
  {
  if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
  break;
  }
  if ( j < COLS )
  break;
}     

    if ( BlockArray[i][j + 1].Flag_Is_Moveable == TRUE )   
{
if( i == 2)
return;

if( i >= ROWS - 2)
return;

if( BlockArray[i - 1][  j  ].Flag_Is_Filled == TRUE) return;

if( BlockArray[i - 1][j + 1].Flag_Is_Filled == TRUE) return;

if( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE ) return;

for(m = j -1 ; m <= j + 1; m++)
  if (BlockArray[i + 2][ m ].Flag_Is_Filled == TRUE )
  return;

{
MoveBlockFromSrcToDes(BlockArray, i + 1, j ,i -1,j);
DrawBlock(hdc, i - 1, j, 1);
EraseBlock(hdc,i + 1, j );

MoveBlockFromSrcToDes(BlockArray, i + 1, j - 1, i + 1,j + 1);
DrawBlock(hdc, i + 1, j + 1, 1);
EraseBlock(hdc,i + 1, j - 1);
}
}

else
{
if ( i >= ROWS -3)
return;

if ( j < 1 )
return;

if ( BlockArray[  i  ][j + 1].Flag_Is_Filled == TRUE) return;

if ( BlockArray[i + 2][  j  ].Flag_Is_Filled == TRUE) return;

if ( BlockArray[i + 2][j - 1].Flag_Is_Filled == TRUE) return;

for(m = j ; m <= j + 1; m ++)
  if (BlockArray[i + 3][ m ].Flag_Is_Filled == TRUE )
  return;


{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 2, j);
DrawBlock(hdc,  i + 2, j, 1);
EraseBlock(hdc, i, j);

MoveBlockFromSrcToDes(BlockArray, i + 2, j + 1, i + 2, j - 1);
DrawBlock(hdc, i + 2,j - 1,1);
EraseBlock(hdc,i + 2,j + 1);
}

}
    ReleaseDC(hwnd,hdc);
}

void RotateStyleTwo(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;

int m ;

HDC hdc;

hdc=GetDC(hwnd);

for(i = 2 ; i < ROWS ; i++)
{
  for(j = 0 ;j < COLS ;j++)
  {
  if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
  break;
  }
  if (j < COLS)
  break;
}     

if( BlockArray[i][j + 1].Flag_Is_Moveable == TRUE && \
BlockArray[i + 1][j].Flag_Is_Moveable == TRUE )
{
if ( i == 2 ) return; // 叛定积木是不是在最上面一行

if ( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE)
return;

if ( BlockArray[i - 1][j + 1].Flag_Is_Filled == TRUE || \
BlockArray[i - 1][j + 2].Flag_Is_Filled == TRUE)
return;

if ( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE ||
BlockArray[i + 1][j + 2].Flag_Is_Filled == TRUE)
return;
{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1, j + 1);
DrawBlock(hdc, i + 1, j + 1, 2);
EraseBlock(hdc, i, j);

MoveBlockFromSrcToDes(BlockArray, i, j + 2, i - 1, j + 1);
DrawBlock(hdc, i - 1, j + 1, 2);
EraseBlock(hdc, i, j + 2);

MoveBlockFromSrcToDes(BlockArray, i + 1, j, i + 1, j + 2);
DrawBlock(hdc, i + 1, j + 2, 2);
EraseBlock(hdc, i + 1, j );
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][  j  ].Flag_Is_Moveable == TRUE && \
BlockArray[i + 2][  j  ].Flag_Is_Moveable == TRUE)
{

if ( j == 0 ) return;

if ( BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j - 1].Flag_Is_Filled == TRUE )
    return;

if ( BlockArray[i + 3][  j  ].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE )
return;

if ( BlockArray[  i  ][j + 1].Flag_Is_Filled == TRUE)
return;

for(m = i; m < i + 3; m ++)
if( BlockArray[ m ][j + 2].Flag_Is_Filled == TRUE)
return;

{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1, j - 1);
DrawBlock(hdc, i + 1, j - 1, 2);
EraseBlock(hdc, i, j);

MoveBlockFromSrcToDes(BlockArray, i + 2, j, i + 1, j + 1);
DrawBlock (hdc, i + 1,  j + 1, 2);
EraseBlock(hdc, i + 2, j);

MoveBlockFromSrcToDes(BlockArray, i + 2, j + 1, i, j + 1);
DrawBlock(hdc, i,  j + 1, 2);
EraseBlock(hdc, i + 2, j + 1);
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][j - 1].Flag_Is_Moveable == TRUE )
{


if( i == ROWS - 2) return ;

if(BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE || \
  BlockArray[  i  ][j - 2].Flag_Is_Filled == TRUE )
return;

if(BlockArray[i + 2][j - 1].Flag_Is_Filled == TRUE || \
  BlockArray[i + 2][j - 2].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE)
  return;

{
MoveBlockFromSrcToDes(BlockArray,i, j, i, j - 2);
DrawBlock(hdc, i, j - 2,2);
EraseBlock(hdc,i, j);

MoveBlockFromSrcToDes(BlockArray,i + 1, j, i, j - 1);
DrawBlock(hdc, i, j - 1,2);
EraseBlock(hdc,i + 1, j);

MoveBlockFromSrcToDes(BlockArray,i + 1, j - 2, i + 2, j - 1);
DrawBlock(hdc, i + 2, j - 1,2);
EraseBlock(hdc,i + 1, j - 2);
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[  i  ][j + 1].Flag_Is_Moveable == TRUE && \
BlockArray[i + 1][j + 1].Flag_Is_Moveable == TRUE)
{
if( j == COLS - 2) return ;

if(BlockArray[i + 1][  j  ].Flag_Is_Filled == TRUE || \
  BlockArray[i + 2][  j  ].Flag_Is_Filled == TRUE )
          return;

if(BlockArray[i + 1][j + 2].Flag_Is_Filled == TRUE || \
  BlockArray[i + 2][j + 2].Flag_Is_Filled == TRUE)
  return;

{
MoveBlockFromSrcToDes(BlockArray,i, j, i + 2, j);
DrawBlock(hdc, i + 2, j, 2);
EraseBlock(hdc,i, j);

MoveBlockFromSrcToDes(BlockArray,i, j + 1, i + 1, j);
DrawBlock(hdc, i + 1, j, 2);
EraseBlock(hdc,i,  j + 1);

MoveBlockFromSrcToDes(BlockArray,i + 2, j + 1, i + 1, j + 2);
DrawBlock(hdc, i + 1, j + 2,2);
EraseBlock(hdc,i + 2, j + 1);
}
ReleaseDC(hwnd,hdc);
return;
}
   

}

void RotateStyleThree(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;

HDC hdc;

hdc=GetDC(hwnd);

for(i = 2 ; i < ROWS ; i++)
{
  for(j = 0 ; j < COLS; j++)
  {
  if ( BlockArray[i][j].Flag_Is_Moveable == TRUE )
              break;
  }
  if ( j < COLS )
  break;
}     


if( BlockArray[  i  ][j + 1].Flag_Is_Moveable == TRUE && \
BlockArray[  i  ][j + 2].Flag_Is_Moveable == TRUE )
{
      if ( i == 2  ) return;

if ( BlockArray[i + 1][  j  ].Flag_Is_Filled == TRUE )
    return;

if ( BlockArray[i + 1][j + 2].Flag_Is_Filled == TRUE )
return;

if ( BlockArray[i - 1][j + 1].Flag_Is_Filled == TRUE || \
BlockArray[i - 1][j + 2].Flag_Is_Filled == TRUE)
return;

{
MoveBlockFromSrcToDes(BlockArray, i, j, i - 1, j + 1);
DrawBlock(hdc, i - 1, j + 1, 3);
EraseBlock(hdc,i, j);

}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][j + 1].Flag_Is_Moveable == TRUE && \
BlockArray[i + 2][  j  ].Flag_Is_Moveable == TRUE)
{
if ( j == 0 ) return;

if ( BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j - 1].Flag_Is_Filled == TRUE )
            return;

if ( BlockArray[i + 2][j + 1].Flag_Is_Filled == TRUE )
return;

if ( BlockArray[  i  ][j + 1].Flag_Is_Filled == TRUE)
return;

{
MoveBlockFromSrcToDes(BlockArray, i + 2, j, i + 1, j - 1);
DrawBlock(hdc, i + 1, j - 1, 3);
EraseBlock(hdc,i + 2, j);
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][j - 1].Flag_Is_Moveable == TRUE && \
BlockArray[i + 1][j + 1].Flag_Is_Moveable == TRUE)
{
if( i == ROWS - 2) return ;

if(BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[i + 2][  j  ].Flag_Is_Filled == TRUE || \
  BlockArray[i + 2][j - 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[  i  ][j + 1].Flag_Is_Filled == TRUE)
  return;

{
MoveBlockFromSrcToDes(BlockArray,i + 1, j + 1, i + 2, j);
DrawBlock(hdc, i + 2, j, 3);
EraseBlock(hdc,i + 1, j + 1);

}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 2][  j  ].Flag_Is_Moveable == TRUE && \
BlockArray[i + 1][j - 1].Flag_Is_Moveable == TRUE)
{
if( j == COLS - 1) return ;

if( BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[i + 2][j - 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE || \
  BlockArray[i + 2][j + 1].Flag_Is_Filled == TRUE)
  return;

{
MoveBlockFromSrcToDes(BlockArray,i, j, i + 1, j + 1);
DrawBlock(hdc, i + 1, j + 1, 3);
EraseBlock(hdc,i, j);
}
ReleaseDC(hwnd,hdc);
return;
}
}
void RotateStyleFour(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;

HDC hdc;

hdc=GetDC(hwnd);

for(i = 2 ; i < ROWS ; i++)
{
  for(j = 0 ;j < COLS ;j++)
  {
  if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
          break;
  }
  if ( j < COLS )
  break;
}     

    if ( BlockArray[ i ][j + 1].Flag_Is_Moveable == TRUE )   
{
if( i == 2)
return;

if( BlockArray[i + 1][  j  ].Flag_Is_Filled == TRUE )  return;

if( BlockArray[  i  ][j + 2].Flag_Is_Filled == TRUE )  return;

if( BlockArray[i - 1][j + 2].Flag_Is_Filled == TRUE )  return;

{
MoveBlockFromSrcToDes(BlockArray, i, j ,i, j + 2);
DrawBlock(hdc, i, j + 2, 4);
EraseBlock(hdc,i, j );

MoveBlockFromSrcToDes(BlockArray, i + 1, j + 2, i - 1,j + 2);
DrawBlock(hdc, i - 1, j + 2, 4);
EraseBlock(hdc,i + 1, j + 2);
}
}
else
{
if ( j == 1 )
return;

if ( BlockArray[i + 2][  j  ].Flag_Is_Filled == TRUE) return;

if ( BlockArray[i + 2][j - 2].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j - 2].Flag_Is_Filled == TRUE )
return;

{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 2, j);
DrawBlock(hdc,  i + 2, j, 4);
EraseBlock(hdc, i, j);

MoveBlockFromSrcToDes(BlockArray, i + 1, j, i + 1, j - 2);
DrawBlock(hdc, i + 1,j - 2,4);
EraseBlock(hdc,i + 1,j );
}

}
    ReleaseDC(hwnd,hdc);
}
void RotateStyleSix(HWND hwnd,BLOCK BlockArray[ROWS][COLS])
{
int i, j;

HDC hdc;

hdc=GetDC(hwnd);

for(i = 2 ; i < ROWS ; i++)
{
  for(j = 0 ;j < COLS ;j++)
  {
  if (BlockArray[i][j].Flag_Is_Moveable == TRUE)
  break;
  }
  if (j < COLS )
  break;
}     

if( BlockArray[ i ][j + 1].Flag_Is_Moveable == TRUE && \
BlockArray[ i ][j + 2].Flag_Is_Moveable == TRUE )
{

if ( i == 2 ) return;

if ( BlockArray[i + 1][  j  ].Flag_Is_Filled == TRUE  || \
BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE)
        return;

if ( BlockArray[i - 1][j + 1].Flag_Is_Filled == TRUE || \
BlockArray[i - 1][j + 2].Flag_Is_Filled == TRUE)
return;

{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1, j + 1);
DrawBlock(hdc, i + 1, j + 1, 6);
EraseBlock(hdc, i, j);

MoveBlockFromSrcToDes(BlockArray, i, j + 2, i - 1, j + 1);
DrawBlock(hdc, i - 1, j + 1, 6);
EraseBlock(hdc,i,    j + 2);

MoveBlockFromSrcToDes(BlockArray, i + 1, j + 2, i - 1, j + 2);
DrawBlock(hdc, i - 1, j + 2, 6);
EraseBlock(hdc, i + 1, j + 2 );
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][  j  ].Flag_Is_Moveable == TRUE && \
BlockArray[  i  ][j + 1].Flag_Is_Moveable == TRUE)
{
if ( i == 2 ) return;
if ( j == 0 ) return;

if ( BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE || \
BlockArray[i + 1][j - 1].Flag_Is_Filled == TRUE )
    return;

if ( BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE)
return;

if ( BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE || \
BlockArray[i + 2][j + 1].Flag_Is_Filled == TRUE )
return;

{
MoveBlockFromSrcToDes(BlockArray, i, j, i + 1, j - 1);
DrawBlock(hdc, i + 1, j - 1, 6);
EraseBlock(hdc, i, j);

MoveBlockFromSrcToDes(BlockArray, i, j + 1, i, j - 1);
DrawBlock (hdc, i,  j - 1, 6);
EraseBlock(hdc, i, j + 1);

MoveBlockFromSrcToDes(BlockArray, i + 2, j , i + 1, j + 1);
DrawBlock(hdc, i + 1,  j + 1, 6);
EraseBlock(hdc, i + 2, j);
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][  j  ].Flag_Is_Moveable == TRUE && \
BlockArray[i + 1][j + 1].Flag_Is_Moveable == TRUE  )
{
if( i == ROWS - 2) return ;

if( BlockArray[i + 2][ j  ].Flag_Is_Filled == TRUE )
    return;

if(BlockArray[i + 2][  j  ].Flag_Is_Filled == TRUE || \
  BlockArray[i + 2][j + 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[  i  ][j + 1].Flag_Is_Filled == TRUE || \
  BlockArray[  i  ][j + 2].Flag_Is_Filled == TRUE)
  return;

{
MoveBlockFromSrcToDes(BlockArray,i, j, i + 2, j);
DrawBlock(hdc, i + 2, j, 6);
EraseBlock(hdc,i, j);

MoveBlockFromSrcToDes(BlockArray,i + 1, j, i + 2, j + 1);
DrawBlock(hdc, i + 2, j + 1,6);
EraseBlock(hdc,i + 1, j);

MoveBlockFromSrcToDes(BlockArray,i + 1, j + 2, i , j + 1);
DrawBlock(hdc, i, j + 1, 6);
EraseBlock(hdc,i + 1, j + 2);
}
ReleaseDC(hwnd,hdc);
return ;
}

if ( BlockArray[i + 1][  j  ].Flag_Is_Moveable == TRUE && \
BlockArray[i + 2][j - 1].Flag_Is_Moveable == TRUE)
{
if( j == COLS - 1) return ;

if(BlockArray[  i  ][j - 1].Flag_Is_Filled == TRUE || \
  BlockArray[i + 1][j - 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[i + 2][j + 1].Flag_Is_Filled == TRUE )
  return;

if(BlockArray[i + 2][j + 1].Flag_Is_Filled == TRUE || \
  BlockArray[i + 1][j + 1].Flag_Is_Filled == TRUE)
  return;

{
MoveBlockFromSrcToDes(BlockArray,i, j, i + 1, j - 1);
DrawBlock(hdc, i + 1, j - 1, 6);
EraseBlock(hdc,i, j);

MoveBlockFromSrcToDes(BlockArray,i + 2, j - 1, i + 2, j + 1);
DrawBlock(hdc, i + 2, j + 1, 6);
EraseBlock(hdc,i + 2, j - 1);

MoveBlockFromSrcToDes(BlockArray,i + 2, j, i + 1, j + 1);
DrawBlock(hdc, i + 1, j + 1,6);
EraseBlock(hdc,i + 2, j);
}
ReleaseDC(hwnd,hdc);
return;
}
   

}

void RefreshWindow(HWND hWnd,BLOCK BlockArray[ROWS][COLS])
{
int i,j;
HDC hdc;
hdc=GetDC(hWnd);

DrawBackground(hdc);

    for(i = 0;i < ROWS; i++)
  for(j = 0; j < COLS; j++)
    if(BlockArray[i][j].Flag_Is_Filled)
    DrawBlock(hdc,i,j,BlockArray[i][j].BlockStyle);

ReleaseDC(hWnd,hdc);
}

void ChangeBlockStyleToGray(BLOCK BlockArray[ROWS][COLS])
{
int i,j;

for(i = ROWS-1;i >= 2;i--)
  for(j = 0; j <= COLS - 1; j++)
    if(BlockArray[i][j].Flag_Is_Filled)
    BlockArray[i][j].BlockStyle = 7;

for(i = 2;i <= 3; i ++)
  for(j = 0;j <= COLS - 1;j ++)
  {
    BlockArray[i][j].Flag_Is_Filled = FALSE;
  }
}
LRESULT CALLBACK HyperLinkProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
HINSTANCE hInst;
HCURSOR  hCursorHand;
long      result;
switch(uMsg)
{
case WM_LBUTTONUP:
switch(GetDlgCtrlID(hWnd))
{
case IDC_EMAIL:
      MessageBox(NULL,"邮箱破了",NULL,MB_OK);
      break;
case IDC_HOMEPAGE:
      MessageBox(NULL,"本人No Money,no girl",NULL,MB_OK);
  break;
}
break;
    case WM_NCHITTEST:
return (TRUE);
break;
    case WM_MOUSEMOVE:
hInst=GetModuleHandle(NULL);
hCursorHand=LoadCursor(hInst,"HandCur");
SetCursor(hCursorHand);
    break;
default:
result=GetWindowLong(hWnd,GWL_USERDATA);
return CallWindowProc((WNDPROC) result, hWnd, uMsg, wParam, lParam);
}
return (0);

}
BOOL CALLBACK AboutDialogProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam)
{
HINSTANCE hInst;
long      result;
    HWND      hWndTemp;
HFONT    hFontStatic;
LOGFONT  LogicFontText;
switch(uMsg)
{
case WM_INITDIALOG:
hInst=GetModuleHandle(NULL);
SendMessage(hWnd,WM_SETICON,(WPARAM)(ICON_SMALL),
        (LPARAM)LoadIcon(hInst,"TerrisSmall"));

hWndTemp=GetDlgItem(hWnd,IDC_EMAIL);
result=(long)SetWindowLong(hWndTemp,GWL_WNDPROC,(long)HyperLinkProc);
SetWindowLong(hWndTemp,GWL_USERDATA,result);

hWndTemp=GetDlgItem(hWnd,IDC_HOMEPAGE);
result=SetWindowLong(hWndTemp,GWL_WNDPROC,(long)HyperLinkProc);
SetWindowLong(hWndTemp,GWL_USERDATA,result);
break;
    case WM_CTLCOLORSTATIC:
if (GetDlgCtrlID((HWND)lParam)==IDC_EMAIL || GetDlgCtrlID((HWND)lParam)==IDC_HOMEPAGE)
{
hFontStatic=(HFONT)SendMessage((HWND)lParam,WM_GETFONT,0,0);
            GetObject(hFontStatic,sizeof(LOGFONT),&LogicFontText);
            LogicFontText.lfUnderline=TRUE;
hFontStatic=CreateFontIndirect(&LogicFontText);
SelectObject((HDC)wParam,hFontStatic);
SetTextColor((HDC)wParam,RGB(0,0,255));
SetBkColor((HDC)wParam,GetSysColor(COLOR_MENU));
            DeleteObject(hFontStatic);
    return (long)GetStockObject(NULL_BRUSH);
}
break;
case WM_COMMAND:
if((HIWORD(wParam)==IDOK)&&(LOWORD(wParam)==BN_CLICKED))
EndDialog(hWnd,TRUE);
case WM_CLOSE:
EndDialog(hWnd,TRUE);
break;
default:
  return(FALSE);
}
return (TRUE);
}


B1层 发表时间: 05-01-08 12:08

回复: leonshoh [leonshoh]   论坛用户   登录
//
//terris.h
//

#ifndef _TERRIS_H
#define _TERRIS_H
# define IDM_START      100
# define IDM_PAUSE      101
# define IDM_EXIT      102

# define IDM_EASY            200
# define IDM_MEDIUM          201
# define IDM_DIFFICULT      202

# define IDM_ABOUT          300


#define IDC_EMAIL                      2000
#define IDC_HOMEPAGE                    2001

#define IDC_STATIC                      -1

//数据常量
# define BLOCKSIZE          15

# define ROWS                24
# define COLS                10

# define OriginXPos          8
# define OriginYPos          30

# define TIMERID            1
# define EasyInterval        300
# define MediumInterval      200
# define DifficultInterval  100
typedef struct{
BOOL Flag_Is_Moveable;
    BOOL Flag_Is_Filled;
int  BlockStyle;
}BLOCK;

void DrawBackground(HDC);
void DrawBlock(HDC, int, int, int);
void DrawGrayBlock(HDC, int, int);
void EraseBlock(HDC, int, int);

void InitializeBlock(BLOCK BlockArray[ROWS][COLS]);

BOOL GameOver(BLOCK BlockArray[ROWS][COLS]);
void GenerateNewBlock(HWND,BLOCK BlockArray[ROWS][COLS]);

BOOL NeedGenerateNewBlock(BLOCK Block[ROWS][COLS]);
void KillFullLine(HWND hwnd,BLOCK BlockArray[ROWS][COLS]);

BOOL CanBlockMoveDown(BLOCK Block[ROWS][COLS]);
BOOL CanBlockMoveRight(BLOCK BlockArray[ROWS][COLS]);
BOOL CanBlockMoveLeft(BLOCK BlockArray[ROWS][COLS]);

void MoveBlockFromSrcToDes (BLOCK BlockArray[ROWS][COLS],int SrcRow, int SrcCol, int DesRow, int DesCol);
void MoveBlockFromPreviewToGameArea(HWND hwnd, BLOCK BlockArray[ROWS][COLS]);
void MoveBlockDown(HWND hwnd,BLOCK Block[ROWS][COLS]);
void MoveBlockRight(HWND hwnd, BLOCK BlockArray[ROWS][COLS]);
void MoveBlockLeft(HWND hwnd,BLOCK BlockArray[ROWS][COLS]);
void Moveable2Stable(BLOCK Block[ROWS][COLS]);

void RefreshWindow(HWND hWnd,BLOCK BlockArray[ROWS][COLS]);


int JudgeBlockStyle(BLOCK BlockArray[ROWS][COLS]);

void ChangeBlockStyleToGray(BLOCK BlockArray[ROWS][COLS]);

void RotateStyleZero(HWND,BLOCK BlockArray[ROWS][COLS]);
void RotateStyleOne(HWND,BLOCK  BlockArray[ROWS][COLS]);
void RotateStyleTwo(HWND hwnd,BLOCK BlockArray[ROWS][COLS]);
void RotateStyleThree(HWND hwnd,BLOCK BlockArray[ROWS][COLS]);
void RotateStyleFour(HWND hwnd,BLOCK BlockArray[ROWS][COLS]);
void RotateStyleSix(HWND hwnd,BLOCK BlockArray[ROWS][COLS]);
BOOL InitClass(HINSTANCE);
BOOL InitWindow(HINSTANCE);

LRESULT CALLBACK WndProc(HWND,UINT,WPARAM,LPARAM);
BOOL CALLBACK AboutDialogProc (HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
LRESULT CALLBACK HyperLinkProc(HWND hWnd,UINT uMsg,WPARAM wParam,LPARAM lParam);
#endif

B2层 发表时间: 05-01-08 12:11

回复: leonshoh [leonshoh]   论坛用户   登录
//
// 资源文件 rsrc.rc
//
TERRISMENU MENU DISCARDABLE
BEGIN
    POPUP "Game"
    BEGIN
        MENUITEM "开始",                      IDM_START
        MENUITEM "暂停",                      IDM_PAUSE, GRAYED
        MENUITEM SEPARATOR
        MENUITEM "退出",                        IDM_EXIT
    END
    POPUP "Level"
    BEGIN
        MENUITEM "简单",                        IDM_EASY
        MENUITEM "中级",                      IDM_MEDIUM
        MENUITEM "难",                  IDM_DIFFICULT
    END
    POPUP "Help"
    BEGIN
          MENUITEM "关于本软件",            IDM_ABOUT
    END
END


DLG_ABOUT DIALOG DISCARDABLE  0, 0, 168, 94
STYLE DS_MODALFRAME | DS_3DLOOK | DS_CENTER | WS_VISIBLE | WS_CAPTION |
    WS_SYSMENU
CAPTION "关于Terris"
FONT 9, "宋体"
BEGIN
   
    CTEXT          "【Terris】Ver 1.0 Beta",IDC_STATIC,42,6,90,9
    LTEXT          "No Money,no girl,no job,I have nothing...",IDC_STATIC,46,18,100,9
    CONTROL        "",IDC_STATIC,"Static",SS_ETCHEDHORZ,1,42,166,1
    LTEXT          "Homepage:No Homepage,我是穷人,没主页,没钱",IDC_HOMEPAGE,62,49,86,9
    LTEXT          "E-Mail:申请不到,没钱上网",IDC_EMAIL,62,60,78,9
    CONTROL        "",IDC_STATIC,"Static",SS_ETCHEDHORZ,1,72,166,1
    DEFPUSHBUTTON  "确定",IDOK,62,78,46,12
    ICON            "TERRISSMALL",IDC_STATIC,10,17,20,20
END

B3层 发表时间: 05-01-08 12:16

回复: leonshoh [leonshoh]   论坛用户   登录
SDK写的Terris,资源文件的图标请大家随便找一个换上编译就可以了
cl /c terris.cpp
rc rsrc.rc
link terris.obj rsrc.res /subsystem:windows /out:terris.exe

//////////////////////////////////////////
// No money ,No girl,No job
//////////////////////////////////////////

B4层 发表时间: 05-01-08 12:19

论坛: 编程破解

20CN网络安全小组版权所有
Copyright © 2000-2010 20CN Security Group. All Rights Reserved.
论坛程序编写:NetDemon

粤ICP备05087286号