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

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

作者: 分类:C++开发 点击: 7,012 次

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

    第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) 像这样的判断语句中的" == " 号如果写成" = " 就会出错,甚至程序崩溃。所以这要引起大家的重视。



文章作者:码不停蹄
本文地址:https://wanlimm.com/7720140113850.html
版权所有 © 转载时必须以链接形式注明作者和原始出处!

上一篇:
下一篇:

或许你会感兴趣的文章:

发表评论

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

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