ViVi Home > 技術文書 > さくさく理解できる C/C++ コンソールアプリ入門 > カーソル位置指定(Win32)
// カーソル位置指定 for Windows Console void setCursorPos(int x, int y) { HANDLE hCons = GetStdHandle( STD_OUTPUT_HANDLE ); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hCons, pos); }
上記がカーソル位置を指定する関数定義である。
通常のコンソール画面は、横80カラム、縦25行から成るので、
x は [0, 80) の範囲、y は [0, 25) の範囲となる。※ [a, b) は a 以上、b 未満の範囲を表す。
実装的には、引数を用意して、Win32 API の SetConsoleCursorPosition() をコールしているだけだ。
最初の引数はコンソールハンドルで、色指定の時と同じように GetStdHandle( STD_OUTPUT_HANDLE ) で取得する。
座標は COORD 構造体を利用する。
これらの関数、構造体を利用するには <window.h> をインクルードしておく必要がある。
下記は、画面のランダムな位置に、100個の * を表示するものである。
#include <iostream> #include <Windows.h> using namespace std; int main() { const int CONS_WD = 80; const int CONS_HT = 25; for (int i = 0; i < 100; ++i) { setCursorPos(rand() % CONS_WD, rand() % CONS_HT); // カーソルを画面上のランダムな位置に移動 cout << "*"; // * を描画 } getchar(); return 0; }
演習問題
#include <iostream> #include <Windows.h> #define CONS_WD 80 #define CONS_HT 25 using namespace std; // カーソル位置指定 for Windows Console void setCursorPos(int x, int y) { HANDLE hCons = GetStdHandle( STD_OUTPUT_HANDLE ); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(hCons, pos); } int main() { int x = 0; // 物体位置 int y = 0; int vx = 1; // x 方向速度 int vy = 1; // y 方向速度 for (;;) { setCursorPos(x, y); cout << "*"; Sleep(200); int x0 = x; // 移動前の位置 int y0 = y; if( (x += vx) < 0 || x >= CONS_WD ) { // 左右の壁に衝突した場合 x += (vx = -vx) * 2; // x 方向速度反転、壁で反射 cout << (char)7; // Bepp 音 } if( (y += vy) < 0 || y >= CONS_HT ) { // 上下の壁に衝突した場合 y += (vy = -vy) * 2; // y 方向速度反転、壁で反射 cout << (char)7; // Beep 音 } setCursorPos(x0, y0); cout << " "; // 移動前の位置を空白に } return 0; }