C 中的 Brick-Breaker - 递增砖行问题

Brick-Breaker in C - incrementing rows of bricks issue

我正在尝试使用 C 和 Stanford Portable Library (SPL) 重新创建 brickbreaker。我的 initBricks 函数的目标是添加 5 行砖块,每行 10 列(总共 50 块砖块)。当我 运行 这段代码时,我的 window 只有 1 排 10 块积木。由于某种原因,它不会输出其他 4 行。我看不出我的代码哪里出错了。在创建每一行后,我将 y 坐标(0,0 是 window 的左上角)增加 40。

// number of rows of bricks
#define ROWS 5

// number of columns of bricks
#define COLS 10

// height and width of bricks
#define BRICK_H 7.5
#define BRICK_W 35

// initializes window with grid of bricks
void initBricks(GWindow window)
{
    // set initial brick coordinates
    int x_coord = 2;
    int y_coord = 10;

    for (int i = 0; i < ROWS; i++)
    {
        // Create 10 columns of bricks
        for (int j = 0; j < COLS; j++)
        {
            // create a brick
            GRect brick = newGRect(x_coord, y_coord, BRICK_W, BRICK_H);
            setFilled(brick, true);
            setColor(brick, "RED");
            add(window, brick);

            // increment x coordinate for column spacing
            x_coord += 40;
        } 
        // increment y coordinate for row spacing
        y_coord += 40;  
    }
}

如有任何帮助,我们将不胜感激!

您需要为每一行重新设置 X 坐标。

for (int i = 0; i < ROWS; i++)
{
    // Create 10 columns of bricks
    int x_coord = 2;                   // <---- move line down to here
    for (int j = 0; j < COLS; j++)
    {
        ... 

您没有在外部 for 循环中重置 x_coord 变量,因此在第一行的末尾,您的 x_coord 是 202,这就是它开始写入下一行的地方离开你的 window。只需在 y_coord += 40; 之后添加 x_coord = 2; 即可解决问题。

for (int i = 0; i < ROWS; i++)
    {


       for (int j = 0; j < COLS; j++)
        {
            // create a brick
            GRect brick = newGRect(x_coord, y_coord, BRICK_W, BRICK_H);
            setFilled(brick, true);
            setColor(brick, "RED");
            add(window, brick);

            // increment x coordinate for column spacing
            x_coord += 40;
        } 
        // increment y coordinate for row spacing
        y_coord += 40;  
        //reset c coordinate
        x_coord = 2;

    }

如前所述,问题是 X 坐标。您可以通过将 X、Y 计算移动到 for 循环

来修复它
void initBricks(GWindow window)
{
    int row, col, x, y;

    for ( y = 10, row = 0; row < ROWS; row++, y += 40 )
        for ( x = 2, col = 0; col < COLS; col++, x += 40 )
        {
            GRect brick = newGRect(x, y, BRICK_W, BRICK_H);
            setFilled(brick, true);
            setColor(brick, "RED");
            add(window, brick);
        }
}

您应该必须在外循环体中初始化 y 坐标。 因为每次到达下一行时,y 坐标都想返回其初始位置。

// number of rows of bricks
#define ROWS 5

// number of columns of bricks
#define COLS 10

// height and width of bricks
#define BRICK_H 7.5
#define BRICK_W 35

    // initializes window with grid of bricks
    void initBricks(GWindow window)
    {
        // set initial brick coordinates
        int x_coord = 2;

        for (int i = 0; i < ROWS; i++)
        {
        int y_coord = 10;
            // Create 10 columns of bricks
            for (int j = 0; j < COLS; j++)
            {
                // create a brick
                GRect brick = newGRect(x_coord, y_coord, BRICK_W, BRICK_H);
                setFilled(brick, true);
                setColor(brick, "RED");
                add(window, brick);

                // increment x coordinate for column spacing
                x_coord += 40;
            } 
            // increment y coordinate for row spacing
            y_coord += 40;  
        }
    }