?? 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 + -