📄 fangkuai.cpp
字号:
// Fangkuai.cpp : 实现文件
//
#include "stdafx.h"
#include "fangk.h"
#include "Fangkuai.h"
#define UP 0
#define RIGHT 1
#define DOWN 2
#define LEFT 3
// Fangkuai
IMPLEMENT_DYNAMIC(Fangkuai, CStatic)
Fangkuai::Fangkuai()
{
srand((unsigned)time(NULL));//初始化种子
Posx=4;
Posy=-1;
Mark=0;
}
Fangkuai::~Fangkuai()
{
}
BOOL Fangkuai::CanMove(int dir)//dir:0:上1:右2:下3:左
{
int id;
switch(dir)
{
case UP:
if(ID==3)
id=0;
else
id=ID+1;
if(ShapeValid(Shape,id,Posx,Posy))
return true;
break;
case RIGHT:
if(ShapeValid(Shape,ID,Posx+1,Posy))
return true;
break;
case DOWN:
if(ShapeValid(Shape,ID,Posx,Posy+1))
return true;
break;
case LEFT:
if(ShapeValid(Shape,ID,Posx-1,Posy))
return true;
break;
}
return false;
}
void Fangkuai::MoveDown()
{
if(CanMove(DOWN))
{
CClientDC pDC(this);
draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
Posy++;
draw.drawshape(&pDC,Posx,Posy,Shape,ID,false);
}
else
{
EndStep();
StepNext();
}
}
void Fangkuai::Move()
{
CClientDC pDC(this);
DrawNextShape(&pDC);
draw.drawmark(&pDC,Mark,false);
int speed = 400-Mark*0.03; //速度函数
SetTimer(1,speed,0);//下落速度
}
BEGIN_MESSAGE_MAP(Fangkuai, CStatic)
ON_WM_TIMER()
END_MESSAGE_MAP()
void Fangkuai::StartGame()
{
//重画窗口,初始化数据
Invalidate();
Shape = GetNext(); //得到方块---------------------------------------------------------------
Next = GetNext();
ID = 0; //得到形状变化---------------------------------------------------------------
Move();
}
int Fangkuai::GetNext()
{
int next = rand()%7;
return next;
}
bool Fangkuai::ShapeValid(int sv_shape,int sv_id,int sv_x,int sv_y)
{
//-----------------------------------------------------------------------------------------
//存放颜色和变化的中间数据
//重新计算m_nData
int m_nData[3][3];
int nData[][4] = {
{ 0x038, 0x092, 0x038, 0x092 },
{ 0x093, 0x03c, 0x192, 0x078 },
{ 0x096, 0x138, 0x0d2, 0x039 },
{ 0x1b0, 0x1b0, 0x1b0, 0x1b0 },
{ 0x198, 0x05a, 0x198, 0x05a },
{ 0x0f0, 0x099, 0x0f0, 0x099 },
{ 0x03a, 0x0b2, 0x0b8, 0x09a }
};
int Data = nData[sv_shape][sv_id];
//取得形状数组
m_nData[0][0] = (Data&0x100)>>8;
m_nData[0][1] = (Data&0x80)>>7;
m_nData[0][2] = (Data&0x40)>>6;
m_nData[1][0] = (Data&0x20)>>5;
m_nData[1][1] = (Data&0x10)>>4;
m_nData[1][2] = (Data&0x8)>>3;
m_nData[2][0] = (Data&0x4)>>2;
m_nData[2][1] = (Data&0x2)>>1;
m_nData[2][2] = (Data&0x1)>>0;
//-----------------------------------------------------------------------------------------
//是否有东西卡住
int sRow,sCol;
for(sRow=0;sRow<3;sRow++)
{
for(sCol=0;sCol<3;sCol++)
if(m_nData[sRow][sCol])
{
if(sv_x+sCol<0||sv_x+sCol>=10||sv_y+sRow<0||sv_y+sRow>=22)//越界
return false;
else
if(draw.Datas[sv_y+sRow][sv_x+sCol]==false) //两组数据同为1的时候,不能放
return false;;
}
}
//问题:
//柱形问题:在3×3的数组中不能解决
//解决计算错误
sRow--;
sCol--;
//////////////////////////
if(sv_shape==0)
{
if(sv_id==1||sv_id==3)//竖条 额外方块加在上面,所以什么都不检查
{
}
else //横条
{
if(sv_x+sCol+1<0||sv_x+sCol+1>=10||sv_y+sRow-1<0||sv_y+sRow-1>=22)
return false;
else
if(draw.Datas[sv_y+sRow-1][sv_x+sCol+1]==false)
return false;
}
}
return true;
}
void Fangkuai::EndStep()
{
int nRow,nCol;
for(nRow=0;nRow<3;nRow++)
for(nCol=0;nCol<3;nCol++)
if(draw.m_nData[nRow][nCol])
{
draw.Datas[Posy+nRow][Posx+nCol]=false;
draw.Cor[Posy+nRow][Posx+nCol]=draw.crColor[Shape];
}
//解决计算错误
nRow--;
nCol--;
//////////////////////////
if(Shape==0)
{
if(ID==1||ID==3) //竖条
{
nRow-=3;
nCol--;
draw.Datas[Posy+nRow][Posx+nCol]=false;
draw.Cor[Posy+nRow][Posx+nCol]=draw.crColor[Shape];
}
else //横条
{
nRow--;
nCol++;
draw.Datas[Posy+nRow][Posx+nCol]=false;
draw.Cor[Posy+nRow][Posx+nCol]=draw.crColor[Shape];
}
}
}
void Fangkuai::StepNext()
{
if(Posy<0) //游戏结束
{
KillTimer(1);
EndGame();
}
else
{
///////////////////////////////////////////////////////////////
//检验是否清除行
bool clear=true;
for(int row=21;row>=0;row--)
{
for(int line=0;line<10;line++)
{
if(draw.Datas[row][line]==true)
{
clear=false;
break;
}
}
if(clear==true)
{
DelLine(row);
Mark+=100;
row++;
}
clear=true;
}
///////////////////////////////////////////////////////////////
Posx = 4;
Posy = -1;
Shape = Next;
Next = GetNext();
ID = 0;
Move();
}
}
void Fangkuai::EndGame()
{
MessageBox("end");
}
// Fangkuai 消息处理程序
void Fangkuai::MoveDir(int dir)
{
CClientDC pDC(this);
int id;
switch(dir)
{
case UP:
if(CanMove(UP))
{
draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
if(ID==3)
id=0;
else
id=ID+1; //nextid
ID = id;
draw.drawshape(&pDC,Posx,Posy,Shape,id,false);
}
break;
case DOWN:
if(CanMove(DOWN))
{
draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
draw.drawshape(&pDC,Posx,++Posy,Shape,ID,false);
}
break;
case LEFT:
if(CanMove(LEFT))
{
draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
Posx--;
draw.drawshape(&pDC,Posx,Posy,Shape,ID,false);
}
break;
case RIGHT:
if(CanMove(RIGHT))
{
draw.drawshape(&pDC,Posx,Posy,Shape,ID,true);
Posx++;
draw.drawshape(&pDC,Posx,Posy,Shape,ID,false);
}
break;
}
}
void Fangkuai::DelLine(int row)
{
CClientDC pDC(this);
//flashline
for(int j=0;j<3;j++)
{
for(int i=0;i<10;i++)
{
draw.drawcell(&pDC,row,i,RGB(0,0,0));
}
_sleep(100);
for(int i=0;i<10;i++)
draw.drawcell(&pDC,row,i,draw.Cor[row][i]);
_sleep(100);
}
//delline
CPoint nullpoint;
for(int mrow=row;mrow>=0;mrow--)
for(int mline=0;mline<10;mline++)
{
if(mrow==0)
{
draw.Cor[mrow][mline]=GetSysColor(COLOR_3DFACE);
draw.drawnull(&pDC,mrow,mline);
draw.Datas[mrow][mline]=true;
}
else
{
if(draw.Cor[mrow-1][mline]==GetSysColor(COLOR_3DFACE))
{
draw.drawnull(&pDC,mrow,mline);
}
else
{
draw.drawcell(&pDC,mrow,mline,draw.Cor[mrow-1][mline]);
}
draw.Datas[mrow][mline] = draw.Datas[mrow-1][mline];
draw.Cor[mrow][mline] = draw.Cor[mrow-1][mline];
}
}
}
void Fangkuai::DrawNextShape(CDC *pDC)
{
draw.drawshape(pDC,13,2,Shape,0,true);
draw.drawshape(pDC,13,2,Next,0,false);
}
void Fangkuai::OnTimer(UINT nIDEvent)
{
// TODO: 在此添加消息处理程序代码和/或调用默认值
MoveDown();
CStatic::OnTimer(nIDEvent);
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -