inverti e modifiquei os condicionadores para em vez de estarem no começo englobarem todo o código e só executarem caso o espaço esteja vazio ou com o personagem... Pelos meus testes deu certo, ficou assim:
case 0:
if ((tabuleiro[i][j-1] == 0 || tabuleiro[i][j-1] == 1) && (j-1) >= 0 ){
if (tabuleiro[i][j-1] == 1){
if (arma > 0){
printf("\n Matou um zumbi!!!\n\n");
arma--;
}
else if (arma == 0){
printf("\n Um Zumbi pegou voce, fim de jogo\n\n morreu!");
cabo = 1;
}
}
tabuleiro[i][j] = 0;
j = j - 1;
tabuleiro[i][j] = 2;
break;
}
case 1:
if ((tabuleiro[i][j+1] == 0 || tabuleiro[i][j+1] == 1) && (j+1) <= 9 ){
if (tabuleiro[i][j+1] == 1){
if (arma > 0){
printf("\n Matou um zumbi!!!\n\n");
arma--;
}
else if (arma == 0){
printf("\n Um Zumbi pegou voce, fim de jogo\n\n morreu!");
cabo = 1;
}
}
tabuleiro[i][j] = 0;
j = j + 1;
tabuleiro[i][j] = 2;
break;
}
case 2:
if ((tabuleiro[i+1][j] == 0 || tabuleiro[i+1][j] == 1) && (i+1) <= 9 ){
if (tabuleiro[i+1][j] == 1){
if (arma > 0){
printf("\n Matou um zumbi!!!\n\n");
arma--;
}
else if (arma == 0){
printf("\n Um Zumbi pegou voce, fim de jogo\n\n morreu!");
cabo = 1;
}
}
tabuleiro[i][j] = 0;
i = i + 1;
tabuleiro[i][j] = 2;
break;
}
case 3:
if ((tabuleiro[i-1][j] == 0 || tabuleiro[i-1][j] == 1) && (i-1) >= 0 ){
if (tabuleiro[i-1][j] == 1){
if (arma > 0){
printf("\n Matou um zumbi!!!\n\n");
arma--;
}
else if (arma == 0){
printf("\n Um Zumbi pegou voce, fim de jogo\n\n morreu!");
cabo = 1;
}
}
tabuleiro[i][j] = 0;
i = i - 1;
tabuleiro[i][j] = 2;
break;
}