WEB开发网
开发学院软件开发VC 汉诺塔游戏的设计 阅读

汉诺塔游戏的设计

 2010-08-15 20:47:43 来源:WEB开发网   
核心提示:汉诺塔问题是最经典的递归问题,笔者就该问题设计了这个游戏,汉诺塔游戏的设计,由用户交互 游戏和自动演示两部分组成,支持撤销功能、选关、自动完成等功能,首先 建立了类CMap,该类主要实现用户每一步的操作和画图显示功能

汉诺塔问题是最经典的递归问题,笔者就该问题设计了这个游戏,由用户交互 游戏和自动演示两部分组成,支持撤销功能、选关、自动完成等功能。

首先 建立了类CMap,该类主要实现用户每一步的操作和画图显示功能,记录的时候只 须记录每组盘子的个数和盘子的矩形。代码和注释如下:

//记录 每一步的盘子的情况
class CMap
{
public:
  //每组 盘子的个数
  int iCount[3];
  //3组盘子里面,每个盘子的位 置,用矩形表示
  RECT *Rect[3];
  //构造函数
   CMap()
  {
    //三组盘子,每组盘子的矩形
     for(int i=0;i<3;i++)
      Rect[i]=new RECT[NUM];
     //初始化每组盘子的个数
    iCount[0]=NUM;
     iCount[1]=0;
    iCount[2]=0;
    //第一组盘子的矩形 的位置
    for(i=0;i<NUM;i++)
    {
       Rect[0][i].left=Center[0]-(NUM-i)*Dx2;
      Rect[0] [i].right=Center[0]+(NUM-i)*Dx2;
      Rect[0][i].bottom= (NUM+1-i)*Dx;
      Rect[0][i].top=(NUM-i)*Dx;
     }
    //第二组盘子的矩形初始化为空
    for (i=0;i<NUM;i++)
    {
      Rect[1] [i].left=0;
      Rect[1][i].right=0;
      Rect [1][i].bottom=0;
      Rect[1][i].top=0;
    }
    //第三组盘子的矩形初始化为空
    for (i=0;i<NUM;i++)
    {
      Rect[2] [i].left=0;
      Rect[2][i].right=0;
      Rect [2][i].bottom=0;
      Rect[2][i].top=0;
    }
  }
  //运算符重载
  CMap operator=(CMap Other)
  {
    //对新的CMap对象,应该重新分配内存
    for (int i=0;i<3;i++)
      Rect[i]=new RECT[NUM];
     //依次赋值
    for(i=0;i<3;i++)
    {
       iCount[i]=Other.iCount[i];
        for(int j=0;j<NUM;j++)
        Rect[i][j]=Other.Rect[i][j];
    }
    //返回
    return *(this);
   }
  //画图,显示盘子的情况
  void OnDraw(HDC hdc)
  {
    //画出每个盘子
    for(int i=0;i<3;i++)
      for(int j=0;j<iCount[i];j++)
         Rectangle(hdc,
          Rect[i][j].left,
           Rect[i][j].top,
          Rect[i] [j].right,
          Rect[i][j].bottom);
  }
  //析构函数
  ~CMap()
  {
    //内存的释放
    for(int i=0;i<3;i++)
    {
       if(Rect[i]!=NULL)
      {
        Rect[i] =NULL;
        delete Rect[i];
      }
     }
  }
};

1 2 3  下一页

Tags:汉诺 游戏 设计

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接