Você primeiro precisa entender a estrutura de loop while() em c.
O while em c, funciona da seguinte forma:
while == enquanto
(Condition) == Condição a ser verificada
No while em c tem como parâmetros uma condição que, se for verdadeiro a condição o código dentro das -> {} será executado em loop até que essa condição seja falsa;
No c um numero <= 0 é igual a falso e qualquer numero > 0 é igual à verdadeiro. EX:
while(1){} // verdadeiro, vai executar infinitamente
while(0){} // falso, nâo vai executar nenhuma vez
Agora se eu colocar antes da condição um '!', significa que eu estou invertendo os valores, EX:
while(!1){} // falso, nâo vai executar nenhuma vez
while(!0){} // verdadeiro, vai executar infinitamente
No seu código a variável acertou
começa com 0, ou seja começa como falso, então o loop nunca vai começar por isso do ! para negar a condição, assim interpretando como verdadeira.
Eu refatorei o codigo de uma forma que explica melhor:
#include <stdbool.h> // Biblioteca que permite a utilização do "true" e "false" para melhor leitura, porém continua sendo uns e zeros.
#include <stdio.h>
int main() {
printf("BEM VINDO AO JOGO DA ADIVINHACAO\n");
int nsecreto = 23;
int chute = 0;
int nao_acertou = true; // Enquanto não acertou continuara como verdadeiro, pois a verdade é que o jogador não acertou ainda.
int tent = 0;
while (nao_acertou) {
tent++;
printf("Qual nsecreto?\n");
scanf("%d", &chute);
if (chute < 0) {
printf("valor invalido, tente novamente\n");
tent--;
} else if (chute == nsecreto) {
nao_acertou = false; // Aqui o jogador acertou ou seja essa variavel vai ser uma mentira/falsa a partir de agora.
printf("PARABENS VOCE ACERTOU\n");
} else if (chute < nsecreto) {
printf("chute é menor que o numero secreto\n");
} else {
printf("Chute é maior que numero secreto\n");
}
}
printf("\n\tNumero de tentativas igual a %d\n", tent);
}
DICAS:
Recomendo dar uma olhada na tabela verdade.
Um exemplo desse mesmo jogo para vocẽ ter como referencia:
Jogo_da_adivinhação
Ultima dica, começa a preocupar com identação, pois isso vai ajudar quem ler o código e você quando estiver codando.