汉诺塔游戏的设计(图文)

时间:2007-10-06 23:45:16   来源:  作者:ChinaITzhe  编辑:海

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

首先建立了类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;

关键字:VC,程序

文章评论

共有 0 位网友发表了评论 此处只显示部分留言 点击查看完整评论页面