网格的蛇表示

Snake Representation of the grid

本文关键字:表示 网格      更新时间:2023-10-16

我想在C 中编码一个小蛇游戏,我想知道什么是表示游戏矩阵的最佳方法。

我可以使用2段(类似vector< vector< int>>),该值将包含一些代表不同对象的值(例如:0 Nothing,1 Snake,2 Wall,2 Wall,2 Wall,3 Food,...)另一方面,我不能在网格上使用数组,并使用倍数阵列作为不同的游戏对象(例如:vector< wall>,vector< snaketile>,vector&lt< food>,...)。p>我还应该考虑使用std :: Deque代表我的蛇吗?

谢谢您的帮助。

我认为您从围绕STD矢量编写包装器开始,该vector提供了COL,基于行的访问:

template<typename T>
class Matrix
{
private:
    std::vector<T> grid;
    size_t _cols, _rows;
public:
    Matrix(const size_t& cols, const size_t& rows) : 
        _cols(cols), _rows(rows), grid(cols*rows);
    {
    }
    T& at(const size_t& col, const size_t& row)
    {
        return grid[col + row * _cols];
    }
}

这将代表您的网格。T型(或类)可以代表包含有关单元格的所有信息的单元对象。这样,您的网格数据将被紧密包装,易于访问。

您还应该在整个过程中考虑一下您的scake如何与网格相互作用,这将是什么(您不能在蛇正确的地方放果实?)。然后,您可以在代码中进行这些内部分段,这将决定您的网格和蛇应该如何交换侵蚀(以及其中哪个)。

考虑碰撞 - 您想检查蛇是否与自身发生碰撞。在头部移动的位置访问网格是恒定的,搜索蛇的整个身体不是。如果玩家有些不错,那么蛇在某个时候会填充大部分网格,这意味着实际上没有保存任何记忆。

但是:您手头还有其他两个任务:蛇移动和绘画蛇时删除尾巴。为了绘画,我认为您希望玩家能够看到它如何摆动,因此您需要蛇穿越领域的顺序。这听起来像是蛇位置的队列。

我们已经谈论了内存,但是...在这里与内存相关吗?对于现代机器来说,400瓦左右没有。必须搜索整个身体的事情仍然很重要,因为这不如访问网格瓷砖可读。

因此,我是如何做的:有一个2D向量代表碰撞的网格和蛇队的队列。如果我们谈论的是食物和墙壁,则除了蛇以外的其他所有内容都可以存储在2D-Vector中。现在就此,实施它,看看是否出现问题,在最坏的情况下,您将获得经验,嗯?

我的解决方案是具有结构的向量。即:

 struct item
{
    int xCoord;
    int yCoord;
    int colour; // or object
};

和声明vector<item> gridInfo;

然后迭代每个x,y协调以查看是否有东西。

for(int y = 0; y < 10; y++)
{
    for(int x = 0; x < 10; x++)
    {
        //Display nothing
        for(auto it = gridInfo.begin(); it != gridInfo.end(); ++it)
        {
            if((*it).xCoord == x && (*it).yCoord == y)
            {
                //Display object
            }
        }
    }

不需要墙壁,因为您可以检查蛇的头是否脱离边界。