可能是一个关于 c++ 循环的简单问题

Posted

技术标签:

【中文标题】可能是一个关于 c++ 循环的简单问题【英文标题】:Probably a simple question about a c++ loop 【发布时间】:2021-12-16 16:32:15 【问题描述】:

首先,我要感谢所有试图帮助我解决这个问题的人。我正在创建一个蛇克隆来给自己带来真正的问题和情况。我自己已经经历了很多,但不幸的是,我觉得自己就像一堵砖墙,不想再浪费时间不理解一些可能非常简单的事情。

我的问题是蛇的尾巴。当我创建一个蛇尾块时,我希望该块占据已创建的可渗透块的位置。这是因为到目前为止,第一个块跟随不在同一类中的头部。头部在代码中被称为 playerObj。我创建了一个 for 循环,因为我认为这是完成这项工作的最佳方式,因此我从 for 循环中排除了第一个 tail 块。

for (int i = 1; i < snakeSize; i++)

    int previousTail = i - 1;
            
            
    //std::cout << "CURRENT TAIL X: " << CurTailPosX << " Y: " << CurTailPosY << std::endl;
             

    // This is the where the issue happens - ONLY TAIL 0 POS IS TRACKED AND ALL OTHERS GET UPDATED TO ITS POS
            
            
    growTail.snakeArray[i][0] = growTail.snakeArray[previousTail][0];
    growTail.snakeArray[i][1] = growTail.snakeArray[previousTail][1];


    std::cout << "Last Tail Pos X: " << growTail.snakeArray[previousTail][0] << " Y: " << growTail.snakeArray[previousTail][1] << std::endl;
            

目前正在发生的事情是所有创建的尾部最终都成为第一个尾部块的位置,因此它们都显示为一个块,这当然是第一个尾部块。我确信这很简单,再次为此感到抱歉,但毕竟我正在学习。

如果信息不足,您可以查看此粘贴箱链接,其中包含您可以查看的整个文件 (https://pastebin.com/zSJCVJ9F)。再次感谢您阅读本文并与我打交道...

【问题讨论】:

请正确缩进您的代码以避免混淆。 cmets 后面的行不是循环体的一部分。 ^^^ 循环体应包含在 中。这是复制粘贴工件还是原始代码的样子?无论如何,请发minimal reproducible example。 @Bob__ 是的,它包含在 中,出于某种原因,它在那里的其余代码格式被搞砸了......我也会去做一个独立的例子,任何人都可以在没有任何外部库的情况下进行测试。 【参考方案1】:

贴出来的代码基本上是这样的

for (size_t i = 1; i < a.size(); i++)
                                        // Given a container, e.g. 1, 2, 3, 4
     a[i] = a[i - 1];                    // the result would be     1, 1, 1, 1
                   

您应该以相反的方向遍历容器以保留它的值而不是最后一个。

鉴于任务,我建议实现circular buffer 或使用std::deque:

deques上常见操作的复杂度(效率)如下:

随机访问 - 常数 O(1) 在末尾或开头插入或删除元素 - 常量 O(1)

【讨论】:

以上是关于可能是一个关于 c++ 循环的简单问题的主要内容,如果未能解决你的问题,请参考以下文章

C++:监控文件大小。这可能有问题吗?

for 循环中的向量迭代器、返回语句、警告、c++

C++程序运行效率的10个简单方法

关于Android中为什么主线程不会因为Looper.loop()里的死循环卡死?引发的思考,事实可能不是一个 epoll 那么 简单。

简单的 C++ - 关于字符串和连接以及将 int 转换为字符串 [重复]

C++ 函数(错误:控制可能到达非 void 函数的末尾)