ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

L型棋盘覆盖问题以及解决C++ 控制台清屏时闪屏现象

2022-03-25 18:31:32  阅读:175  来源: 互联网

标签:STD 清屏 HANDLE int 句柄 C++ hOutput 时闪屏 控制台


棋盘覆盖--老生常谈的问题,不在追叙。

重点是找到了解决控制台闪屏的方法。

1 HANDLE hOutput; //设备句柄
2 COORD coord = { 0,0 };
3 hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
4 
5 //把system("cls"),替换为以下语句
6 CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
7 SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
8 SetConsoleCursorPosition(hOutput, coord);

对于方法的解释:

1、HANDLE GetStdHandle(  _In_  DWORD nStdHandle);

说明,获取标准设备句柄


nStdHandle 标准设备,可取值:
STD_INPUT_HANDLE (DWORD)-10,输入设备
STD_OUTPUT_HANDLE (DWORD)-11,输出设备
STD_ERROR_HANDLE (DWORD)-12,错误设备


调用返回:
成功,返回设备句柄(HANDLE);
失败,返回 INVALID_HANDLE_VALUE;
如果没有标准设备,返回 NULL。

2、BOOL SetConsoleCursorPosition( _In_  HANDLE hConsoleOutput,  _In_  COORD dwCursorPosition);

说明,设置控制台光标位置


hConsoleOutput 控制台输出设备句柄
dwCursorPosition 光标位置

3、BOOL WINAPISetConsoleCursorInfo(  _In_  HANDLE hConsoleOutput,  _In_  const CONSOLE_CURSOR_INFO *lpConsoleCursorInfo);

说明,设置控制台光标信息


hConsoleOutput,控制台输出设备句柄
lpConsoleCursorInfo,光标信息(大小、可见性)

 

已知其然,不知其所以然。

 

棋盘覆盖算法:

  1 #define rep(i,a,b) for(int i=a;i<(b);i++)
  2 #define trav(a,x) for(auto& a:x)
  3 #define all(x) begin(x),end(x)
  4 #define sz(x) (int)(x).size()
  5 
  6 using namespace std;
  7 
  8 typedef long long ll;
  9 typedef long double ld;
 10 typedef pair<int, int> pii;
 11 typedef pair<ll, ll> pll;
 12 typedef vector<int> vi;
 13 typedef vector<vi> vii;
 14 
 15 //打印棋盘,用于更新
 16 void printBorder(vii &border, int len);
 17 //分治--> 更新
 18 void cover(vii &border, pii LT, pii zang, int lengt);
 19 
 20 static int lran = 1;
 21 int KLen = 2;
 22 
 23 HANDLE hOutput;
 24 COORD coord = { 0,0 };
 25 
 26 int main()
 27 {
 28     hOutput = GetStdHandle(STD_OUTPUT_HANDLE);
 29     //■◆●○
 30     int k = 4;
 31     int blen = 2 << k;
 32     vii border(blen, vi(blen, 0));
 33 
 34     //棋盘初始化
 35     unsigned int seed =  time(0);
 36     srand(seed);
 37     int x = (rand() % (blen - 0));
 38     int y = (rand() % (blen - 0));
 39     border[x][y] = 1;
 40 
 41     //左上角坐标
 42     pii LT(0, 0);
 43     //脏点坐标
 44     pii zang(x, y);
 45     KLen = blen;
 46     cover(border, LT, zang, blen);
 47     
 48     return 0;
 49 }
 50 
 51 void printBorder(vii &border, int len) {
 52     Sleep(500);
 53     CONSOLE_CURSOR_INFO cursor_info = { 1, 0 };
 54     SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE), &cursor_info);
 55     SetConsoleCursorPosition(hOutput, coord);//清屏
 56     rep(i, 0, len) {
 57         rep(j, 0, len) {
 58             int li = (rand() % (6 - 0));
 59             if (border[i][j] == 0)
 60                 cout << setw(2) << "○";
 61             else if (border[i][j] == -1)
 62                 cout << setw(2) << "X";
 63             else 65                 cout << setw(2) << "●"; 67         }
 68         cout << endl;
 69     }
 70 }
 71 
 72 void cover(vii &border, pii LT, pii zang, int len) {
 73 
 74     if (len <= 2) {
 75         rep(x, LT.first, LT.first + len) {
 76             rep(y, LT.second, LT.second + len) {
 77                 if (border[x][y] == 0)
 78                     border[x][y] = lran;
 79             }
 80             lran++;
 81         }
 82         
 83         printBorder(border, KLen );
 84     }
 85     else {
 86         int zx = (zang.first - LT.first) * 2 / len;
 87         int zy = (zang.second - LT.second) * 2 / len;
 88 
 89         rep(x, LT.first+len / 2 - 1, LT.first + len / 2 + 1) {
 90             rep(y, LT.second + len / 2 - 1, LT.second + len / 2 + 1) {
 91                 border[x][y] = 1;
 92             }
 93         }
 94         border[LT.first +(len / 2-1)+zx][LT.second + zy + (len / 2-1)] = 0;
 95         printBorder(border, KLen);
 96 
 97         rep(x, LT.first + len / 2 - 1, LT.first + len / 2 + 1) {
 98             rep(y, LT.second + len / 2 - 1, LT.second + len / 2 + 1) {
 99                 int zx = (x - LT.first) * 2 / len;
100                 int zy = (y - LT.second) * 2 / len;
101                 if (border[x][y] == 1)
102                     cover(border, pii(LT.first + zx * len / 2, LT.second + zy * len / 2), pii(x, y), len / 2);
103                 else
104                     cover(border, pii(LT.first + zx * len / 2, LT.second + zy * len / 2), zang, len / 2);
105             }
106         }
107     }
108 }

 

标签:STD,清屏,HANDLE,int,句柄,C++,hOutput,时闪屏,控制台
来源: https://www.cnblogs.com/wensi-eric/p/16056124.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有