总体实现思路:以一个4x4的二维数组,来存储每个位置的数字。先实现一个方向的移动与合并,其他方向旋转至该方向,再旋转回去即可完成该方向的移动与合并。
按键控制旋转方向
if (ImGui_IsKeyPressed(ImGuiKey_A)) {
rotateNum = 0;
}
if (ImGui_IsKeyPressed(ImGuiKey_D)) {
rotateNum = 2;
}
if (ImGui_IsKeyPressed(ImGuiKey_W)) {
rotateNum = 1;
}
if (ImGui_IsKeyPressed(ImGuiKey_S)) {
rotateNum = 3;
}
for (int i = 0; i < rotateNum; ++i)
{
Rotate();
}
LeftMove(map);
for (int i = 4- rotateNum; i > 0; --i)
{
Rotate();
}
实现向左滑动
static void LeftMove(int map[][4]) {
for (int i = 0; i < 4; i++) {
for (int j = 0, index = -1; j < 4; j++) {
if (index == -1 && map[i][j] == 0) {
index = j;
}
else if (index != -1 && map[i][j] != 0) {
map[i][index] = map[i][j];
map[i][j] = 0;
index++;
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 1, l = 0; j < 4; j++) {
if (l >= j) {
continue;
}
if (map[i][j] != 0 && map[i][j] == map[i][l]) {
map[i][l] += map[i][j];
map[i][j] = 0;
l = j + 1;
}
else if (map[i][j] != 0) {
l = j;
}
}
}
for (int i = 0; i < 4; i++) {
for (int j = 0, index = -1; j < 4; j++) {
if (index == -1 && map[i][j] == 0) {
index = j;
}
else if (index != -1 && map[i][j] != 0) {
map[i][index] = map[i][j];
map[i][j] = 0;
index++;
}
}
}
}
实现向右滑动
static void RightMove(int num) {
for (int i = 0; i < num; i++) {
Rotate();
}
LeftMove(map);
for (int i = 0; i < 4-num; i++) {
Rotate();
}
}
实现向下滑动
static void DownMove(int num) {
for (int i = 0; i < num; i++) {
Rotate();
}
LeftMove(map);
for (int i = 0; i < 4 - num; i++) {
Rotate();
}
}
实现向上滑动
static void UpMove(int num) {
for (int i = 0; i < num; i++) {
Rotate();
}
LeftMove(map);
for (int i = 0; i < 4 - num; i++) {
Rotate();
}
}
存储每个步骤时的数组
为实现步数回退,需要先将每一步的数据保存到一个循环队列里面。
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
backMap[stepCount % maxSize][i][j] = map[i][j];
}
}
按键Z进行步骤回退
if (ImGui_IsKeyPressed(ImGuiKey_Z)&&(stepCount-endCount)>0) {
stepCount--;
for (int i = 0; i < 4; i++) {
for (int j = 0; j < 4; j++) {
map[i][j] = backMap[stepCount % maxSize][i][j];
}
}
if (stepCount <= endCount) {
stepCount = endCount = 0;
}
}
随机在空位生成2或4
static void Generate2or4() {
srand((unsigned)time(NULL));
int emptyCount = RecordEmpty();
int pos = rand() % emptyCount;
int num = rand() % 2;
PrintLog("pos is %d", pos);
int index = -1;
for (int i = 0; i < 16; i++) {
if (emptyArr[i] == 0) {
index++;
}
if (index == pos) {
PrintLog("i is %d", i);
if(num==0){
map[i / 4][i % 4] = 2;
}
else {
map[i / 4][i % 4] = 4;
}
break;
}
}
}