谁能帮我解释一下java2048小游戏这一段代码? 50
privatebooleanmoveLeft(){for(inti=0;i<4;i++){for(intj=1,index=0;j<4;j++){if(checks[i]...
private boolean moveLeft() {
for (int i = 0; i < 4; i++) {
for (int j = 1, index = 0; j < 4; j++) {
if (checks[i][j].value > 0) {
if (checks[i][j].value == checks[i][index].value) {
score += checks[i][index++].value <<= 1;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][index].value == 0) {
checks[i][index].value = checks[i][j].value;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][++index].value == 0) {
checks[i][index].value = checks[i][j].value;
checks[i][j].value = 0;
isadd = true;
}
}
}
}
return isadd;
} 展开
for (int i = 0; i < 4; i++) {
for (int j = 1, index = 0; j < 4; j++) {
if (checks[i][j].value > 0) {
if (checks[i][j].value == checks[i][index].value) {
score += checks[i][index++].value <<= 1;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][index].value == 0) {
checks[i][index].value = checks[i][j].value;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][++index].value == 0) {
checks[i][index].value = checks[i][j].value;
checks[i][j].value = 0;
isadd = true;
}
}
}
}
return isadd;
} 展开
1个回答
2020-01-09
展开全部
//总体来讲,这个左移方法就是一行行的元素进行左移,每一行判断后三个元素能否左移
private boolean moveLeft() { //左移操作
for (int i = 0; i < 4; i++) { //因为2048 一共只有4*4的方阵,所以定义循环4次 i表示行数
for (int j = 1, index = 0; j < 4; j++) { // 定义j为列数 因为是左移算法,所以只需要判断后三列,index是表示要移动到的列,默认是第一列,注意 index的值是永远小于j-1的(从循环的代码处理中可以看出来,index加一的时候,j一定会执行一次j++),也就是index一定是在j的左侧,不一定是紧邻
if (checks[i][j].value > 0) {// 如果当前遍历的第i行第j列的模块的值不是0
if (checks[i][j].value == checks[i][index].value) {//判断j模块的值跟index模块的值是否相同,相同就合并到index模块,并且值*2倍,分数也相应的加上;j模块的值就消掉变成0
score += checks[i][index++].value <<= 1;//先进行分数累加计算 score += checks[i][index++].value; 再进行模块值*2重新赋值 checks[i][index++].value <<= 1;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][index].value == 0) {//判断index模块的值是否为0,如果是0,j模块左移到index模块位置,j模块值重置为0,只是简单地移动,没有分数变更
checks[i][index].value = checks[i][j].value;//这句就是 当前模块转移到左侧模块,
checks[i][j].value = 0;//当前模块位置值更新成0
isadd = true;
} else if (checks[i][++index].value == 0) {//如果 j模块的值既不等于index模块的值,index模块的值也不等于0;那说明index模块跟j模块不能合并,数值有差异,需要判断index右边的模块是否为0
checks[i][index].value = checks[i][j].value;//如果index模块后边的职位0,j模块就可以移动到该模块,j模块原来位置的值更新成0
checks[i][j].value = 0;
isadd = true;
}
}
}
}
return isadd;//最终返回的的这个isadd是个全局变量,只要有任意一行执行过左移操作,就返回true;如果没有左移操作,返回false,游戏结束
}
private boolean moveLeft() { //左移操作
for (int i = 0; i < 4; i++) { //因为2048 一共只有4*4的方阵,所以定义循环4次 i表示行数
for (int j = 1, index = 0; j < 4; j++) { // 定义j为列数 因为是左移算法,所以只需要判断后三列,index是表示要移动到的列,默认是第一列,注意 index的值是永远小于j-1的(从循环的代码处理中可以看出来,index加一的时候,j一定会执行一次j++),也就是index一定是在j的左侧,不一定是紧邻
if (checks[i][j].value > 0) {// 如果当前遍历的第i行第j列的模块的值不是0
if (checks[i][j].value == checks[i][index].value) {//判断j模块的值跟index模块的值是否相同,相同就合并到index模块,并且值*2倍,分数也相应的加上;j模块的值就消掉变成0
score += checks[i][index++].value <<= 1;//先进行分数累加计算 score += checks[i][index++].value; 再进行模块值*2重新赋值 checks[i][index++].value <<= 1;
checks[i][j].value = 0;
isadd = true;
} else if (checks[i][index].value == 0) {//判断index模块的值是否为0,如果是0,j模块左移到index模块位置,j模块值重置为0,只是简单地移动,没有分数变更
checks[i][index].value = checks[i][j].value;//这句就是 当前模块转移到左侧模块,
checks[i][j].value = 0;//当前模块位置值更新成0
isadd = true;
} else if (checks[i][++index].value == 0) {//如果 j模块的值既不等于index模块的值,index模块的值也不等于0;那说明index模块跟j模块不能合并,数值有差异,需要判断index右边的模块是否为0
checks[i][index].value = checks[i][j].value;//如果index模块后边的职位0,j模块就可以移动到该模块,j模块原来位置的值更新成0
checks[i][j].value = 0;
isadd = true;
}
}
}
}
return isadd;//最终返回的的这个isadd是个全局变量,只要有任意一行执行过左移操作,就返回true;如果没有左移操作,返回false,游戏结束
}
推荐律师服务:
若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询