46311062 2022-06-29 21:06 采纳率: 100%
浏览 12
已结题

控制台c坦克大战开发

坦克进行移动之后怎样才能消除原先已经打印完成的坦克(控制台)😅

  • 写回答

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;
    }
    
    
    
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?

问题事件

  • 系统已结题 7月8日
  • 已采纳回答 6月30日
  • 创建了问题 6月29日

悬赏问题

  • ¥15 关于#java#的问题:找一份能快速看完mooc视频的代码
  • ¥15 这种微信登录授权 谁可以做啊
  • ¥15 请问我该如何添加自己的数据去运行蚁群算法代码
  • ¥20 用HslCommunication 连接欧姆龙 plc有时会连接失败。报异常为“未知错误”
  • ¥15 网络设备配置与管理这个该怎么弄
  • ¥20 机器学习能否像多层线性模型一样处理嵌套数据
  • ¥20 西门子S7-Graph,S7-300,梯形图
  • ¥50 用易语言http 访问不了网页
  • ¥50 safari浏览器fetch提交数据后数据丢失问题
  • ¥15 matlab不知道怎么改,求解答!!