Ir ao conteúdo
  • Cadastre-se
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;
}


 

  • 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.

  • 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;
}

 

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

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar agora





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

×