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,则进行如下操作:
- 如果当前位置(temp)为0,则将该数字移动到当前位置,并将原来的位置设为0。
- 如果当前位置(temp)与遍历到的数字相等,则将当前位置的数字乘2,将原来的位置设为0,temp向上移动一位。
- 如果当前位置(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
中左移操作:
- 遍历每一列(每一列的左移操作独立);
- 使用两个变量
temp
和begin
遍历每一行,temp
记录当前操作的位置,初始化为 0; - 如果
begin
处的元素不为0,分为以下几种情况:- 如果
temp
处的元素为0,将begin
处的元素移到temp
处; - 如果
temp
处的元素与begin
处的元素相等,将temp
处的元素×2,begin
处的元素置为0; - 如果
temp
处的元素与begin
处的元素不等,将begin
处的元素移到temp + 1
处。
- 如果
- 如果操作过,则调用
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小游戏中
版权声明:本文标题:2048小游戏中 内容由网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:http://www.roclinux.cn/b/1687418440a100357.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论