code implementation

0

I and a colleague are newcomers to programming and we are building a game where we need to use threaded list. He was responsible for creating a game menu using threaded list and I for creating the game. So now we need to merge the codes and it turns out we're not getting it.

I need a mega help from you to know how I can make the game behave as follows. In the Menu created the user will enter the words in the list using option 1, after the words are entered the user enters option 4 and the game makes a Random of the inserted words and puts in the game to be discovered.

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
struct no
{
char info[15];
struct no*prox;
};
typedef struct no Lista;
void jogo() { 
char palavra[25],letra[25],lacuna[25]; 
int vida=6,x=0,i,u,total=0,cont=0; 


printf("                    ******************************");
printf("\n                            JOGO DA FORCA \n");
printf("                    ******************************\n");

printf("\n                             BOM JOGO\n\n");

printf("\nDIGITE A PALAVRA E TECLE ENTER PARA CONTINUAR");
printf("\n\nPALAVRA: ");

gets(palavra); 
fflush(stdin);

system("cls");

for(i=0;i<strlen(palavra);i++) 
{ 
lacuna[i]='X'; 
total++;
cont++;
} 

while(vida>0) 
{ 

printf("\nA PALAVRA COMTEM %i LETRAS\n",total);
printf("\nLETRAS RESTANTES: %i\n",cont);


printf("\n%s\n",lacuna); 
printf("\nENTRE COM UMA LETRA: "); 
gets(letra); 
system("cls");

for(i=0;i<strlen(palavra);i++) 
{ 
for(u=0;u<strlen(palavra);u++){
if(letra[u]==palavra[i]) 
{ 
lacuna[i]=palavra[i]; 
x++; 
cont--;
}
} 
} 

if(cont==0){
printf("PARABENS! VOCE VENCEU!");   
printf("\nACERTOU A PALAVRA %s", palavra);
}

if(x==0) 
{ 
vida--; 
printf("\nVOCE PERDEU UMA VIDA!\nVOCE TEM %d VIDA(S) 
RESTANTES\n\n",vida); 

} 
 x = 0;
}

printf("\n\nVC FOI ENFORCADO, Fim de jogo!\n\n\nPALAVRA SECRETA: 
%s",palavra);

printf("\n\n***********************\n\n");
printf("* JOGO DA FORCA *\n\n");
printf(" ___ \n");
printf(" | | \n");
printf(" | O  \n");
printf(" |/|\ \n");
printf(" | |  \n");
printf(" |/ \  \n");
printf(" |______ \n");
printf("\n**********************\n");

getchar(); 
getchar(); 
}
void cria (Lista **L)
{
*L=NULL;
}
void Ins_Inicio (Lista **L, char v[15])
{
Lista *p = (Lista *) calloc (1, sizeof(Lista));
 strcpy(p->info, v); 
p->prox=*L;
*L = p;
}
void imprime (Lista *L)
{
Lista*p;
p=L;
while (p != NULL)
{
printf("%s-->", p->info);
p=p->prox;
}
printf("NULL\n");
}
void jogar (Lista *L)
{
int num, total_nos=0;
Lista *p;
 p=L;
while (p!=NULL)
{
total_nos++;
p=p->prox;
}

int rand();
num = rand()+ (total_nos)+1;
while (p != NULL)
{ 
}}
main()
{
char palavra[25],letra[25],lacuna[25]; 
int vida=6,x,i; 

 Lista *L;
 int op, ret, fim;
 char val[15];
 cria(&L); 
 do 
 {
 int clrscr();
puts("1 - Insere palavras no INICIO da lista");
puts("2 - Remove palavras da lista");
puts("3 - IMPRIMIR a lista");
puts("4 - Jogar");
puts("5 - Sair");
puts("\nDigite a opcao desejada");
scanf("%d", &op);

switch(op)
{
case 1: puts("Digite o valor a ser inserido:");
    fflush(stdin);
    gets(val);
    Ins_Inicio(&L,val);
    break;

case 2: puts("Digite o valor a ser removido");
    fflush(stdin);  
    gets(val);

    break;
case 3: imprime(L);
    getch();
    break;
case 4: jogar(L);
    jogo();
    break;
}
}
while(op!=5);
 }
    
asked by anonymous 13.06.2017 / 01:55

2 answers

0

In your case, you have put your whole code in main , which is functional, but it is wrong. To join the 2 codes, you can create a method in your friend's code with your entire code and call it from switch .

switch(op)
{
case 1: puts("Digite o valor a ser inserido:");
    fflush(stdin);
    gets(val);
    Ins_Inicio(&L,val);
    break;
case 2: puts("Digite o valor a ser removido");
    fflush(stdin);  
    gets(val);
    break;
case 3: imprime(L);
    getch();
    break;
case 4: jogar(L);
    jogo(); //Aqui seria onde você chamaria o seu método.
    break;
}

To get a random word that is in the struct, you can use rand() like this:

Lista L; 
pergunta = rand() % sizeof(L.info);

If you find it difficult to do so, comment below that I can help you.

EDIT: Code ready below. (It's disorganized because I got yours as your base.)

#include <stdio.h>
#include <stdlib.h>
#include <conio.h>
#include <string.h>
#include <time.h>
struct no
{
char info[15];
struct no*prox;
};
typedef struct no Lista;
void jogo() { 
char palavra[25],letra[25],lacuna[25]; 
int vida=6,x=0,i,u,total=0,cont=0; 


printf("                    ******************************");
printf("\n                            JOGO DA FORCA \n");
printf("                    ******************************\n");

printf("\n                             BOM JOGO\n\n");

printf("\nDIGITE A PALAVRA E TECLE ENTER PARA CONTINUAR");
printf("\n\nPALAVRA: ");

gets(palavra); 
fflush(stdin);

system("cls");

for(i=0;i<strlen(palavra);i++) 
{ 
lacuna[i]='X'; 
total++;
cont++;
 } 

while(vida>0) 
{ 

printf("\nA PALAVRA COMTEM %i LETRAS\n",total);
printf("\nLETRAS RESTANTES: %i\n",cont);


printf("\n%s\n",lacuna); 
printf("\nENTRE COM UMA LETRA: "); 
gets(letra); 
system("cls");

for(i=0;i<strlen(palavra);i++) 
{ 
for(u=0;u<strlen(palavra);u++){
if(letra[u]==palavra[i]) 
{ 
lacuna[i]=palavra[i]; 
x++; 
cont--;
}
} 
} 

if(cont==0){
printf("PARABENS! VOCE VENCEU!");   
printf("\nACERTOU A PALAVRA %s", palavra);
}

if(x==0) 
{ 
vida--; 
printf("\nVOCE PERDEU UMA VIDA!\nVOCE TEM %d VIDA(S) 
RESTANTES\n\n",vida); 

} 
 x = 0;
}

  printf("\n\nVC FOI ENFORCADO, Fim de jogo!\n\n\nPALAVRA SECRETA: 
%s",palavra);

  printf("\n\n***********************\n\n");
  printf("* JOGO DA FORCA *\n\n");
  printf(" ___ \n");
  printf(" | | \n");
  printf(" | O  \n");
  printf(" |/|\ \n");
  printf(" | |  \n");
  printf(" |/ \  \n");
  printf(" |______ \n");
  printf("\n**********************\n");

  getchar(); 
  getchar(); 
  }
void cria (Lista **L)
{
*L=NULL;
}
void Ins_Inicio (Lista **L, char v[15])
{
Lista *p = (Lista *) calloc (1, sizeof(Lista));
strcpy(p->info, v); 
p->prox=*L;
*L = p;
}
void imprime (Lista *L)
{
Lista*p;
p=L;
while (p != NULL)
{
    printf("%s-->", p->info);
    p=p->prox;
}
printf("NULL\n");
}
void jogar (Lista *L)
{
int num, total_nos=0;
Lista *p;
p=L;
while (p!=NULL)
{
  total_nos++;
  p=p->prox;
}

  int rand();
  num = rand()+ (total_nos)+1;
 while (p != NULL)
 { 
 }}
main()
{
char palavra[25],letra[25],lacuna[25]; 
int vida=6,x,i; 

 Lista *L;
 int op, ret, fim;
 char val[15];
 cria(&L); 
 do
{
int clrscr();
    puts("1 - Insere palavras no INICIO da lista");
    puts("2 - Remove palavras da lista");
    puts("3 - IMPRIMIR a lista");
    puts("4 - Jogar");
    puts("5 - Sair");
    puts("\nDigite a opcao desejada");
    scanf("%d", &op);

    switch(op)
    {
    case 1: puts("Digite o valor a ser inserido:");
        fflush(stdin);
        gets(val);
        Ins_Inicio(&L,val);
        break;

    case 2: puts("Digite o valor a ser removido");
        fflush(stdin);  
        gets(val);

        break;
    case 3: imprime(L);
        getch();
        break;
    case 4: jogar(L);
        jogo();
        break;
    }
}
while(op!=5);
}
    
13.06.2017 / 02:08
0

The most important thing when creating a program in parts, each part by a different person, as you are doing, is to establish between you what will be the interface between the code of the two: this is, as the code of one will communicate with the code of the other.

In this case, your colleague made a menu that will start the game and deal with the word list (register, delete, and print) while you were responsible for the game itself. So the only thing you need it is the word to use, and it does not need anything from you. So I suggest that it call a jogar() function by passing the chosen word as a parameter and getting void , that is, nothing:

void
jogar(char palavra[TAM_MAX_PALAVRA]);

You implement the jogar() function and it calls it at the correct time there in option 4.

Note that I put in the vector size that the jogar() gets the identifier TAM_MAX_PALAVRA , instead of 15 or 25. This is a preprocessor constant (which we'll define below) that lets you ensure that all parts that need to deal with words will handle the same vector size, vectors of size TAM_MAX_PALAVRA . The definition of it is:

#define TAM_MAX_PALAVRA 25

To make your interface look like this, we get the two definitions above and put it in a file called jogo.h , your header file for the game:

#ifndef DEFINI_JOGO_H
#define DEFINI_JOGO_H

#define TAM_MAX_PALAVRA 25
extern void
jogar(char palavra[TAM_MAX_PALAVRA]);

#endif

Let's get your coworker's code and put it in the file menu.c :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <time.h>
#include "jogo.h"

/* Tipos de dados */

struct no {
    char info[TAM_MAX_PALAVRA];
    struct no * prox;
};

typedef struct no Lista;

/* Funções de manipulação de listas encadeadas */

void
Ins_Inicio(Lista **L, char v[TAM_MAX_PALAVRA]) {
    Lista *p = calloc(1, sizeof(Lista));
    strcpy(p->info, v); 
    p->prox = *L;
    *L = p;
}

void
imprime (Lista *L) {
    Lista *p;
    p = L;
    while (p != NULL) {
        printf("%s-->", p->info);
        p = p->prox;
    }
}

void
apagar(Lista ** L, char chave[TAM_MAX_PALAVRA]) {
    printf("TODO: me implemente\n");
}

char *
escolher_palavra_ao_acaso(Lista * L) {
   /* a implementação será feita abaixo */
}

/* funções para tratar do menu */

int
menu() {
    int resultado;
    clrscr();
    puts(
        " *****************\n"
        " * JOGO DA FORCA *\n"
        " *****************\n\n"
        "1 - Insere palavras no INICIO da lista"\n"
        "2 - Remove palavras da lista\n"
        "3 - IMPRIMIR a lista\n"
        "4 - Jogar\n"
        "5 - Sair\n\n"
        "Digite a opcao desejada"
    );
    while (scanf("%d", &resultado) < 1) {
        puts("Não entendi");
    }
    return resultado;
}

int
main(void) {
    int opcao = 0;
    Lista * L;
    char val[TAM_MAX_PALAVRA];

    srand(time(NULL));
    do {
        opcao = menu();
        switch (opcao) {
            case 1:
                puts("Digite o valor a ser inserido:");
                fflush(stdin);
                fgets(val, TAM_MAX_PALAVRA, stdin);
                Ins_Inicio(&L,val);
                break;
            case 2:
                puts("Digite o valor a ser removido");
                fflush(stdin);  
                fgets(val, TAM_MAX_PALAVRA, stdin);
                apagar(&L,val);
                break;
            case 3:
                imprime(L);
                break;
            case 4:
                jogar(escolher_palavra_ao_acaso(L));
                break;
            case 5:
                puts("Saindo...");
                break;
            default:
                puts("Opção inválida");
                break;
        }
    } while (opcao != 5);

    return 0;
}

As you can see, the jogo.h file was included using quotes, not less-than and greater-than, so the compiler looks for the file in the same directory as the .ce files, not in the directory where% colleagues. We also break the larger functions into smaller ones with descriptive names: for example, it has a stdio.h that shows the menu, receives the option and the delivery as a return value so that menu() does not have to worry about it; and main() receives a word that jogar() will receive.

We will then implement escolher_palavra_ao_acaso() :

char *
escolher_palavra_ao_acaso(Lista * L) {
    int num_palavras = 0, i = 0;
    Lista * p;

    /* Contar o número de palavras atual */
    for (p = L; p != NULL; num_palavras ++, p = p->prox);
    /* n vai receber um número aleatório entre 0 e num_palavras - 1 */
    n = rand() % num_palavras;
    /* começando do princípio da lista, andar n passos */
    for (p = L; n > 0; n --, p = p->prox);

    return n->info;
}

As for the game, you create another escolher_palavra_ao_acaso() file to test your development:

#include <stdio.h>
#include <stdlib.h>
#include "jogo.h"

int
main(void) {
    jogar("itaquaquecetuba");
}

And finally the implementation of the routine teste.c in jogar() :

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <conio.h>
#include "jogo.h"

/* uma struct para guardar todas as informações sobre o estado do jogo */
struct estado {
    char * palavra;
    int tam_palavra;
    char lacunas[TAM_MAX_PALAVRA];
    int vidas;
    int faltam;
};

int
testar_letra(struct estado * e, char c) {
    int i;
    int resultado = 0;

    /* transforma letras maiúsculas em minúsculas */
    if (c >='A' && c <='Z') c -= 32;
    /* verifica se é uma letra válida*/
    if (c < 'a' || c > 'z') return resultado;
    /* procura por c em palavra; onde houver, preenche a lacuna correspondente */
    for (i = 0; i < e->tam_palavra; i ++) {
        if (e->palavra[i] == c) {
            resultado = 1;
            faltam --;
            e->lacunas[i] = e->palavra[i];
        }
    }

    return resultado;
}

void
jogar(char * palavra) {
    int i;
    struct estado e;
    char c;

    /* inicializa o estado do jogo */
    e.palavra = palavra;
    e.vidas = 6;
    e.faltam = e.tam_palavra = strlen(palavra);
    for (i = 0; i < e.tam_palavra; i ++)
        e.lacunas[i] = 'X';
    e.lacunas[i] = '
void
jogar(char palavra[TAM_MAX_PALAVRA]);
'; clrscr(); while (e.vidas > 0) { printf("\nA PALAVRA COMTEM %d LETRAS\n" "\nLETRAS RESTANTES: %d\n",e.tam_palavra, e.faltam); printf("\n%s\n", e.lacunas); printf("\nENTRE COM UMA LETRA: "); /* limpa o buffer */ fflush(stdin); c = getchar(); if (! testa_letra(&e, c)) { e.vidas--; printf("\nVOCE PERDEU UMA VIDA!\n" "VOCE TEM %d VIDA(S) RESTANTES\n\n",vida); if (e.vidas == 0) { printf("\n\n" "VC FOI ENFORCADO, Fim de jogo!" "\n\n\n" "PALAVRA SECRETA: %s",palavra); printf("\n\n***********************\n\n" "* JOGO DA FORCA *\n\n" " ___ \n" " | | \n" " | O \n" " |/|\ \n" " | | \n" " |/ \ \n" " |______ \n" "\n**********************\n"); return; } } else if (e.faltam == 0) { printf("PARABENS! VOCE VENCEU!" "\nACERTOU A PALAVRA %s", palavra); return; } } }

Then, when compiling the game, you compile the two modules jogo.c and jogo.c together. Since you should be using an IDE, you have no need to comment on command line options, but it's super simple. Compile menu.c and jogo.c for the whole game, or menu.c and jogo.c to test only its part.

    
13.06.2017 / 23:21