admin 管理员组

文章数量: 1087817

2048小游戏中

本次全程跟着b站视频教学,感谢互联网,感谢感谢。 

实现矩阵左、右、上、下移动的代码。对于每一个方向的移动,都利用了两重循环来遍历矩阵的每一列或每一行。在内层循环中,判断当前元素是否为0,如果不为0,就执行移动和合并操作。在外层循环中,从左到右(或从上到下)遍历每一列(或每一行)。如果发生了移动或合并,就执行随机生成新数字的操作。

//向上移动,从上往下遍历
void moveUp()
{bool isMoved = false;for (int c = 0; c < ROW; c++)//遍历列{int temp = COL - 1;//从第一个元素开始for (int begin = COL - 2; begin >= 0; begin--)//遍历行{//判断begin处是否为0if (map[begin][c] != 0){if (map[temp][c] == 0){map[temp][c] = map[begin][c];map[begin][c] = 0;isMoved = true;}else if (map[temp][c] == map[begin][c]){map[temp][c] *= 2;map[begin][c] = 0;temp--;isMoved = true;}else{map[temp - 1][c] = map[begin][c];if (temp - 1 != begin){map[begin][c] = 0;isMoved = true;}temp--;}}}}if (isMoved){mapFillNumber();}}

 

代码首先遍历每一列,从下往上遍历每一行,对于每一行,如果该位置不为0,它会与上一个非0位置进行比较。如果与上一个非0位置相等,则将其合并;如果不等,则将其移动到上一个非0位置。如果地图被修改,就会调用 mapFillNumber() 填充新数字。

//向下移动,从下往上遍历,行
void moveDown()
{bool isMoved = false;for (int c = 0; c < COL; c++)//遍历列{int temp = ROW - 1;for (int begin = ROW - 2; begin >= 0; begin--)//遍历行{//判断begin处是否为0if (map[begin][c] != 0){if (map[temp][c] == 0){map[temp][c] = map[begin][c];map[begin][c] = 0;isMoved = true;}else if (map[temp][c] == map[begin][c]){map[temp][c] *= 2;map[begin][c] = 0;temp--;isMoved = true;}else{map[temp - 1][c] = map[begin][c];if (temp - 1 != begin){map[begin][c] = 0;isMoved = true;}temp--;}}}}if (isMoved){mapFillNumber();}
}

 首先,遍历每一列。然后,从最后一行往上遍历,遍历到的每一行的数字进行移动。

如果遍历到的行的数字不为0,则进行如下操作:

  1. 如果当前位置(temp)为0,则将该数字移动到当前位置,并将原来的位置设为0。
  2. 如果当前位置(temp)与遍历到的数字相等,则将当前位置的数字乘2,将原来的位置设为0,temp向上移动一位。
  3. 如果当前位置(temp)与遍历到的数字不相等,则将该数字移动到temp-1处,如果temp-1不等于begin,则将原来的位置设为0,temp向上移动一位。

如果任意一个数字被移动,则调用mapFillNumber()函数。

//向左移动
void moveLeft()
{bool isMoved = false;for (int c = 0; c < ROW; c++)//遍历列{int temp = 0;//从第一个元素开始for (int begin = 1; begin < COL; begin++)//遍历行{//判断begin处是否为0if (map[begin][c] != 0){if (map[temp][c] == 0){map[temp][c] = map[begin][c];map[begin][c] = 0;isMoved = true;}else if (map[temp][c] == map[begin][c]){map[temp][c] *= 2;map[begin][c] = 0;temp++;isMoved = true;}else{map[temp + 1][c] = map[begin][c];if (temp + 1 != begin){map[begin][c] = 0;isMoved = true;}temp++;}}}}if (isMoved){mapFillNumber();}
}

代码实现了在二维数组 map 中左移操作:

  1. 遍历每一列(每一列的左移操作独立);
  2. 使用两个变量 tempbegin 遍历每一行,temp 记录当前操作的位置,初始化为 0;
  3. 如果 begin 处的元素不为0,分为以下几种情况:
    • 如果 temp 处的元素为0,将 begin 处的元素移到 temp 处;
    • 如果 temp 处的元素与 begin 处的元素相等,将 temp 处的元素×2,begin 处的元素置为0;
    • 如果 temp 处的元素与 begin 处的元素不等,将 begin 处的元素移到 temp + 1 处。
  4. 如果操作过,则调用 mapFillNumber 函数填充新的数字。

这段代码实现了对于每一列的左移操作,最终实现了整个二维数组的左移操作。

 

//向右移动
void moveRight()
{bool isMoved = false;for (int c = 0; c < ROW; c++)//遍历列{int temp = COL - 1;//从第一个元素开始for (int begin = COL - 2; begin >= 0; begin--)//遍历行{//判断begin处是否为0if (map[begin][c] != 0){if (map[temp][c] == 0){map[temp][c] = map[begin][c];map[begin][c] = 0;isMoved = true;}else if (map[temp][c] == map[begin][c]){map[temp][c] *= 2;map[begin][c] = 0;temp--;isMoved = true;}else{map[temp - 1][c] = map[begin][c];if (temp - 1 != begin){map[begin][c] = 0;isMoved = true;}temp--;}}}}if (isMoved){mapFillNumber();}
}

代码实现了向右移动的功能。它首先遍历每一列,然后从后往前遍历每一行。如果当前行不为0,它会与目标位置进行比较。如果目标位置为0,则将当前位置移动到目标位置;如果目标位置与当前位置相等,则将目标位置乘2,并将当前位置置为0;如果不相等,则将当前位置移动到下一个目标位置,并且目标位置减1。如果地图移动过,则会填充一个新的数字。

 

 

本文标签: 2048小游戏中