【问题标题】:How do i move a caracter in c++?如何在 C++ 中移动一个字符?
【发布时间】:2021-06-15 19:43:12
【问题描述】:

角色没有流畅地移动,停止并且没有向左或向右移动。我不太了解移动字符,但我想学习在我的蛇项目中使用它,代码有什么问题吗?

    while(true)
    {
        system("CLS");
        for(int i=0;i<10;i++)
        {
            cout<<map[i]<<endl;
        }
        system("pause>nul");

        if(GetAsyncKeyState(VK_DOWN))
        {
            int y2=y+1;
            if(map[y2][x]==' ')
            {
                map[y][x]=' ';
                y++;
                map[y][x]='@';
            }
        }
        if(GetAsyncKeyState(VK_UP))
        {
            int y2=y-1;
            if(map[y2][x]==' ')
            {
                map[y][x]=' ';
                y--;
                map[y][x]='@';
            }
        }
        if(GetAsyncKeyState(VK_RIGHT))
        {
            int x2=x+1;
            if(map[x2][x]==' ')
            {
                map[y][x]=' ';
                x++;
                map[y][x]='@';
            }
        }
        if(GetAsyncKeyState(VK_LEFT))
        {
            int x2=x-1;
            if(map[x2][x]==' ')
            {
                map[y][x]=' ';
                x--;
                map[y][x]='@';
            }
        }
    }
    return 0;
}

【问题讨论】:

  • 提示:不要调用CLS 之类的命令,只需输入ANSI escape 序列以清除屏幕。在这里依赖system() 是一个非常不好的习惯,与简单的打印或获取字符调用相比,这些调用的成本可能是巨大的。
  • 据我了解,您希望您的蛇在释放钥匙后移动。不仅仅是添加一些变量来指向你的蛇应该移动的方向,然后移动到这个方向
  • 您真正需要的是适当的游戏循环和输入机制。这个循环尽可能快地运行这些命令(并按键?)。一个正常的游戏循环不会等待按键本身被“按下”,它会检查各种按键的按键状态,就像你在这里大致做的那样,然后移动。请注意,以这种方式更新游戏网格,通过字面操作 2D 矩阵,效率非常低。更好的是有一个与图层一起使用的绘制例程,例如绘制背景,然后移动光标来绘制玩家。
  • 如果你想制作简单的类似 DOS 的游戏,别忘了有 tonresources out there 可以帮助你解决这个问题,许多游戏的源代码可用于免费。

标签: c++ windows c++11 visual-c++


【解决方案1】:

归结为您的游戏需要多快和多流畅的可玩性。在数独、填字游戏或单词搜索等节奏较慢的游戏中,在移动之间重新绘制屏幕是完全可以的,因为玩家无论如何都需要考虑下一步是什么。

然而,在像 Snake 这样的游戏中,这一切都归结为快速移动和快速刷新率。 c++和windows终端都可以做到这一点,但是重新绘制整个地图会拖慢很多。

c++ 有 char '\b' 相当于退格,windows 有 set str=!str:~0,-1! 用于删除字符串中的字符。两者都可以,但它们仍然有点浮华。

我还注意到一件事是您使用的是std::endl instead of \n。这可能会导致打印粗糙,因为 endl 会刷新输出缓冲区,这意味着它必须重新定位自己才能再次打印,而 '\n' 不会。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-11-20
    • 2020-03-17
    • 2022-06-13
    • 1970-01-01
    • 2022-01-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多