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

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

高时银博客 C++开发 点击: 2,355 次 0 0

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

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


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

目前还没有评论。赶快来坐沙发吧。

发表评论