C++ 印刷点和盒

C++ 印刷点和盒,c++,C++,我正在为一个班级写一个程序,除了打印网格有困难外,其他的一切都准备好了 注意:网格可以是2x2到9x9之间的任何大小。二乘二网格必须按如下方式打印到标准输出: a + + + //after some moves: a +-+ + |P| b + + + b +-+ + c + + + c + + + 1 2 3

我正在为一个班级写一个程序,除了打印网格有困难外,其他的一切都准备好了

注意:网格可以是2x2到9x9之间的任何大小。二乘二网格必须按如下方式打印到标准输出:

a + + +    //after some moves:  a +-+ +
                                  |P| 
b + + +                         b +-+ +

c + + +                         c + + +
  1 2 3                           1 2 3
我有一个点、边和框的数据结构。网格对象对于每个类都有一个一维向量

点是网格上所有点的向量, 边是栅格上所有边的向量(每条边有两个点) 长方体是网格上所有长方体的向量(每个长方体有四条边)

盒子上有一个拥有盒子播放器或计算机的枚举 边有一个布尔值,表示它们是否被取下,也有一个布尔值表示它们是否垂直

当我试图打印网格时,我感到困惑,因为网格可以有多种大小

因为(大小)边打印在偶数(水平)行上,而(大小+1)边打印在奇数(垂直)行上

我希望我能清楚地解释这一点


谢谢

将边按顺序(向量)排列

这就是您注意到的水平=2和垂直=size+1

现在找出算法,以获得不同边的不同值。下面是我如何根据您的示例将边存储到向量中的:

Your first (empty) 2x2 grid: 00 000 00 000 00
Your second 2x2 grid:        10 110 10 000 00
当我打印出网格时,我在for循环中使用了行和列

// I consider the (row, col) to be the box.
// Each row loop prints one horizontal line and (possibly) one vertical line.
// Access to the edge vector is based on this (row, col) pair.
for (int row = 0; row < size + 1; row++) /* +1 to draw the bottom line. */
{
    if (row < size) /* Bottom most horizontal row not followed by vertical. */
        for (int col = 0; col < size + 1; col++) /* +1 to draw rightmost line. */
}
从a2到b2的边是第一行第二列(0,2)的一部分。打印垂直边时,需要对其进行调整

Vertical edge: pos = (row * (size + size + 1)) + size + col

我实现了这个游戏的HTML+JS版本,使用了一个只包含单元格(每个单元格都有一个边列表)的2D模型,以及一个包含所有四个元素(h、v、c、d)的单独2D视图模型。请参阅此处以获取代码片段以及指向完整代码和可玩游戏的链接:

这样做的好处是将与呈现相关的UI状态/关注点与底层模型中的“真实数据”分离开来,后者需要理解完全不同的事情:

  • 每个单元格“接触”四条边,并与其他单元格共享其中两条边

  • 单元格如何“填满”,以及

  • 当一个玩家在给定回合中填满一个(或两个!)单元格时,如何处理玩家和额外回合


事实上,UI可以将所有四种元素(顶点、v边、h边和单元格)渲染为单个网格中的矩形,尽管附加到它们的行为在单元格和边之间是不同的(顶点省略)。

您是否尝试过在没有任何边框的情况下打印网格?(嵌套用于循环,即for(int y=0;y<…)用于(int x=0;x<…你是说没有axi标签吗?如果是,那么是,如果不是,那么不是。我也不认为你需要跟踪点,因为它们是固定的。我喜欢这个1D数组/向量解决方案的边缘,但我不知道它如何处理对游戏至关重要的“P”。我认为它需要扩展到
hh vcv hh vcvcv hh
,其中
c
表示“单元格”。就我个人而言,我更喜欢2D方法,尤其是因为点也需要渲染:
dhdhd vcvcv dhdhdhd vcvcv dhdhdhd
Horizontal edge: pos = (row * (size + size + 1)) + col
Vertical edge: pos = (row * (size + size + 1)) + size + col