1.控制台相关方法

1.必备知识点-控制台相关方法


1.1 知识点

修改控制台为Windows控制主机的窗口


输入输出

知识回顾

cout << "任意信息\n";
cout << "任意信息" << endl;

string str;
cin >> str;
cout << str << endl;

不显示输入内容在控制台上,直接获取单键输入信息

  • 引用一个系统写好的程序文件:
#include <conio.h>
  • 使用 _getch() 获取输入的字符,无需按回车键,且输入内容不会显示在控制台上。
int c = _getch();
switch (c)
{
    case 'W':
    case 'w':
        cout << "输入了一个w" << endl;
        break;
    case 'S':
    case 's':
        cout << "输入了一个s" << endl;
        break;
    default:
        break;
}
  • 对于特殊键位(比如方向键、功能键F1~F12等),需要调用两次 _getch() 方法:
    • 第一次得到的是特殊值 0224,代表是一个特殊键。
    • 第二次得到的是特殊键的具体编码。
while (true)
{
    int c = _getch();
    if (c == 0 || c == 224)
    {
        c = _getch();
        switch (c)
        {
        case 72:
            cout << "上箭头输入" << endl;
            break;
        case 80:
            cout << "下箭头输入" << endl;
            break;
        case 75:
            cout << "左箭头输入" << endl;
            break;
        case 77:
            cout << "右箭头输入" << endl;
            break;
        default:
            break;
        }
    }
    else
    {
        cout << (char)c << endl;
    }
}

导入写好的自定义控制台

导入步骤

  • 导入代码 CustomConsole.cppCustomConsole.h
  • 将其复制到项目中,并在项目中选择“添加现有项”。
  • 使用前需要引用导入的头文件:




#include "CustomConsole.h"

自定义控制台代码逻辑

#include "CustomConsole.h"

// 设置光标位置
void setCursorPosition(int x, int y) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD cursorPosition;
    cursorPosition.X = x;
    cursorPosition.Y = y;
    SetConsoleCursorPosition(hConsole, cursorPosition);
}

// 设置控制台大小
void setConsoleSize(int width, int height) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    COORD bufferSize;
    bufferSize.X = width + 2;
    bufferSize.Y = height + 1;
    SetConsoleScreenBufferSize(hConsole, bufferSize);

    SMALL_RECT windowSize;
    windowSize.Left = 0;
    windowSize.Top = 0;
    windowSize.Right = width;
    windowSize.Bottom = height;
    SetConsoleWindowInfo(hConsole, TRUE, &windowSize);
}

// 设置文本颜色
void setTextColor(WORD color) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
}

// 设置光标显隐
void setCursorVisibility(bool visible) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursorInfo;
    GetConsoleCursorInfo(hConsole, &cursorInfo);
    cursorInfo.bVisible = visible;  // 设置光标是否可见
    SetConsoleCursorInfo(hConsole, &cursorInfo);
}

// 关闭控制台
void closeConsole() {
    HWND hConsole = GetConsoleWindow();
    if (hConsole != NULL) {
        PostMessage(hConsole, WM_CLOSE, 0, 0);  // 发送关闭消息
    }
}

// 获取随机数
int getRandom(int min, int max) {
    random_device rd;
    mt19937 gen(rd()); 
    uniform_int_distribution<> dis(min, max); // 定义均匀分布 [min, max]
    return dis(gen);  // 返回生成的随机数
}

自定义控制台代码解析

自定义控制台代码包含了一些 Windows 控制台操作的函数和一个用于生成随机数的函数。下面是每个函数的详细解析。

setCursorPosition(int x, int y)
//设置光标位置
void setCursorPosition(int x, int y) {
    // 获取当前的标准输出句柄
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    // 设置光标位置的坐标
    COORD cursorPosition;
    cursorPosition.X = x;  // 横坐标(列)
    cursorPosition.Y = y;  // 纵坐标(行)

    // 调用 Windows API 函数设置光标位置
    SetConsoleCursorPosition(hConsole, cursorPosition);
}

功能:设置控制台光标的位置。

  • 参数

    • x:光标的横坐标(列)。
    • y:光标的纵坐标(行)。
  • 实现步骤

    1. 获取标准输出的句柄 hConsole,通过 GetStdHandle(STD_OUTPUT_HANDLE)
    2. 设置光标的位置 COORD cursorPosition,将 xy 分别赋值给 cursorPosition.XcursorPosition.Y
    3. 使用 SetConsoleCursorPosition(hConsole, cursorPosition) 调用 Windows API 函数来设置光标的实际位置。
setConsoleSize(int width, int height)
//设置控制台大小
void setConsoleSize(int width, int height) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    // 设置控制台屏幕缓冲区大小
    COORD bufferSize;
    bufferSize.X = width+2;
    bufferSize.Y = height+1;
    SetConsoleScreenBufferSize(hConsole, bufferSize);

    // 设置控制台窗口大小
    SMALL_RECT windowSize;
    windowSize.Left = 0;
    windowSize.Top = 0;
    windowSize.Right = width;
    windowSize.Bottom = height;
    SetConsoleWindowInfo(hConsole, TRUE, &windowSize);
}

功能:设置控制台的大小(包括缓冲区大小和窗口大小)。

  • 参数

    • width:控制台窗口的宽度。
    • height:控制台窗口的高度。
  • 实现步骤

    1. 获取标准输出的句柄 hConsole
    2. 设置控制台的屏幕缓冲区大小,使用 COORD 结构体来设置 bufferSize.XbufferSize.YX 是宽度,Y 是高度。这里将宽度加 2,高度加 1,以确保能显示所有内容。
    3. 设置控制台窗口的大小,通过 SMALL_RECT windowSize 结构体来定义窗口的边界,Left, Top, Right, 和 Bottom 分别设置窗口的四个边界。
    4. 调用 SetConsoleScreenBufferSizeSetConsoleWindowInfo 来分别设置屏幕缓冲区大小和窗口显示区域。
setTextColor(WORD color)
//设置文本颜色
void setTextColor(WORD color) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
}

功能:设置控制台文本的颜色。

  • 参数

    • color:指定文本颜色的颜色代码。
  • 实现步骤

    1. 获取标准输出的句柄 hConsole
    2. 使用 SetConsoleTextAttribute 设置文本颜色为 color
setCursorVisibility(bool visible)
//设置光标显隐
void setCursorVisibility(bool visible) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursorInfo;

    // 获取当前光标信息
    GetConsoleCursorInfo(hConsole, &cursorInfo);
    cursorInfo.bVisible = visible;  // 设置光标是否可见
    SetConsoleCursorInfo(hConsole, &cursorInfo);
}

功能:设置控制台光标的可见性。

  • 参数

    • visible:布尔值,true 表示显示光标,false 表示隐藏光标。
  • 实现步骤

    1. 获取标准输出的句柄 hConsole
    2. 使用 GetConsoleCursorInfo 获取当前光标的信息。
    3. 设置光标的可见性 bVisible,通过 SetConsoleCursorInfo 将新的光标信息应用到控制台。
closeConsole()
//关闭控制台
void closeConsole() {
    HWND hConsole = GetConsoleWindow();  // 获取控制台窗口句柄
    if (hConsole != NULL) {
        PostMessage(hConsole, WM_CLOSE, 0, 0);  // 发送关闭消息
    }
}

功能:关闭控制台窗口。

  • 实现步骤
    1. 获取控制台窗口的句柄 hConsole,使用 GetConsoleWindow
    2. 如果窗口句柄不为空,使用 PostMessage 发送关闭消息 WM_CLOSE,从而关闭控制台窗口。
getRandom(int min, int max)
int getRandom(int min, int max)
{
    // 创建随机数生成器
    random_device rd;  // 获得随机数种子
    mt19937 gen(rd()); // 使用 Mersenne Twister 生成器
    uniform_int_distribution<> dis(min, max); // 定义均匀分布 [0, 99]

    // 生成一个随机数
    int randomNumber = dis(gen);
    return randomNumber;
}

功能:生成一个指定范围内的随机整数。

  • 参数

    • min:生成的随机数的最小值。
    • max:生成的随机数的最大值。
  • 实现步骤

    1. 使用 random_device rd 获取一个随机数种子。
    2. 使用 Mersenne Twister 算法(mt19937)生成随机数。
    3. 定义一个均匀分布 uniform_int_distribution<> dis(min, max),生成指定范围内的随机数。
    4. 返回生成的随机数。

对控制台进行操作

  • 清空控制台
system("cls");
cout << "清空后的打印" << endl;
  • 设置控制台大小
setConsoleSize(50, 30);
  • 设置光标位置

控制台左上角为原点 0, 0,右侧是 X 轴正方向,下方是 Y 轴正方向。它是一个平面二维坐标系。

setCursorPosition(5, 1);

注意:边界问题,横纵距离单位不同,视觉上的1y = 2x。

  • 设置文字颜色
setTextColor(4);  // 红色
cout << "红色" << endl;

setTextColor(2);  // 绿色
cout << "绿色" << endl;

setTextColor(1);  // 蓝色
cout << "蓝色" << endl;

setTextColor(4 | 2);  // 红色 + 绿色 = 黄色
cout << "黄色" << endl;
  • 设置光标显隐
setCursorVisibility(true);  // 显示光标
  • 关闭控制台
closeConsole();

1.2 知识点代码

必备知识点1_控制台相关方法.cpp

#include <iostream>
#include <conio.h>
#include "CustomConsole.h"
using namespace std;
int main()
{
    std::cout << "控制台相关方法\n";
    cout << "控制台相关方法\n";

    #pragma region 知识点一 修改控制台为Windows控制主机的窗口

    //操作系统不同,VS2022使用的控制台窗口类型也不同
    //我们需要保证我们的控制台窗口为 "Windows控制台主机" 窗口

    #pragma endregion

    #pragma region 知识点二 输入输出

    #pragma region 输入输出知识回顾

    cout << "任意信息\n";
    cout << "任意信息" << endl;

    string str;
    cin >> str;
    cout << str << endl;

    #pragma endregion

    #pragma region 不显示输入内容在控制台上,直接获取单键输入信息

    //引用一个系统写好的程序文件
    //#include <conio.h>
    //其中有一个写好的方法 
    // _getch()
    // 可以通过它获取到输入的字符,并且无需按回车键,输入内容也不会显示在控制台上
    
    //需要注意的是:
    //1.对于字母、数字、符号,可以通过它返回的内容直接获取
    //存储的是你输入内容的askii码
    int c = _getch();
    switch (c)
    {
        case 'W':
        case 'w':
            cout << "输入了一个w" << endl;
            break;
        case 'S':
        case 's':
            cout << "输入了一个s" << endl;
            break;
        default:
            break;
    }
    
    //2.对于特殊键位(比如方向键、功能键F1~F12等),需要调用两次_getch()方法
    //  第一次得到的是特殊值0或224,代表是一个特殊键
    //  特殊键编码:
    //  上箭头 = 224、72
    //  下箭头 = 224、80
    //  左箭头 = 224、75
    //  右箭头 = 224、77
    //  F1 = 0、59
    //  F2 = 0、60
    //  F3 = 0、61
    //  第二次得到的是特殊键的具体编码

    //while (true)
    //{
    //    int c = _getch();
    //    if (c == 0 || c == 224)
    //    {
    //        //得到才是真正的特殊案件相关的值
    //        c = _getch();
    //        switch (c)
    //        {
    //        case 72:
    //            cout << "上箭头输入" << endl;
    //            break;
    //        case 80:
    //            cout << "下箭头输入" << endl;
    //            break;
    //        case 75:
    //            cout << "左箭头输入" << endl;
    //            break;
    //        case 77:
    //            cout << "右箭头输入" << endl;
    //            break;
    //        default:
    //            break;
    //        }
    //    }
    //    else
    //    {
    //        cout << (char)c << endl;
    //    }
    //}

    #pragma endregion

    #pragma endregion

    #pragma region 知识点三 导入写好的自定义控制台

    //导入韬老狮写好的代码CustomConsole.cpp和CustomConsole.h
    //并复制到项目中,在项目中选择添加现有项
    //使用前 需要引用导入的头文件 #include "CustomConsole.h"

    #pragma endregion

    #pragma region 知识点四 对控制台进行操作

    //1.清空控制台
    //  system("cls");
    system("cls");
    cout << "清空后的打印" << endl;

    //2.设置控制台大小
    setConsoleSize(50, 30);

    //3.设置光标位置
    //控制台左上角为原点0 0 右侧是X轴正方向 下方是Y轴正方向 它是一个平面二维坐标系
    setCursorPosition(5, 1);
    //注意:
    //1.边界问题
    //2.横纵距离单位不同 1y = 2x 视觉上的

    //4.设置文字颜色
    // 红色:FOREGROUND_RED = 4
    // 绿色:FOREGROUND_GREEN = 2
    // 蓝色:FOREGROUND_BLUE = 1
    // 可以位或计算进行颜色混合 RGB色混合
    // 颜色设置后 之后打印的信息才会变色 之前的不会受到影响
    setTextColor(4);
    cout << "红色" << endl;
    setTextColor(2);
    cout << "绿色" << endl;
    setTextColor(1);
    cout << "蓝色" << endl;

    setTextColor(4 | 2);
    cout << "黄色" << endl;

    //5.设置光标显隐
    setCursorVisibility(true);

    //6.关闭控制台
    //closeConsole();

    #pragma endregion
}

CustomConsole.cpp

#include "CustomConsole.h"
//设置光标位置
void setCursorPosition(int x, int y) {
    // 获取当前的标准输出句柄
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    // 设置光标位置的坐标
    COORD cursorPosition;
    cursorPosition.X = x;  // 横坐标(列)
    cursorPosition.Y = y;  // 纵坐标(行)

    // 调用 Windows API 函数设置光标位置
    SetConsoleCursorPosition(hConsole, cursorPosition);
}
//设置控制台大小
void setConsoleSize(int width, int height) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);

    // 设置控制台屏幕缓冲区大小
    COORD bufferSize;
    bufferSize.X = width+2;
    bufferSize.Y = height+1;
    SetConsoleScreenBufferSize(hConsole, bufferSize);

    // 设置控制台窗口大小
    SMALL_RECT windowSize;
    windowSize.Left = 0;
    windowSize.Top = 0;
    windowSize.Right = width;
    windowSize.Bottom = height;
    SetConsoleWindowInfo(hConsole, TRUE, &windowSize);
}
//设置文本颜色
void setTextColor(WORD color) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    SetConsoleTextAttribute(hConsole, color);
}
//设置光标显隐
void setCursorVisibility(bool visible) {
    HANDLE hConsole = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_CURSOR_INFO cursorInfo;

    // 获取当前光标信息
    GetConsoleCursorInfo(hConsole, &cursorInfo);
    cursorInfo.bVisible = visible;  // 设置光标是否可见
    SetConsoleCursorInfo(hConsole, &cursorInfo);
}
//关闭控制台
void closeConsole() {
    HWND hConsole = GetConsoleWindow();  // 获取控制台窗口句柄
    if (hConsole != NULL) {
        PostMessage(hConsole, WM_CLOSE, 0, 0);  // 发送关闭消息
    }
}

int getRandom(int min, int max)
{
    // 创建随机数生成器
    random_device rd;  // 获得随机数种子
    mt19937 gen(rd()); // 使用 Mersenne Twister 生成器
    uniform_int_distribution<> dis(min, max); // 定义均匀分布 [0, 99]

    // 生成一个随机数
    int randomNumber = dis(gen);
    return randomNumber;
}

1.3 练习题

通过W,A,S,D键在控制台中控制一个黄色方块上下左右移动

注意:边界问题
知识点:while,switch,输入输出等等

#include "CustomConsole.h"

// 设置窗口大小,光标隐藏,颜色 设置了窗口大小才能够知道边界是多少
int w = 50;
int h = 30;
setConsoleSize(w, h);
setCursorVisibility(false);
setTextColor(4 | 2);

// 定义光标位置的两个变量 清空控制台
int x = 0;
int y = 0;
system("cls");

// 定义死循环
while (true)
{
    // 第一种擦除方式 绘制之前擦除之前的内容
    // system("cls");

    // 设置绘制位置 绘制内容
    setCursorPosition(x, y);
    cout << "■";

    // 卡住 等待输入
    int c = _getch();

    // 第二种擦除方式
    // 输入过后 意味着马上要移动了
    // 移动之前 把老的位置的内容擦掉
    setCursorPosition(x, y);
    cout << "  ";

    switch (c)
    {
        case 'W':
        case 'w':
            y -= 1;
            // 边界判断 如果超出边界范围 强行拉回来
            if (y < 0)
                y = 0;
            break;
        case 'A':
        case 'a':
            x -= 2;
            if (x < 0)
                x = 0;
            break;
        case 'S':
        case 's':
            y += 1;
            // 下方边界由什么决定
            if (y > h)
                y = h;
            break;
        case 'D':
        case 'd':
            x += 2;
            if (x > w - 2)
                x = w - 2;
            break;
        default:
            break;
    }
}

1.4 练习题代码

必备知识点1_练习题.cpp

#include <iostream>
#include <conio.h>
#include "CustomConsole.h"
using namespace std;

int main()
{
    std::cout << "控制台相关方法练习题\n";

    //设置窗口大小,光标隐藏,颜色 设置了窗口大小才能够知道边界是多少
    int w = 50;
    int h = 30;
    setConsoleSize(w, h);
    setCursorVisibility(false);
    setTextColor(4 | 2);

    //定义光标位置的两个变量 清空控制台
    int x = 0;
    int y = 0;
    system("cls");

    //定义死循环
    while (true)
    {
        //第一种擦除方式 绘制之前擦除之前的内容
        //system("cls");

        //设置绘制位置 绘制内容
        setCursorPosition(x, y);
        cout << "■";

        //卡住 等待输入
        int c = _getch();

        //第二种擦除方式
        //输入过后 意味着马上要移动了
        //移动之前 把老的位置的内容擦掉
        setCursorPosition(x, y);
        cout << "  ";

        switch (c)
        {
            case 'W':
            case 'w':
                y -= 1;
                //边界判断 如果超出边界范围 强行拉回来
                if (y < 0)
                    y = 0;
                break;
            case 'A':
            case 'a':
                x -= 2;
                if (x < 0)
                    x = 0;
                break;
            case 'S':
            case 's':
                y += 1;
                //下方边界由什么决定
                if (y > h)
                    y = h;
                break;
            case 'D':
            case 'd':
                x += 2;
                if (x > w - 2)
                    x = w - 2;
                break;
            default:
                break;
        }
    }
}


转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。可以在下面评论区评论,也可以邮件至 785293209@qq.com

×

喜欢就点赞,疼爱就打赏