• wordpress CMS主题:ssmay主题wordpress CMS主题:ssmay主题
  • 首页 > C++开发 > C++与MFC轻松实现:走迷宫小游戏(七)迷宫行走回放

    C++与MFC轻松实现:走迷宫小游戏(七)迷宫行走回放

    作者: 分类:C++开发 点击: 3,964 次
    wordpress CMS主题:ssmay主题

      前面,我们完成了走迷宫的全套程序,可以通过键盘来操作人物行走。本节,也跟其它大型游戏一样来实现人物走过的路线的回放。

      第1步:先创建一个结构体。

      在构造函数前添加如下代码:

      struct list{int n; //第几列int m;//第几行int x; //横坐标int y; //纵坐标struct list*next; //指向下一个结点指针struct list*back;//指向上一个结点指针CBitmap*bitmap; //人物指针

      };

      list*ptr,*preptr,*first;//ptr是当前结点,preptr是上一个结点,first是第1个结点

      第2步:创建人物未动时的位置。

      先在构造函数中添加如下代码:

      ptr=(list*)malloc(sizeof(list));ptr->n=n;ptr->m=m;ptr->x=x;ptr->y=y;ptr->bitmap=bitmap[0][0];ptr->next=NULL;

      ptr->back=NULL;

      first=ptr;

      然后,再创建一个成员函数Go() ,在函数体中添加如下代码:

      CClientDC dc(this);mdc->SelectObject(wall);for(i=0;i<8;i++){

      for(int j=0;j<8;j++)

      {

      if(maze[i][j]==1)

      {

      dc.BitBlt(j*93,i*100,93,100,mdc,0,0,SRCCOPY);

      }

      }

      }

      mdc->SelectObject(first->bitmap);//获取第一张图片的地址

      if(number==0) //如果没有移动

      {

      dc.BitBlt(first->n*93+first->x,first->m*100+first->y,93,100,mdc,0,0,SRCCOPY); //不动

      }

      else

      {

      dc.BitBlt(first->back->n*93+first->back->x,first->back->m*100+first->back->y,93,100,mdc,0,0,WHITENESS); //使上一张图片变成白色,即消失

      dc.BitBlt(first->n*93+first->x,first->m*100+first->y,93,100,mdc,0,0,SRCCOPY); //只留下移动后的这张图片

      }

      number++;  //不断地在移动

      if(first->next==NULL)  //当到了最后一个结点时,Go函数停止

      {

      go=false;

      }

      else

      first=first->next; //否则不断地循环

      并且在构造函数前声明变量:int number=0; bool go=false;

      第3步:将前面我们写过的ONKEYDOWN里面的代码修改成如下代码:

      CClientDC dc(this);dc.BitBlt(n*93+x,m*100+y,93,100,mdc,0,0,WHITENESS);if(nChar==VK_DOWN){y+=100;

      k=(n*93+x)/93;

      l=(m*100+y)/100;

      if(maze[l][k]==1)

      {

      y-=100;

      }

      if(dir==0)

      {

      index++;

      if(index==4)

      {

      index=0;

      }

      }

      else

      {

      index=0;

      dir=0;

      }

      ptr->next=(list*)malloc(sizeof(list));

      ptr->next->n=n;

      ptr->next->m=m;

      ptr->next->x=x;

      ptr->next->y=y;

      ptr->next->bitmap=bitmap[dir][index];

      preptr=ptr;

      ptr->next->next=NULL;

      ptr=ptr->next;

      ptr->back=preptr;

      }

      if(nChar==VK_UP)

      {

      y-=100;

      k=(n*93+x)/93;

      l=(m*100+y)/100;

      if(maze[l][k]==1)

      {

      y+=100;

      }

      if(dir==3)

      {

      index++;

      if(index==4)

      {

      index=0;

      }

      }

      else

      {

      index=0;

      dir=3;

      }

      ptr->next=(list*)malloc(sizeof(list));

      ptr->next->n=n;

      ptr->next->m=m;

      ptr->next->x=x;

      ptr->next->y=y;

      ptr->next->bitmap=bitmap[dir][index];

      preptr=ptr;

      ptr->next->next=NULL;

      ptr=ptr->next;

      ptr->back=preptr;

      }

      if(nChar==VK_RIGHT)

      {

      x+=93;

      k=(n*93+x)/93;

      l=(m*100+y)/100;

      if(maze[l][k]==1)

      {

      x-=93;

      }

      if(dir==2)

      {

      index++;

      if(index==4)

      {

      index=0;

      }

      }

      else

      {

      index=0;

      dir=2;

      }

      ptr->next=(list*)malloc(sizeof(list));

      ptr->next->n=n;

      ptr->next->m=m;

      ptr->next->x=x;

      ptr->next->y=y;

      ptr->next->bitmap=bitmap[dir][index];

      preptr=ptr;

      ptr->next->next=NULL;

      ptr=ptr->next;

      ptr->back=preptr;

      }

      if(nChar==VK_LEFT)

      {

      x-=93;

      k=(n*93+x)/93;

      l=(m*100+y)/100;

      if(maze[l][k]==1)

      {

      x+=93;

      }

      if(dir==1)

      {

      index++;

      if(index==4)

      {

      index=0;

      }

      }

      else

      {

      index=0;

      dir=1;

      }

      ptr->next=(list*)malloc(sizeof(list));

      ptr->next->n=n;

      ptr->next->m=m;

      ptr->next->x=x;

      ptr->next->y=y;

      ptr->next->bitmap=bitmap[dir][index];

      preptr=ptr;

      ptr->next->next=NULL;

      ptr=ptr->next;

      ptr->back=preptr;

      }

      k=(n*93+x)/93;

      l=(m*100+y)/100;

      if(maze[l][k]==3)

      {

      dc.TextOut(120,350,"走出去了!");

      ptr->next=(list*)malloc(sizeof(list));

      ptr->next->n=n;

      ptr->next->m=m;

      ptr->next->x=x;

      ptr->next->y=y;

      ptr->next->bitmap=bitmap[dir][index];

      preptr=ptr;

      ptr->next->next=NULL;

      ptr=ptr->next;

      ptr->back=preptr;

      go=true;

      return;

      }

      mdc->SelectObject(bitmap[dir][index]);

      dc.BitBlt(n*93+x,m*100+y,93,100,mdc,0,0,SRCCOPY);

      第4步:在ONTIMER里的代码修改成如下:

      if(Start){start();}else{if(go){Go();}}

      这样,我们就实现了整个人物行走的路线完整回放。到这里,走迷宫游戏就全部完成。

      注意:在构造函数前面声明的变量:n和m,它们在声明时不能设置默认值0或其它数,否则,人物行动前的原始位置会不在2上(即不在入口处),因为,回放结构体里也有这两个变量,而在Go()函数中要用到这2个变量来设置人物的原始位置。也可以在结构体中把这2变量改成别的字母,如:s\w等。

      注意:if(first->next==NULL) 像这样的判断语句中的" == " 号如果写成" = " 就会出错,甚至程序崩溃。所以这要引起大家的重视。



      QQ二维码

    文章作者:高时银博客
    本文地址:http://wanlimm.com/7720140113850.html
    版权所有 © 转载时必须以链接形式注明作者和原始出处!

    上一篇:
    下一篇:
    wordpress CMS主题:ssmay主题

    或许你会感兴趣的文章:

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    This site uses Akismet to reduce spam. Learn how your comment data is processed.