0基础学习C++做贪吃蛇,边玩边学习!(三)SetConsoleCursorPosition光标移动效果——一条前进的蛇

你对C++的好奇心已经被黑漆漆的控制台窗口和一大串莫名其妙的错误提示消磨殆尽了吗?

你想亲手实现一个电脑游戏吗?

如果你想学习C++,又不知道如何入手,快上车!跟着我一起,0基础学习C++做贪吃蛇, 边玩儿边学习!

在上一篇我们用windows.h中的Sleep()函数停顿两秒后继续输出,实现了类似移动的效果。
我们知道,程序运行速度非常快,如果不使用Sleep()函数
两条输出会同时出现在控制台窗口————肉眼无法捕捉他们的先后,而使用Sleep()函数才能实现我们想要的效果。

事实上,Sleep函数的参数决定了我们贪吃蛇的移动速度(或许是级别)

现在我们必须实现“真正”的移动——在蛇第二次输出(位置向右移动了)的同时去掉第一次的输出,使得他看起来是在移动
——而不是残影之类的狡辩

OK!
安排!

//定义一个HANDLE型的变量handle(名字可以随便取)
//GetStdHandle()函数用来获取HANDLE(返回一个HANDLE类型)
//所以 handle 的值就是STD_OUTPUT_HANDLE(标准输出句柄)
HANDLE handle=GetStdHandle(STD_OUTPUT_HANDLE);
//SetConsoleCursorPosition()有两个参数,第一个参数为句柄,第二个参数是坐标
//这句意思是:将handle指向的输出窗口的光标位置改为{x,y}
SetConsoleCursorPosition(handle, {x,y});

可以看出,SetConsoleCursorPosition()函数的作用是光标移动,为了能让我们的控制台窗口的光标移动到指定位置,我们必须先指向(访问)窗口,因此定义一个句柄来指向当前窗口。
窗口句柄是windows系统为每个窗口规定的标识符,可以通过它访问此窗口,STD_OUTPUT_HANDLE(标准输出句柄)指向的就是运行时刻的控制台。

我们修改程序为:

#include <iostream>
#include <windows.h>
using namespace std;
int main() {
    cout << "oooo¥";
    Sleep(20000);
    cout << " oooo¥";
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    Sleep(500);
    SetConsoleCursorPosition(handle, { 15,6});
    Sleep(500);
    SetConsoleCursorPosition(handle, { 7,8 });
    return 0;
    }

编译运行,输出结果:
光标移动

我们可以观察到光标的移动。
如果我们在每次移动光标后打印蛇,就像下面这样:

#include <iostream>
#include <windows.h>
using namespace std;
int main() {
    cout << "oooo¥";
    Sleep(20000);
    cout << " oooo¥";
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    Sleep(500);
    SetConsoleCursorPosition(handle, { 15,6 });
    cout << "oooo¥";
    Sleep(500);
    SetConsoleCursorPosition(handle, { 7,8 });
    cout << "oooo¥";
    return 0;
}

效果会像这样:
似乎大功告成

好了,似乎大功告成了,但是见鬼的残影不但没有消失,而且似乎越来越多了?

那就消灭它!

//代码有了一些改动,不要在之前代码的基础上修改,最好重新复制粘贴或重新码。
#include <iostream>
#include <windows.h>
using namespace std;
int main() {
    HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleCursorPosition(handle, { 3,0 });
    cout << "oooo¥";
    Sleep(500);
    SetConsoleCursorPosition(handle, { 3,0 });
    cout << "     ";
    SetConsoleCursorPosition(handle, { 15,6 });
    cout << "oooo¥";
    Sleep(500);
    SetConsoleCursorPosition(handle, { 15,6 });
    cout << "     ";
    SetConsoleCursorPosition(handle, { 7,8 });
    cout << "oooo¥";
    return 0;
}

这是一条自由穿梭在控制台的小蛇,路过之后,无影无踪!

整体移动
……
……
……
……

难道贪吃蛇是整个移动的吗?

它不得爬啊!

???

别急,继续本系列,0基础学习C++做贪吃蛇,边玩边学习!

评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值