📄 map.cpp
字号:
#include "stdafx.h"
#include "map.h"
map::map(int width,int height)
{
int i;
m_width=width;
m_height=height;
m_length=width*height;
m_pmap=new char[m_length]; //分配地图内存
for(i=0;i<m_length;i++) //初始化地图
{
m_pmap[i]=MAP_HOLLOW;
}
m_fill_point=m_height-1;//置地图水平浮标到底
}
//--------------------------------------------------------------------//
void map::init()
{
int i;
for(i=0;i<m_length;i++) //初始化地图
{
m_pmap[i]=MAP_HOLLOW;
}
m_fill_point=m_height-1;//置地图水平浮标到底
}
//--------------------------------------------------------------------//
map::~map()
{
delete [] m_pmap;
}
//--------------------------------------------------------------------//
int map::checkanddel(const diamond &thediamond,int &y1,int &y2)
{
int x,y;
int i;
int maxy,miny;
maxy=0;
miny=m_height;
for(i=0;i<thediamond.subdiamondval();i++)
{
thediamond.diamondinfo(i,x,y);
mapoperate(x,y,MAP_SOLID);
if(y>maxy)//求出插入方块的下限 ^v^坐标是倒的
maxy=y;
if(y<miny)//求出插入方块的上限
miny=y;
}
if(m_fill_point>miny)//如果最后填充点比水平浮标高则置水平浮标
m_fill_point=miny;
//得出地图中需要检测刷新的上下限,和屏幕需要刷新的区域调入函数进行刷新决策
y1=m_fill_point;
y2=maxy;
switch(refreshmap(miny,maxy))
{
case MAP_CHECK_NEEDREFRESH://如果地图刷新了则向外发出刷新通知,通知screen刷新
return MAP_CHECK_NEEDREFRESH;
break;
case MAP_CHECK_NOPROGRAM://如果地图无需刷新的发出无需刷新的通知
return MAP_CHECK_NOPROGRAM;
break;
}
return 0;
}
//--------------------------------------------------------------------//
int map::refreshmap(int y1,int y2)//负责检查并删除传进两行间已满的行
{
int delval,*delbuffer;
int checkheight;
int fillpoint;//堆积指针
int i,k;
char srcval;
checkheight=y2-y1+1;
const int ROW_DEL=0;
const int ROW_HOLD=1;
delbuffer=new int[checkheight];
for(i=0;i<checkheight;i++)
{
delbuffer[i]=ROW_DEL;
}
fillpoint=y2;//把堆积指针放到底
delval=checkheight;
//*从下到上扫描待检查地图区域,决定并记录操作
for(i=0;i<checkheight;i++)
{
for(k=0;k<m_width;k++)
{
if(mapinfo(k,y2-i)==MAP_HOLLOW)
{
delbuffer[i]=ROW_HOLD;//按从下到上的顺序记录待检查各行需要的操作
delval--;
break;
}
}
}
if(delval==0) //没有要删除的行
{
delete [] delbuffer;
return MAP_CHECK_NOPROGRAM;
}
//*以上完成扫描,并记录了待检查区域应该进行的操作
//*进行另一趟扫描并执行操作,y2-i为从下到上行号
for(i=0;i<checkheight;i++)
{
if(delbuffer[i]==ROW_HOLD&&fillpoint!=y2-i)
//如果该行保留并且行号堆积指针不同则把这行堆到指针指示的那行
{
for(k=0;k<m_width;k++)//执行操作把该行复制到堆积指针所在行
{
srcval=mapinfo(k,y2-i);
mapoperate(k,fillpoint,srcval);
}
fillpoint--;//堆积指针提升
}
else if(delbuffer[i]==ROW_HOLD&&fillpoint==y2-i)
//如果该行保留要保留并且和堆积指针相同则提升堆积指针
{
fillpoint--;
}
}
//*以上完成了区域内操作,接下来把剩下的行往下平移checkheight-delval行
//*区域上的行顺着堆积指针继续往上堆
for(i=0;i<y1-m_fill_point;i++) //取出水平浮标计算出待下移行数
{
for(k=0;k<m_width;k++)
{
srcval=mapinfo(k,y1-1-i);
mapoperate(k,fillpoint,srcval);
}
fillpoint--;
}
//*最后删除最上方的没用的行
for(i=0;i<delval;i++)
{
for(k=0;k<m_width;k++)
{
mapoperate(k,m_fill_point+i,MAP_HOLLOW);
}
}
m_fill_point=m_fill_point+delval;//重置水平浮标
delete [] delbuffer;
return MAP_CHECK_NEEDREFRESH;
}
//--------------------------------------------------------------------//
void map::mapoperate(int x,int y,char val)
{
int addpoint;
if(x>m_width-1||y>m_height-1||x<0||y<0)
{
//MessageBox(NULL,"map越界","WARNING",0);
return;
}
addpoint=y*m_width+x;
m_pmap[addpoint]=val;
}
char map::mapinfo(int x,int y) const
{
int infopoint;
if(x>m_width-1||y>m_height-1||x<0||y<0)
{
//MessageBox(NULL,"mapinfo越界","WARNING",0);
return FALSE;
}
infopoint =y*m_width+x;
return(m_pmap[infopoint]);
}
//--------------------------------------------------------------------//
int map::checkaction(int diamondaction,const diamond &thediamond)
{
int i,x,y,max;
diamond temp;
max=thediamond.subdiamondval();
switch(diamondaction)
{
case DIAMOND_ACTION_CREATE://产生新方块
for(i=0;i<max;i++)
{
thediamond.diamondinfo(i,x,y);
if(mapinfo(x,y)==MAP_SOLID)
return CHECK_RESULT_DEAD;
}
return CHECK_RESULT_OK;
break;
case DIAMOND_ACTION_DOWN://方块下移
for(i=0;i<max;i++)
{
thediamond.diamondinfo(i,x,y);
if(y+1>m_height-1||mapinfo(x,y+1)==MAP_SOLID)
return CHECK_RESULT_FREEZE;
}
return CHECK_RESULT_FREE;
break;
case DIAMOND_ACTION_LEFT://左键
for(i=0;i<max;i++)
{
thediamond.diamondinfo(i,x,y);
if(x-1<0||mapinfo(x-1,y)==MAP_SOLID)
return CHECK_RESULT_BUTT;
}
return CHECK_RESULT_FREE;
break;
case DIAMOND_ACTION_RIGHT://右键
for(i=0;i<max;i++)
{
thediamond.diamondinfo(i,x,y);
if(x+1>m_width-1||mapinfo(x+1,y)==MAP_SOLID)
return CHECK_RESULT_BUTT;
}
return CHECK_RESULT_FREE;
break;
case DIAMOND_ACTION_ROTATE://旋转
temp=thediamond;
temp.rotatediamond();
for(i=0;i<max;i++)
{
temp.diamondinfo(i,x,y);
if(x>m_width-1||x<0||y>m_height-1||y<0||mapinfo(x,y)==MAP_SOLID)
return CHECK_RESULT_BUTT;
}
return CHECK_RESULT_FREE;
break;
}
return CHECK_RESULT_FREE;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -