网格的蛇表示
Snake Representation of the grid
我想在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
}
}
}
不需要墙壁,因为您可以检查蛇的头是否脱离边界。
- 表示"accepting anything for this template argument" C++概念的通配符
- 如何将ampl中的集合表示为c++中的向量
- std::is_base_of表示ctor编译错误
- 输入中的字符串数未知(以字母表示)
- 我可以信任表示整数的浮点或双精度来保持精度吗
- c++模板来表示多项式
- 询问在设计我的手臂模拟器功能表示格式1
- CMakeLists.txt中的命名空间表示法
- C++射线示踪剂ppm表示没有足够的数据来显示图像
- 如何计算Big-O表示法中的平均渐近运行时间
- 我应该如何表示我拥有的连续元素序列?
- 在C++中,使用带有 std::optional 参数的函数<T>来表示可选参数是否有意义?
- 在 std::无符号字符的向量处存储 int 的十六进制表示形式
- 表示类模板C++空类型
- 具有所表示类的相同构造函数签名的代理类模板
- 嵌套在循环中的两个循环的 big-O 表示法
- 具有引用成员的结构是否具有唯一的对象表示形式
- 算法设计:用边界数字表示 2D 网格的最佳方式,以C++?
- 将网格与VTK相机对齐(相机的视觉表示,随之移动和旋转的网格)
- 网格的蛇表示