您的位置 首页 > 数码极客

matlab中如何实现按键盘时跳出while循环否则一直执行

经过了几天的思考和完善,我的贪吃蛇也是终于完成啦。属实是很开心的,当然完成这个项目的过程也是很曲折的。因此就要来一次全面的总结来对自己在这个过程中学到的新知识加以巩固。

这个项目不是完全以自己的知识范围所写出来的,我想到要开发贪吃蛇,第一个想到的问题就是怎么样让蛇显示到我想要它在的位置上呢。由于我之前并没有接触过SetConsoleCursorPosition()函数,因此这个问题就让我很困惑。因此我就开始看了慕课上的教程,于是知道了SetConsoleCursorPosition()函数可以解决我的这个问题。但是对这个函数比较陌生,因此我就在CSDN上查了这个函数加以学习。这个函数可以将你的光标移动到你想移动到的位置,这个函数是需要传入两个参数,但是参数并不是你想要移动的X,Y位置坐标,这里的参数是我之前没有接触到的。SetConsoleCursorPosition(hout,coord);coord是一个结构体,这个是由系统定义好的结构体,结构体中包括了两个成员,一个是x,一个是y,这就是你所想要移动到的坐标。那hout是什么呢?我查到的资料是说hout是一个句柄。我现在的知识量还不够特别深入详细地明白句柄的作用。但在使用这个函数的时候,只需要将coord中的X和Y两个元素赋值就可以进行操作啦。在项目中定义的gotoxy()函数中就用到了这个函数。而为了游戏的美观我又学习到了一个新的函数SetConsoleTextAttribute()函数,这个函数是API设置控制台窗口字体颜色和背景色的函数,可以改变字体颜色,让游戏更加美观。在实现键盘控制功能的时候又学习到了一个新的函数GetAsyncKeyState(VK_UP),这个函数是用来接收键盘的输入值,这里我们通过键盘的上下左右来操作蛇,直接就是UP,DOWN,RIGHT,LEFT来代表键盘的上下左右,这全都是由系统函数所规定的,直接调用即可。

除了上述三个新接触的函数,其它功能的实现都是在我已学知识范围内可以完成的或者是之前接触过的。本次我使用了刚学的链表完成了对蛇的创建。使用链表的好处就是在于实现蛇吃掉食物蛇身增加一节,以及蛇咬到自己,蛇撞墙这些功能时比较好理解,比较形象。相对于用数组来实现这些功能,个人觉得还是链表更简单一些。

新学到的知识总结完啦,下面就来总结一下自己在代码敲完之后,运行程序出现的问题,以及自己的解决方案。我在代码敲完之后,运行程序并进行测试,在多次运行程序之后,发现了这样的问题,那就是食物和蛇身重合的情况还是会出现。

一开始实现这个功能的代码如下:

/*

随机创建食物

*/

void createfood()

{

snake *food_1;

srand((unsigned)time(NULL)); //初始化随机数

food_1=(snake*)malloc(sizeof(snake)); //初始化food_1

while((food_1->x%2)!=0) //保证其为偶数,使得食物能与蛇头对齐,然后食物会出现在网格线上

{

food_1->x=rand()%52+2; //食物随机出现,食物的x坐标在2~52

}

food_1->y=rand()%24+1; //食物的y坐标在1~24

q=head;

while(q->next!=NULL)

{

if(q->x==food_1->x && q->y==food_1->y) //判断蛇身是否与食物重合

{

free(food_1); //如果蛇身和食物重合,那么释放食物指针

createfood(); //重新创建食物

}

q=q->next;

}

gotoxy(food_1->x,food_1->y);

food=food_1;

color(12);

printf("●"); //输出食物

}

这是最开始的代码,这部分我要实现的功能是随机生成食物,并判断是否与蛇身重合,如果重合,就重新生成食物。但从运行效果来看,这部分的代码还是有问题的。于是我想着去把这部分代码给改善一下。思考了很多天,也和同学讨论了这部分的问题,我也在CSDN上问了一些大神博主,最终找出了这部分代码出错的原因。出错的原因有两个:1.while(q->next! =NULL)这个while循环的判断条件导致蛇尾没有进行判断就跳出了循环。2.在while循环中递归调用了这个函数本身,假若第一个节点是与食物重合的,那么会第二次调用这个函数本身,此时第一次调用这个函数中的food_1是被释放掉的。如果第二次调用中食物不在蛇身上产生了,第二次调用结束,那么这个函数回到第一次调用的时候gotoxy(food_1->x,food_1->y);这句话就是违法的。第一个错误很简单,但是即使把第一个错误改掉之后,我发现第二个错误没法改。因此我得出了创建食物和判断是否与蛇身重合不能写在一个函数中的结论。于是我想把这个函数拆成两个函数,但具体改的方案不是我自己完成的,是我和同学一起讨论,最终完成了修改。

修改完的这部分代码如下:

/*

随机出现食物

*/

void createfood()

{

snake *food_1;

srand((unsigned)time(NULL)); //初始化随机数

food_1=(snake*)malloc(sizeof(snake)); //初始化food_1

do

{

food_1->x=rand()%(52/2)*2+2; //食物随机出现,食物的x坐标在2~52

food_1->y=rand()%24+1; //食物的y坐标在1~24

}

while(intobody(food_1->x,food_1->y));

gotoxy(food_1->x,food_1->y);

food=food_1;

color(12);

printf("●"); //输出食物

}

/*

判断食物是否与蛇身重合

*/

int intobody(int x,int y)

{

for(q=head;q!=NULL;q=q->next)

{

if(q->x==x&&q->y==y)

return 1;

}

return 0;

}

把原来的那个函数拆成了两个函数,一个用来创建食物,一个用来判断是否与蛇身重合,如果重合,第二个函数返回值为1,从而导致第一个函数继续循环,重新创建食物,直到不再和蛇身重合,第二个函数返回值为0,第一个函数跳出循环并且打印食物。这样修改十分具有可行性。在运行了很多次后都没有出现蛇身与食物重合的情况。自此,代码完善完成,贪吃蛇项目正式完工。

在这次的项目实践中我觉得自己独立思考问题的能力还有待提高,并且我觉得自己知识面太窄,需要想办法扩充自己的知识面。我的学习路径主要就是CSDN和百度,我认为CSDN上博主的讲解还是很好懂的,比较不错。后期我要试着开发其他一些小程序并且继续通过CSDN和百度不断学习,不断提高自己的编程能力,加油!!!

最后,想要源码的同学请点个赞并私聊我吧!

我是热爱剪辑与编程小刘同学!

责任编辑: 鲁达

1.内容基于多重复合算法人工智能语言模型创作,旨在以深度学习研究为目的传播信息知识,内容观点与本网站无关,反馈举报请
2.仅供读者参考,本网站未对该内容进行证实,对其原创性、真实性、完整性、及时性不作任何保证;
3.本站属于非营利性站点无毒无广告,请读者放心使用!

“matlab中如何实现按键盘时跳出while循环否则一直执行”边界阅读