//取得後臺處理I/O控制權,hIn=>鍵盤控制 hOut=>螢幕輸出控制
void Control_HANDLE_Unit()
hIn=GetStdHandle(STD_INPUT_HANDLE);
hOut=GetStdHandle(STD_OUTPUT_HANDLE);
void position(int x,int y)
SetConsoleCursorPosition(hOut,c);
const int nWidth=15,nHeight=20;
char Unit[3]={'|','H','X'}; //邊、底邊、方塊
int frame[nHeight][nWidth]={0}; //後臺參數,框架中frame[y][x] x,y為x座標和y座標; 其值=>有0,1,2,3; 0空白,1為邊,2為底邊,3方塊
void draw(int x,int y,int uniframe,char *unit)
int Asset[7][4][4]={ {{0,0,3,0},{0,0,3,0},{0,0,3,0},{0,0,3,0}},
{{0,0,3,0},{0,3,3,0},{0,3,0,0},{0,0,0,0}},
{{0,3,0,0},{0,3,3,0},{0,0,3,0},{0,0,0,0}},
{{0,0,0,0},{0,0,3,0},{0,3,3,3},{0,0,0,0}},
{{0,0,0,0},{0,3,3,0},{0,3,3,0},{0,0,0,0}},
{{0,3,3,0},{0,0,3,0},{0,0,3,0},{0,0,0,0}},
{{0,3,3,0},{0,3,0,0},{0,3,0,0},{0,0,0,0}} };
//方塊落下 =>方塊放置位置(x,y)、清除方塊、方塊放置位置(x,y+1)
void AssetPos(int px,int py,int (&asset)[4][4])//px,py為起始位置
for(int y=py; y<(py+4); y++)
for(int x=px; x<(px+4); x++)
if(frame[y][x]==0 && asset[y-py][x-px]!=0)
frame[y][x]=asset[y-py][x-px];
draw(x,y,frame[y][x],Unit);
void cleanAsset(int px,int py,int (&asset)[4][4])
for(int y=py; y<(py+4); y++)
for(int x=px; x<(px+4); x++)
draw(x,y,frame[y][x],Unit);
bool collision(int px,int py,int (&asset)[4][4])
for(int y=py; y<(py+4); y++)
for(int x=px; x<(px+4); x++)
if(frame[y][x]!=0 && asset[y-py][x-px]!=0) return 1;
void Rotation(int px,int py,int (&asset)[4][4])
temp[x][y]=asset[3-y][x]; //轉90度
if(!collision(px, py, temp))
void key_Control(int (&asset)[4][4])
ReadConsoleInput(hIn,&ir,1,&count);
switch(ir.Event.KeyEvent.wVirtualKeyCode)
if(collision(i-1,j,asset))//判斷落到下一格是否發生碰撞
if(collision(i+1,j,asset))//判斷落到下一格是否發生碰撞
bool Eliminate_Row_Asset(int y) //當一排都為方塊時,消除該牌方塊
for(int x=1;x<nWidth-1;x++)
if(frame[y][x]!=3) return 0;
position(nWidth+16,nHeight-1);
for(int x=0; x<nWidth; x++)
for(int x=0; x<nWidth; x++) //底邊框
for(int y=0; y<nHeight; y++) //邊框
for(int y=0; y<nHeight; y++)
for(int x=0; x<nWidth; x++)
draw(x,y,frame[y][x],Unit);
for(int y=0; y<nHeight; y++)
position(nWidth+10,nHeight-1);
int asset[4][4]={0}; //目前的方塊
asset[i][j]=Asset[random][i][j]; //選取隨機7種方塊之一
if(collision(i,j+1,asset)) //有碰撞
ReadConsoleInput(hIn,&ir,1,&count);
ReadConsoleInput(hIn,&ir,1,&count);
if(collision(i,j+1,asset))
for(int y=nHeight-2; y>0; y--) //削掉方塊並計分
if(Eliminate_Row_Asset(y))
for(int x=1; x<nWidth-1; x++)
draw(x,y,frame[y][x],Unit);
for(int j=y; j>0; j--)//上面方塊掉下來
for(int x=1; x<nWidth-1; x++)
frame[j][x]=frame[j-1][x];
draw(x,j,frame[j][x],Unit);
position(nWidth+10,nHeight/2);