C++中的COORD,SetConsoleCursorPosition(),_kbhit(),_getch()函数

练习C++的一些小项目:
1、学生信息管理系统; (C++基础)
2、俄罗斯方块(控制台); (C++基础)
3、证券资产管理分析软件; (C++在windows的应用)
4、单机版坦克大战;(windows版) (C++在windows的应用)
5、网络版坦克大战;(含游戏大厅) (C++在windows的应用)
6、游戏对战运营平台;(实战项目) (C++在windows的应用)
7、Linux开发环境架设; (C++在linux的应用)
8、Linux收银机; (C++在linux的应用)
9、Base_Web服务器或证券交易中间件; (C++在linux的应用)
10、3G视频语音 即时通讯平台和软件; (实战项目)(C++在windows和linux的综合应用)

功能描述,源码,运行图

参考资料:[学生信息管理系统]https://blog.csdn.net/gl620321/article/details/106985511
[俄罗斯方块]https://blog.csdn.net/qq_45849888/article/details/117386139?spm=1001.2014.3001.5502
对其中的COORD pos ,SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),pos),_kbhit(),_getch()进行解释

void SetPos(int i, int j)			//控制光标位置, 列, 行
{
	COORD pos = { i,j };
	HANDLE hConsole=GetStdHandle(STD_OUT_HANDLE);
	SetConsoleCursorPosition(hConsole, pos);
}

1,COORD 是window API中定义的一种结构体,表示一个字符在控制台屏幕上的坐标。定义为:

typedef struct_COORD{
	SHORT X;  横坐标
	SHORT Y;  纵坐标
}COORD;

2,SetConsoleCursorPosition(GetStdHandle(hConsole, pos);是一个计算机函数,如果定义了COORD pos ,那么pos是一个结构体变量。通过修改pos.x和pos.y值就可以实现控制台上光标的位置了。
HANDLE hConsole=GetStdHandle(STD_OUT_HANDLE):表示从一个特定的标准设备(标准输出)中取出一个句柄(用来标识不同设备的数据),其中STD_OUTPUT_HANDLE表示标准输出的句柄。GetStdHandle是Windows API函数,hConsole 只是一个句柄变量。HABDLE是Windows用来标识对象的(不是c++对象),HWND是其中一种,HWND是HANDLE,但不只是HWND,HANDLE是一个通用句柄表示。
3,_kbhit()和_getch()函数

while (1)
	{
		while (1)
		{
			if (_kbhit())
			{
				temp = _getch();
				break;
			}
		}
		if (temp == 32)
			break;
	}

_khbit()函数:
头文件:conio.h
格式:int _kbhit(void);
功能:检测当前是否有键盘输入
返回值:如果在调用函数时,有按键被按下,则返回一个非0的值,否则返回0;
_kbhit()函数是非阻塞函数;
_kbhit()函数通常与getch()函数组合使用获取按键信息;

_getch()函数
头文件:conio.h
格式:int _getch(void);
功能:从控制台上能够获取输入的字符,在获取输入的字符后,并不会在控制台中显示该字符。
返回值:获取到的字符值。
_getch()函数是一个阻塞函数,直到有字符输入时才会返回,所以该函数不会返回错误值;

扩展资料:

GetStdHandle函数的用法:
头文件:windows.h
语法:HANDLE GetStdHandle(DWORD nStdHandle);
GetStdHandle()返回标准的输入,输出或错误的设备的句柄,也就是得到输入、输出或错误的屏幕缓冲区的句柄。

参数值的几种类型:STD_INPUT_HANDLE标准输入的句柄,STD_OUTPUT_HANDLE标准输出的句柄,STD_ERROR_HANDLE标准错误的句柄。
参考资料来源:百度百科-GetStdHandle
参考资料来源:https://baike.baidu.com/item/kbhit/3921261

  • 3
    点赞
  • 44
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,我可以帮你写出一个简单的贪吃蛇游戏,包含函数`gotoxy`,以下是完整代码: ```cpp #include <iostream> #include <conio.h> #include <windows.h> #include <time.h> using namespace std; const int width = 20; // 地图宽度 const int height = 20; // 地图高度 int snakeX, snakeY; // 蛇头坐标 int fruitX, fruitY; // 食物坐标 int tailX[100], tailY[100]; // 蛇身坐标 int nTail; // 蛇身长度 enum Direction { STOP = 0, LEFT, RIGHT, UP, DOWN }; // 方向枚举 Direction dir; // 当前方向 bool gameOver; // 游戏是否结束 void Setup(); void Draw(); void Input(); void Logic(); void gotoxy(int x, int y); int main() { Setup(); while (!gameOver) { Draw(); Input(); Logic(); Sleep(50); // 控制游戏速度 } return 0; } void Setup() { srand(time(NULL)); // 初始化随机数种子 gameOver = false; dir = STOP; snakeX = width / 2; // 蛇头初始坐标 snakeY = height / 2; fruitX = rand() % width; // 食物初始坐标 fruitY = rand() % height; nTail = 0; } void Draw() { system("cls"); // 清屏 for (int i = 0; i < width + 2; i++) cout << "#"; // 上边框 cout << endl; for (int i = 0; i < height; i++) { for (int j = 0; j < width; j++) { if (j == 0) cout << "#"; // 左边框 if (i == snakeY && j == snakeX) cout << "O"; // 蛇头 else if (i == fruitY && j == fruitX) cout << "F"; // 食物 else { bool printTail = false; for (int k = 0; k < nTail; k++) { if (tailX[k] == j && tailY[k] == i) { cout << "o"; // 蛇身 printTail = true; } } if (!printTail) cout << " "; } if (j == width - 1) cout << "#"; // 右边框 } cout << endl; } for (int i = 0; i < width + 2; i++) cout << "#"; // 下边框 cout << endl; } void Input() { if (_kbhit()) // 判断有没有按键输入 { switch (_getch()) { case 'a': dir = LEFT; break; case 'd': dir = RIGHT; break; case 'w': dir = UP; break; case 's': dir = DOWN; break; case 'x': gameOver = true; break; } } } void Logic() { int prevX = tailX[0], prevY = tailY[0]; int prev2X, prev2Y; tailX[0] = snakeX; tailY[0] = snakeY; for (int i = 1; i < nTail; i++) { prev2X = tailX[i]; prev2Y = tailY[i]; tailX[i] = prevX; tailY[i] = prevY; prevX = prev2X; prevY = prev2Y; } switch (dir) { case LEFT: snakeX--; break; case RIGHT: snakeX++; break; case UP: snakeY--; break; case DOWN: snakeY++; break; } // 判断是否撞墙或者碰到自己的身体 if (snakeX < 0 || snakeX >= width || snakeY < 0 || snakeY >= height) gameOver = true; for (int i = 0; i < nTail; i++) { if (tailX[i] == snakeX && tailY[i] == snakeY) gameOver = true; } // 判断是否吃到了食物 if (snakeX == fruitX && snakeY == fruitY) { nTail++; fruitX = rand() % width; fruitY = rand() % height; } } void gotoxy(int x, int y) { HANDLE handle = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X = x; pos.Y = y; SetConsoleCursorPosition(handle, pos); } ``` 注意:在 Windows 环境下,`gotoxy` 函数需要用到 Windows API,所以需要包含 `windows.h` 头文件。`_kbhit()` 和 `_getch()` 函数需要用到 `conio.h` 头文件,用来实现按键监听。`Sleep()` 函数需要用到 `time.h` 头文件,用来控制游戏速度。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值