坦克进行移动之后怎样才能消除原先已经打印完成的坦克(控制台)😅
1条回答 默认 最新
- 赵4老师 2022-06-30 17:51关注
仅供参考:
#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; char d; SetConsoleOutputCP(437); ClearConsole(); GetWH(&w,&h); x=w/2;y=h/2; HideTheCursor(); ConPrintAt(x,y,"O",1); d='o'; while (1) { Sleep(50); if (kbhit()) { k=getch(); if (27==k) break;//按Esc键退出 if (0==k||0xe0==k) k|=getch()<<8;//非字符键 switch (k) { case 0x48e0:case 0x04800://上 d='u'; if (y>0) { ConPrintAt(x,y," ",1); y--; ConPrintAt(x,y,"O",1); } break; case 0x50e0:case 0x05000://下 d='d'; if (y<h) { ConPrintAt(x,y," ",1); y++; ConPrintAt(x,y,"O",1); } break; case 0x4be0:case 0x04b00://左 d='l'; if (x>0) { ConPrintAt(x,y," ",1); x--; ConPrintAt(x,y,"O",1); } break; case 0x4de0:case 0x04d00://右 d='r'; if (x<w-1) { ConPrintAt(x,y," ",1); x++; ConPrintAt(x,y,"O",1); } break; } // cprintf("%04x pressed.\r\n",k); } else { switch (d) { case 'u': if (y>0) { ConPrintAt(x,y," ",1); y--; ConPrintAt(x,y,"O",1); } break; case 'd': if (y<h) { ConPrintAt(x,y," ",1); y++; ConPrintAt(x,y,"O",1); } break; case 'l': if (x>0) { ConPrintAt(x,y," ",1); x--; ConPrintAt(x,y,"O",1); } break; case 'r': if (x<w-1) { ConPrintAt(x,y," ",1); x++; ConPrintAt(x,y,"O",1); } break; } } } ClearConsole(); ShowTheCursor(); return 0; }
本回答被题主选为最佳回答 , 对您是否有帮助呢?解决 1无用
悬赏问题
- ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
- ¥15 这种微信登录授权 谁可以做啊
- ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
- ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
- ¥15 网络设备配置与管理这个该怎么弄
- ¥20 机器学习能否像多层线性模型一样处理嵌套数据
- ¥20 西门子S7-Graph,S7-300,梯形图
- ¥50 用易语言http 访问不了网页
- ¥50 safari浏览器fetch提交数据后数据丢失问题
- ¥15 matlab不知道怎么改,求解答!!