我正在用c语言写一个简单的游戏2048。 左拉,拉右,上拉和下拉命令完成。 但是,我认为最重要的部分是,当没有空间生成新的随机数并拉出数字时,终止程序。 此外,当没有空间组合相同的号码而没有空间来拉动数字时,我无法让游戏板不生成新号码。
这是我的代码
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
if (gen_num == 0) {
row = rand() % 4;
column = rand() % 4;
if (board[row][column] == 0) {
board[row][column] = ((rand() % 2) + 1) * 2;
}
}
}
valid_move = 0;
gen_num = 0;
cmd = read_command();
if (cmd == 1){
pull_left(board);
}
if (cmd == 2){
pull_right(board);
}
if (cmd == 3){
pull_up(board);
}
if (cmd == 4){
pull_down(board);
}
if (cmd == 5){
printf("bye :(\n");
exit(0);
}
if (cmd < 1 || cmd>5){
printf("[error] command is between 1 and 5\n\n");
}
for (i = 0; i < 4; i++){
for (j = 0; j < 4; j++){
if (board[i][j] == check_move[i][j])
valid_move++;
}
}
printf("Valid_move = %d\n\n", valid_move);
if (valid_move >= 15){
printf("[Error] Invalid direction!!!\n\n");
gen_num = 1;
}
pull_up,pull_down,pull_left,pull_right是我在主函数之前设置的函数
答案 0 :(得分:1)
您的代码并不完整,但从外观来看,您可能最终根本没有铺设新的瓷砖,特别是如果电路板已经非常拥挤。只要您的位置无效,您就应该尝试随机放置磁贴。
当然,如果没有任何有效位置,你会反复尝试而不会成功,所以你应该测试电路板是否已满,即是否所有瓷砖都是非零的。
您可以组合使用新瓷砖并检查电路板是否已满。不是反复探测电路板,而是创建有效磁贴列表,然后选择一个。如果有效磁贴列表为空,则结束游戏。
执行此操作的功能可能看起来很喜欢:
int place_tile()
{
int pos[16];
int npos = 0;
int i, j, p;
for (i = 0; i < 4; i++) {
for (j = 0; j < 4; j++) {
if (board[j][i] == 0) pos[npos++] = j*4 + i;
}
}
if (npos == 0) return 0; // no more space
p = pos[rand() % npos];
j = p / 4;
i = p % 4;
board[j][i] = (rand() % 2) ? 2 : 4;
return 1;
}
返回值表示图块是否已成功放置(1)或未放置(0)。