Ir ao conteúdo
  • Comunicados

    • Gabriel Torres

      Seja um moderador do Clube do Hardware!   12-02-2016

      Prezados membros do Clube do Hardware, Está aberto o processo de seleção de novos moderadores para diversos setores ou áreas do Clube do Hardware. Os requisitos são:   Pelo menos 500 posts e um ano de cadastro; Boa frequência de participação; Ser respeitoso, cordial e educado com os demais membros; Ter bom nível de português; Ter razoável conhecimento da área em que pretende atuar; Saber trabalhar em equipe (com os moderadores, coordenadores e administradores).   Os interessados deverão enviar uma mensagem privada para o usuário @Equipe Clube do Hardware com o título "Candidato a moderador". A mensagem deverá conter respostas às perguntas abaixo:   Qual o seu nome completo? Qual sua data de nascimento? Qual sua formação/profissão? Já atuou como moderador em algo outro fórum, se sim, qual? De forma sucinta, explique o porquê de querer ser moderador do fórum e conte-nos um pouco sobre você.   OBS: Não se trata de função remunerada. Todos que fazem parte do staff são voluntários.
    • DiF

      Poste seus códigos corretamente!   21-05-2016

      Prezados membros do Fórum do Clube do Hardware, O Fórum oferece um recurso chamado CODE, onde o ícone no painel do editor é  <>     O uso deste recurso é  imprescindível para uma melhor leitura, manter a organização, diferenciar de texto comum e principalmente evitar que os compiladores e IDEs acusem erro ao colar um código copiado daqui. Portanto convido-lhes para ler as instruções de como usar este recurso CODE neste tópico:  
aquafoxbr

C Contar score/pontuação de um jogo em C?

Recommended Posts

E aí, pessoal? Beleza? Sou iniciante em C e tô tendo que fazer um trabalho. O trabalho é o seguinte: faça um jogo no estilo pac-man, onde os ''x'' sao obstáculos, os ''-'' são os espaços livres no mapa e os ''T'' são os objetivos. Você é a bolinha ''O''. Minha intenção é a seguinte: a cada vez que o jogador coletar o T, contar o  score. Sei que é conveniente usar um contador, definindo-o como 0 no início e fazendo ''contador++'' a cada T coletado. O único problema é: não sei onde colocar esse contador. Alguém me ajuda? Aqui segue o jogo:

 

#include <stdio.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>



int ibol, jbol;



char** criarMatriz(int lin, int col){
    char** m;
    int i;
    m = (char **)malloc(lin * sizeof(char *));
        for(i=0;i<lin;i++){
        m = (char*)malloc(col * sizeof(char));
        }
    return m;
}

 

void preencherMatriz(char **mat, int lin, int col){
    int i, j;
        for(i=0;i<lin;i++){
            for(j=0;j<col;j++){
            mat[j] = '-';
            }
        }
    mat[lin/2][col/2] = 'O';
    ibol = lin / 2;
    jbol = col / 2;
}

 

void addobstaculos (char** m, int lin, int col, int obst){
    int k, i, j;
        for(k=0;k<obst;k++){
        do{
        i = rand () % lin;
        j = rand () % col;
        }while(m[j] == 'X' || ((i==lin/2) && (j == col/2)));
        m[j] = 'X';
        }
}

 

void addobjetivo(char** m, int lin, int col){
    int i, j;
        do{
        i = rand () % lin;
        j = rand () % col;
        }while((m[j] == 'X') || (m[j] == 'O') || (m[j] == 'T'));
        m[j] = 'T';
}

 

void imprimirmatriz(char** mat, int lin, int col){
    int i, j;
    for(i=0;i<lin;i++){
        for(j=0;j<col;j++){
        printf("%c ", mat[j]);
        }
    printf("\n");
    }
}

 

int letravalida(char op){
if(op == 'w'){
    return 1;
}
if(op == 'a'){
    return 1;
}
if(op == 's'){
    return 1;
}
if(op == 'd'){
    return 1;
}
if(op == 'W'){
    return 1;
}
if(op == 'A'){
    return 1;
}
if(op == 'S'){
    return 1;
}
if(op == 'D'){
    return 1;
}
 return 0;
}

 

int aplicamovimento(char** mat,int lin,int col,char op){
        if((op == 'w') || (op == 'W')){
        if(ibol == 0){
            return 0;
        }
        if(mat[ibol-1][jbol] == 'X'){
            return 0;
        }
        if(mat[ibol-1][jbol] == 'T'){
            addobjetivo(mat,lin,col);
        }
        mat[ibol-1][jbol] = 'O';
        mat[ibol][jbol] = '-';
        ibol--;
        return 1;
    }
   if((op == 's') || (op == 'S')){
       if(ibol == 19){
        return 0;
       }
       if(mat[ibol+1][jbol] == 'X'){
            return 0;
       }
       if(mat[ibol+1][jbol] == 'T'){
        addobjetivo(mat,lin,col);
       }
       mat[ibol+1][jbol] = 'O';
       mat[ibol][jbol] = '-';
       ibol++;
       return 1;
   }
      if((op == 'a') || (op == 'A')){
       if(jbol == 0){
            return 0;
       }
       if(mat[ibol][jbol-1] == 'X'){
            return 0;
       }
       if(mat[ibol][jbol-1] == 'T'){
        addobjetivo(mat,lin,col);
       }
       mat[ibol][jbol-1] = 'O';
       mat[ibol][jbol] = '-';
       jbol--;
       return 1;
   }
   if((op == 'd') || (op == 'D')){
       if(jbol == 19){
            return 0;
      }
      if(mat[ibol][jbol+1] == 'X'){
            return 0;
      }
      if(mat[ibol][jbol+1] == 'T'){
        addobjetivo(mat,lin,col);
      }
       mat[ibol][jbol+1] = 'O';
       mat[ibol][jbol] = '-';
       jbol++;
       return 1;
   }
}

 

int main(){
    char **mat, op, lixo, m, contagemt;
    int lin=20, col=20, escolha;
    srand(time(NULL));
    printf("SEJA BEM-VINDO AO POC-MON\n\n\n");
    printf("    MENU INICIAL\n");
    printf("          1. Novo jogo\n");
    printf("          2. Visualizar ultimas jogadas\n");
    printf("          3. Sair\n");
    scanf("%d", &escolha);
    scanf("%c", &lixo);
    if(escolha == 1){
    mat = criarMatriz(lin,col);
    preencherMatriz(mat, lin, col);
    addobstaculos(mat, lin, col,10);
    addobjetivo (mat, lin, col);
    imprimirmatriz(mat, lin, col);
    while(1){
        printf("info movimento: ");
        scanf("%c", &op);
        scanf("%c", &lixo);
        if(letravalida(op)){
            if(aplicamovimento (mat, lin, col, op)){
                imprimirmatriz(mat, lin, col);
            }else{
                printf("Movimento invalido\n");
            }
        }else{
            printf("letra invalida\n");
        }
    }
    }else{
        if(escolha == 3){
            exit(1);
        }
}
return 0;
}


 

Editado por aquafoxbr
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

Se liga que em várias funções você acessa m[j] e se esquece da linha (i).

 

Outra coisa:

		// em vez de:
		scanf("%c", &op);
		scanf("%c", &lixo);
		// use:
		scanf(" %c", &op);
		// o espaço antes já remove alguns caracteres indesejados (espaço, \n, tab etc)
		// o mesmo se aplica pro outro scanf com "%d", que ficaria " %d"

Agora pra sua dúvida. Tem várias formas de fazer isso, mas acho que - fora manter uma variável global - a mais fácil (não necessariamente a mais correta) seria criar o contador score no main e passar ele pra função aplicamovimento:

// em vez de
int aplicamovimento(char** mat,int lin,int col,char op){
// ficaria:
int aplicamovimento(char** mat,int lin,int col,char op,int* score){
  
// no main:
int score = 0;
// ...
// em vez de:
  if(aplicamovimento (mat, lin, col, op)){
// ficaria:
if(aplicamovimento (mat, lin, col, op, &score)){

E aí os score++ ficam em:

	// aqui e em todos os outros if pro 'T'
	if(mat[ibol][jbol+1] == 'T'){
		(*score)++;
		addobjetivo(mat,lin,col);
	}

Dúvidas pergunte.

Editado por RafaelCLP
  • Curtir 1

Compartilhar este post


Link para o post
Compartilhar em outros sites

@aquafoxbr    seu código está bom, mas ficou faltando colocar uma das dimensões da matriz mat, você colocou só a posição j e esqueceu da i , então apenas coloquei esses dados que faltavam , e seu código ficou assim :

#include <stdio.h>
#include <windows.h>
#include <stdlib.h>
#include <time.h>
#include <math.h>

int ibol, jbol,pts;
void gotoxy(int x, int y){
    COORD c;
    c.X = x;
    c.Y = y;
    SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE),c);
}
char** criarMatriz(int lin, int col){
    char** m;
    int i;
    m = (char **)malloc(lin * sizeof(char *));
    for(i=0;i<lin;i++){
        m[i] = (char*)malloc(col * sizeof(char*));
    }
    return m;
}

void preencherMatriz(char **mat, int lin, int col){
    int i, j;
    for(i=0;i<lin;i++){
        for(j=0;j<col;j++){
            mat[i][j] = '-';/*faltou o [ i ]*/
        }
    }
    mat[lin/2][col/2] = 'O';
    ibol = lin / 2;
    jbol = col / 2;
}

void addobstaculos (char **m, int lin, int col, int obst){
    int k, i, j;
    for(k=0;k<obst;k++){
        i = rand () % lin;
        j = rand () % col;
        m[i][j] = 'X';
    }
}

void addobjetivo(char **m, int lin, int col){
    int i, j;
    i = rand () % lin;
    j = rand () % col;
    m[i][j] = 'T';
}

void imprimirmatriz(char **mat, int lin, int col){
    int i,j;
    gotoxy(0,0);
    printf("Tecle W - S - A - D ou As Setas Direcionais\n");
    printf("Tecle ESC Para Sair\n\n");
    for(i=0;i<lin;i++){
        for(j=0;j<col;j++){
            printf("%c ", mat[i][j]);/*faltou o [i]*/
        }
    printf("\n");
    }
}

int letravalida(char op){
    char op2;
    op2=toupper(op);
    if(op2=='W'||op2=='A'||op2=='S'||op2=='D')return 1;
    return 0;
}

int aplicamovimento(char** mat,int lin,int col,char op){
    char op2;
    op2=toupper(op);
    if(op2 == 'W'){
        if(ibol == 0){
            return 0;
        }
        if(mat[ibol-1][jbol] == 'X'){
            return 0;
        }
        if(mat[ibol-1][jbol] == 'T'){
            addobjetivo(mat,lin,col);
            pts++;
        }
        mat[ibol-1][jbol] = 'O';
        mat[ibol][jbol] = '-';
        ibol--;
        return 1;
    }
    if(op2 == 'S'){
        if(ibol == 19){
            return 0;
        }
        if(mat[ibol+1][jbol] == 'X'){
            return 0;
        }
        if(mat[ibol+1][jbol] == 'T'){
            addobjetivo(mat,lin,col);
            pts++;
        }
        mat[ibol+1][jbol] = 'O';
        mat[ibol][jbol] = '-';
        ibol++;
        return 1;
    }
    if(op2 == 'A'){
        if(jbol == 0){
            return 0;
        }
        if(mat[ibol][jbol-1] == 'X'){
            return 0;
        }
        if(mat[ibol][jbol-1] == 'T'){
            addobjetivo(mat,lin,col);
            pts++;
        }
        mat[ibol][jbol-1] = 'O';
        mat[ibol][jbol] = '-';
        jbol--;
        return 1;
    }
    if(op2 == 'D'){
        if(jbol == 19){
            return 0;
        }
        if(mat[ibol][jbol+1] == 'X'){
            return 0;
        }
        if(mat[ibol][jbol+1] == 'T'){
            addobjetivo(mat,lin,col);
            pts++;
        }
        mat[ibol][jbol+1] = 'O';
        mat[ibol][jbol] = '-';
        jbol++;
        return 1;
    }
}

int main(){
    char **mat, op, lixo, m, contagemt;
    int lin=20, col=20,a,escolha;
    srand(time(NULL));
    printf("SEJA BEM-VINDO AO POC-MON\n\n\n");
    printf("    MENU INICIAL\n");
    printf("          1. Novo jogo\n");
    printf("          2. Visualizar ultimas jogadas\n");
    printf("          3. Sair\n");
    fflush(stdin);
    scanf("%d", &escolha);
    if(escolha == 1){
        system("cls");
        mat = criarMatriz(lin,col);
        preencherMatriz(mat, lin, col);
        addobstaculos(mat, lin, col,10);
        addobjetivo (mat, lin, col);
        imprimirmatriz(mat, lin, col);
        while(op != 'z'){
            /*printf("info movimento:");*/
            /*fflush(stdin);*/
            /*scanf(" %c",&op);*/
            gotoxy(50,10);
            printf("Pontos --> %d",pts);
            gotoxy(10,23);
            a=0;op='p';
            if(kbhit())a=getch();if(a==224)a=getch();
            if(a==119      || a==87 || a==72)op='w';/*72 seta p/cima*/
            else if(a==115 || a==83 || a==80)op='s';/*80 seta p/baixo*/
            else if(a==97  || a==65 || a==75)op='a';/*75 seta p/direita*/
            else if(a==100 || a==68 || a==77)op='d';/*77 seta p/esquerda*/
            else if(a==27                   )op='z';/*27 Tecla ESC */
            Sleep(10);
            if(op=='s'||op=='w'||op=='a'||op=='d'){
                if(letravalida(op)){
                    if(aplicamovimento (mat, lin, col, op)){
                        imprimirmatriz(mat, lin, col);
                    }
                    else{
                        gotoxy(0,23);
                        printf("Movimento invalido\n");
                        Sleep(500);
                        gotoxy(0,23);
                        printf("                   ");
                    }
                }
            }
            else{
                if(a!=0&&a!=72&&a!=80&&a!=75&&a!=77&&a!=27){
                    gotoxy(0,23);
                    printf("letra invalida\n");
                    Sleep(500);
                    gotoxy(0,23);
                    printf("               ");
                }
            }
        }
    }
    else{
        if(escolha == 3){
            exit(1);
        }
    }
    return 0;
}

 

Editado por devair1010

Compartilhar este post


Link para o post
Compartilhar em outros sites

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário






Sobre o Clube do Hardware

No ar desde 1996, o Clube do Hardware é uma das maiores, mais antigas e mais respeitadas publicações sobre tecnologia do Brasil. Leia mais

Direitos autorais

Não permitimos a cópia ou reprodução do conteúdo do nosso site, fórum, newsletters e redes sociais, mesmo citando-se a fonte. Leia mais

×