⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map.cpp

📁 俄罗斯方块,适于sdk初学者参考学习
💻 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 + -