打印点和盒子

时间:2011-12-08 18:26:56

标签: c++

我正在为一个班级编写一个dots and boxes程序,除了打印网格时遇到问题,大部分都准备好了。

注意:网格可以是2x2到9x9的任何大小。两个两格的网格必须像这样打印到标准输出:

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

c + + +                         c + + +
  1 2 3                           1 2 3

我有点,边和框的数据结构。并且网格对象具有每个类的一维向量。

即点是网格上所有点的向量, edge是网格上所有边的向量(每个边有两个点) 框是网格上所有框的向量(每个框有四条边)

这些框有一个枚举谁拥有盒子播放器或计算机 如果它们是否被拍摄,边缘有一个bool,如果它们是垂直的,它们也是一个bool。

当我尝试打印网格时,我感到困惑,因为网格可以是多种尺寸。

由于(大小)边缘在偶数(水平)行上打印,而(大小+ 1)在奇数(垂直)上打印。

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

谢谢!

2 个答案:

答案 0 :(得分:3)

把你的边缘按顺序(矢量)排列。

gridsize = 2 : hh vvv hh vvv hh

这是你注意到的水平= 2和垂直=大小+ 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. */
}

从b1到b2的边沿存储在位置5(从0开始计数,计算可能的边缘)。你是如何得到这个职位的?

你可能想在这里停下来,自己想一想。我用笔和纸!

从b1到b2的边(根据我的算法)是第二行第一列(1,0)的一部分。打印水平边时,这里是如何计算矢量中边的位置。

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

从a2到b2的边是第一行,第二列(0,2)的一部分。打印垂直边缘时需要进行调整

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

答案 1 :(得分:1)

我使用仅仅单元格的2D模型(每个都有一个边缘列表)以及所有四个事物(h,v,c,d)的单独2D视图模型来实现此游戏的HTML + JS版本。请参阅此处查看代码段以及指向完整代码和可玩游戏的链接:https://stackoverflow.com/a/30387118/1593924

这有利于从“真实数据”中分离与渲染有关的UI状态/关注点。在底层模型中,需要了解完全不同的东西:

  • 每个单元格触及&#39;四个边缘,与其他单元格共享其中两个,

  • 单元格如何填充&#39;和

  • 如果玩家在给定回合中填充一个(或两个!)单元格,如何处理玩家和额外转弯。

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