请教一个简单的小程序啊

洛星辰 2014-03-31 10:49:21
在控制台中央输出一个字符 可以用方向键控制移动 求高手解答啊
...全文
126 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
熊熊大叔 2014-04-01
  • 打赏
  • 举报
回复
输入用getch() 剩下的就是对特殊ascii的处理了 包括输入你会用到方向键的ascii, 输出会用到空格和backspace
赵4老师 2014-04-01
  • 打赏
  • 举报
回复
waterSStreaming 2014-04-01
  • 打赏
  • 举报
回复
引用 3 楼 zhao4zhong1 的回复:
#include <conio.h>
#include <windows.h>

void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
   DWORD count;
   COORD coord = {x, y};
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(hStdOut, coord);
   WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}
void HideTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}

void ShowTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}
void GetWH(int *w,int *h) {
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {
        *w=csbi.srWindow.Right;
        *h=csbi.srWindow.Bottom;
    } else {
        *w=80;
        *h=25;
    }
}
void ClearConsole()
{
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //   not used but we need to capture this since it will be
   //   written anyway (passing NULL causes an access violation).
   DWORD count;
   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

int main() {
    unsigned short k;
    int x,y,w,h;

    SetConsoleOutputCP(437);
    ClearConsole();
    GetWH(&w,&h);
    x=w/2;y=h/2;
    HideTheCursor();
    ConPrintAt(x,y,"\xdb",1);
    while (1) {
        Sleep(50);
        k=getch();
        if (27==k) break;//按Esc键退出
        if (0==k||0xe0==k) k|=getch()<<8;//非字符键
        switch (k) {
            case 0x48e0:case 0x04800://上
                if (y>0) {
                    ConPrintAt(x,y," ",1);
                    y--;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
            case 0x50e0:case 0x05000://下
                if (y<h) {
                    ConPrintAt(x,y," ",1);
                    y++;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
            case 0x4be0:case 0x04b00://左
                if (x>0) {
                    ConPrintAt(x,y," ",1);
                    x--;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
            case 0x4de0:case 0x04d00://右
                if (x<w-1) {
                    ConPrintAt(x,y," ",1);
                    x++;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
        }
//      cprintf("%04x pressed.\r\n",k);

    }
    ClearConsole();
    ShowTheCursor();
    return 0;
}
waterSStreaming 2014-04-01
  • 打赏
  • 举报
回复

#include <cstdio>
#include <iostream>
#include <conio.h>
#include <Windows.h>

const int KEY_UP = 72;
const int KEY_LEFT = 75;
const int KEY_RIGHT = 77;
const int KEY_DOWN = 80;

const int P_MAX = 20;

inline int imax(int a, int b)
{
	return a > b ? a : b;
}

inline int imin(int a, int b)
{
	return a < b ? a : b;
}

int main()
{
	char c = 'O';
	char blank = ' ';
	int code0 = 0;
	int code1 = 0;
	int px = 10;
	int py = 10;

	COORD position;

	position.X = 10;
	position.Y = 10;

	/* Output the char at initial position. */
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
	std::cout << c;

	while(true)
	{
		code0 = (int)_getch();	

		if(code0 != 224)
		{
			continue;
		}

		code1 = (int)_getch();

		switch(code1)
		{
		case KEY_UP:
			py = imax(0, py - 1);
			break;
		case KEY_LEFT:
			px = imax(0, px - 1);			
			break;
		case KEY_RIGHT:
			px= imin(P_MAX, px + 1);
			break;
		case KEY_DOWN:
			py = imin(P_MAX, py + 1);			
			break;
		default:
			break;
		}

		position.X = px;
		position.Y = py;

		SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);

		/* Output the char at the new position. */
		std::cout << c;
	}

	return 0;
}
刚写的,不过输出恐怕得重新写一下,用方向键控制是可以的
赵4老师 2014-04-01
  • 打赏
  • 举报
回复
#include <conio.h>
#include <windows.h>

void ConPrintAt(int x, int y, char *CharBuffer, int len)
{
   DWORD count;
   COORD coord = {x, y};
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   SetConsoleCursorPosition(hStdOut, coord);
   WriteConsole(hStdOut, CharBuffer, len, &count, NULL);
}
void HideTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = FALSE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}

void ShowTheCursor()
{
   CONSOLE_CURSOR_INFO cciCursor;
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);

   if(GetConsoleCursorInfo(hStdOut, &cciCursor))
   {
      cciCursor.bVisible = TRUE;
      SetConsoleCursorInfo(hStdOut, &cciCursor);
   }
}
void GetWH(int *w,int *h) {
    HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
    CONSOLE_SCREEN_BUFFER_INFO csbi;
    if (GetConsoleScreenBufferInfo(hStdOut, &csbi)) {
        *w=csbi.srWindow.Right;
        *h=csbi.srWindow.Bottom;
    } else {
        *w=80;
        *h=25;
    }
}
void ClearConsole()
{
   //Get the handle to the current output buffer...
   HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
   //This is used to reset the carat/cursor to the top left.
   COORD coord = {0, 0};
   //A return value... indicating how many chars were written
   //   not used but we need to capture this since it will be
   //   written anyway (passing NULL causes an access violation).
   DWORD count;
   //This is a structure containing all of the console info
   // it is used here to find the size of the console.
   CONSOLE_SCREEN_BUFFER_INFO csbi;
   //Here we will set the current color
   if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
   {
      //This fills the buffer with a given character (in this case 32=space).
      FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
      //This will set our cursor position for the next print statement.
      SetConsoleCursorPosition(hStdOut, coord);
   }
}

int main() {
    unsigned short k;
    int x,y,w,h;

    SetConsoleOutputCP(437);
    ClearConsole();
    GetWH(&w,&h);
    x=w/2;y=h/2;
    HideTheCursor();
    ConPrintAt(x,y,"\xdb",1);
    while (1) {
        Sleep(50);
        k=getch();
        if (27==k) break;//按Esc键退出
        if (0==k||0xe0==k) k|=getch()<<8;//非字符键
        switch (k) {
            case 0x48e0:case 0x04800://上
                if (y>0) {
                    ConPrintAt(x,y," ",1);
                    y--;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
            case 0x50e0:case 0x05000://下
                if (y<h) {
                    ConPrintAt(x,y," ",1);
                    y++;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
            case 0x4be0:case 0x04b00://左
                if (x>0) {
                    ConPrintAt(x,y," ",1);
                    x--;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
            case 0x4de0:case 0x04d00://右
                if (x<w-1) {
                    ConPrintAt(x,y," ",1);
                    x++;
                    ConPrintAt(x,y,"\xdb",1);
                }
            break;
        }
//      cprintf("%04x pressed.\r\n",k);

    }
    ClearConsole();
    ShowTheCursor();
    return 0;
}
ooolinux 2014-04-01
  • 打赏
  • 举报
回复
以前纯DOS下Turbo C有屏幕输出函数,可以把一个字符串输出到屏幕指定位置,不知道在Windows下控制台方式可不可以。

65,208

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧