Skip to content
cbestevez edited this page May 29, 2020 · 19 revisions

Bienvenidos a la wiki de twE105_1920-game_of_codes!

  • Explicación general del trabajo

En este trabajo realizamos un programa que permite entretener al usuario con distintos juegos, entre algunos de los juegos podemos encontrar Adivina el numero, 3 en raya, Héroes , Preguntados y buscaminas. El trabajo se compone de tres librerias, main.c , GameOfCodes.c y GameOfCode.h. Todas se encuentran en un proyecto llamado Game_Of _Codes.

  • Las funcionalidades de este programa.

1. Introducir datos:

Al iniciar el programa el encargado de la sala le pedirá que introduzca sus datos( Cuantos vais a jugar, los nombres y apellidos de las personas que van a jugar , la edad y el sexo.

2. Menú:

Una vez compilado e iniciado el programa, el usuario podrá observar un menú donde tendrá la opción de escoger el juego que desea, también tendrá la opción de cerrar el programa.

3. Selección del juego:

Dependiendo con que quiera recrearse , el usuario elige el tipo de juego.

Adivina el número:

Si es seleccionada esta opción, debe de seguir las instrucciones que le da el programa. Una vez finalizada la partida, el programa le dará la opción al usuario de volver a jugar o volver al menú principal.

Tres en raya:

Si es seleccionada esta opción, va a tener que escoger como desea jugarlo, uno contra uno, contra el ordenador. Al seleccionar el modo de juego, debe de seguir las instrucciones que le da el programa. Una vez finalizada la partida, el programa le dará la opción al usuario de volver a jugar o volver al menú principal.

Héroes:

Si es seleccionada esta opción, el usuario tendrá la opción de escoger con que héroe va a luchar entre algunas opciones están el Clasico, Fortachon, Curandera o Mago. Al seleccionar el luchador, debe de seguir las instrucciones que le da el programa. Una vez finalizado el ejercicio, el programa le dará la opción al usuario de volver a otra batalla o volver al menú principal.

Buscaminas:

Si es seleccionada esta opción, debe de seguir las instrucciones que le da el programa. Una vez finalizada la partida, el programa le dará la opción al usuario de jugar otra partida o volver al menú principal.

Preguntados:

Si es seleccionada esta opción, debe de seguir las instrucciones que le da el programa respondiendo las preguntas que le de el programa, si responde correctamente seguirá a la siguiente pregunta pero si fallas el juego le dará la opción de volver a empezar o volver al menú principal. Una vez finalizada la partida, el programa le dará la opción al usuario de jugar otra partida o volver al menú principal.

4. Cierre:

Esta opción le permite cerrar el programa al usuario , esta opción solo se encuentra en el menú principal del programa.

  • Tutorial

Introducción de los datos:

Menú:

  1. Opción Tres en raya:

En este juego debes seguir las instrucciones dadas y tratar de conectar 3 figuras en raya antes de que lo haga tu contrincante.

  1. Adivina el numero:

En este juego el programa te pedirá introducir 5 números del los cuales el seleccionará 1 de ellos y tenddras 2 intentos para adivinarlo.

  1. Héroes:

En este juego debes de seleccionar al personaje que deseas y seguir las instrucciones del juego al pie de la letra.

  1. Preguntados:

En este juego le saldrá un tema aleatorio, debe responder correctamente sino es así pierde.

  1. Buscaminas:

Debe seguir las instrucciones dadas.

  • Funciones utilizadas

En este programa se han implementado un gran número de funciones, de las cuales se explicaran las más importantes:

1. Presentación:

La función void presentacion() introduce al encargado de la sala y permite que puedas introducir cuantos juegan y que introduzcas la información necesaria, anexo se coloca un pequeño segmento de esta función. Para esto se usa un vector de estructuras.

	FILE *u;
	datos aux[Max_Usuarios];
	datos *usuario[Max_Usuarios];
	int i, Num_Usuarios;
	u = fopen ("Usuario.txt", "a");
	if (u==NULL){
		printf ("No se ha podido abrir el archivo.\n");
	}
	printf("Muy buenas !!! Soy el encargado de la gran sala de recreativos GAME OF CODES.\
	       \nMi nombre es Stark. Antes de empezar, necesito que introduzca algunos datos personales.\n");
	
	for (i=0; i<Max_Usuarios; i++)
	usuario[i] = aux + i;
	
	printf ("Cuantas personas vais a jugar?\n");
	scanf ("%i", &Num_Usuarios);
	
	for (i=0; i<Num_Usuarios; i++)
	{
		printf ("Introduzca el nombre del usuario %i:  ", i+1);
		fflush(stdout);
		scanf ("%s", usuario[i]->nombre);
		fprintf (u, "Nombre del usuario %i: %s\n", i+1, usuario[i]->nombre);
		
		printf ("Introduzca los apellidos del usuario %i:  ", i+1);
		fflush(stdout);
		scanf (" %[^\n]", usuario[i]->apellidos);
		fprintf (u, "Apellidos del usuario %i: %s\n", i+1, usuario[i]->apellidos);
		
		printf ("Introduzca la edad del usuario %i:  ", i+1);
		fflush(stdout);
		scanf ("%d", &usuario[i]->edad);
		fprintf (u, "Edad del usuario %i: %d\n", i+1, usuario[i]->edad);
		
		printf ("Introduzca el sexo del usuario %i:  ", i+1);
		fflush(stdout);
		scanf ("%s", usuario[i]->sexo);
		fprintf (u, "Sexo del usuario %i: %s\n", i+1, usuario[i]->sexo);
		printf("\n");
	}

2. Tres en Raya

La siguiente función es la principal del juego:

int i,j,a,jug;
	
	do{
	Intro_Primera(c);
	
	printf ("TRES EN RAYA!!!!\n\n");
		
	do{
	printf ("Escoge una opcion (introduce el numero 1 o 2):\
		    \n 1) Jugar contra la maquina.\
			\n 2) Jugar con un amigo.\
			\n 3) Salir del juego.\n");
	scanf ("%i", &a);
	
	} while (a!=1 && a!=2 && a!=3);
	
	switch (a)
	{
		case 1:
			i=0;
	        do{
	        	tablero (c);
		
	    	    if (i % 2 == 0) {
			    jug=1;
		    	    jugador (c,jug);
	    	    }
		
		        else {
	         		maquina (c);
    		    }
		
         	    j = ganador (c);
    	    	i++;
	    	
        	} while (i<=8 && j==2);
	
        	
	        tablero (c);
	
	        if (j==0)
	        {
         		printf ("Enhorabuena!!! Has ganado.\n\n");
         	}
	        else if (j==1)
	        {
         		printf ("Lo siento, has perdido.\n\n");
	        }
	        else
	        {
	        	printf ("Has empatado.\n\n");
	        }
		break;
			
		case 2:
			i=0;
	        do{
		        tablero (c);
		
		        if (i % 2 == 0) {
				jug=1;
		        	jugador (c,jug);
		        }
		
		        else {
				jug=2;
		        	jugador (c,jug);
		        }
		
	           	j = ganador (c);
		        i++;
		
           	} while (i<=8 && j==2);
	
	        tablero (c);
	
	        if (j==0)
	        {
	        	printf ("Enhorabuena!!! Ha ganado el jugador 1.\n\n");
	        }
         	else if (j==1)
         	{
                printf ("Enhorabuena!!! Ha ganado el jugador 2.\n\n");
	        }
	        else
	        {
	        	printf ("Habeis empatado.\n\n");
	        }
	    break;
	}
	} while (a!=3);

La función void casilla_ocupada(char c[3][3], char aux, char signo) se encarga de ver si el usuario puede seleccionar la casilla pedida o si por el contrario ya está ocupada. Si no está ocupada, añade el signo anteriormente definido. El signo es "X" para el jugador 1 y "O" para el jugador 2.

int i,j,k;
	
	do{
	  k=0;
		switch (aux)
		{
			case '1':
				i=0;
				j=0;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '2':
				i=0;
				j=1;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '3':
				i=0;
				j=2;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '4':
				i=1;
				j=0;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '5':
				i=1;
				j=1;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '6':
				i=1;
				j=2;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '7':
				i=2;
				j=0;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '8':
				i=2;
				j=1;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
				
			case '9':
				i=2;
				j=2;
				if (c[i][j]=='X'||c[i][j]=='O'){
					k=1;
					printf ("La casilla esta ocupada, intentalo con otro numero: ");
					fflush(stdin);
					scanf ("%c", &aux);
				}
				break;
		}
	} while (k==1);
	
	c[i][j] = signo;

El tablero es una matriz:

int i,j;
	
	for (i=0; i<3; i++)
	{
		for (j=0; j<3; j++)
		{
			if (j<2)
			{
				printf (" %c |", c[i][j]);
			}
			else
			{
				printf (" %c ", c[i][j]);
			}
		}
		if (i<2)
		{
			printf ("\n-----------\n");
		}
	}
	printf ("\n\n");

3. Modo fácil:

La función void modoFacil() al ser seleccionada la opción modo facil en el buscaminas, se hace la llamada a esta función. lo que haces es un buscaminas de menor dificultad, anexo se coloca un pequeño segmento de esta función.

	int i, j;
	int t;
	int v1[2], v2[2], v3[2], v4[2], v5[2], v6[2];
	int tablero[6][6]; //tablero de minas
	int tJug[6][6]; //tablero que ve el jugador
	int jx, jy; //variables que recogen la posicion donde se mueve el jugador
	int result;
	char m; //identifica minas
	int nIntentos=0; //contabiliza los intentos
	
	printf("Has elegido modo facil, por lo que tu tablero(6x6)es este:...\n");
	
	//Este bucle permite crear el tablero inicial(8x8)
	for(i=0; i<6; i++)
	{
		for(j=0; j<6; j++)
		{
			tablero[i][j]=0;
			printf("/ ");
				if(j==5)
					printf("\n");
		}
	}
	printf("Recuerda de tienes 6 minas que evitar... que empiece el juego!!\n");
	sleep(2);
	//Se crea aqui el tablero que vera el jugador(sin las minas)
	for(i=0; i<6; i++)
	{
		for(j=0; j<6; j++)
		{
			tJug[i][j]=0;
		}
	}
	//se generan numeros aleatorios para las posiciones de las minas, en vectores
	srand(time(NULL)); //genera posiciones aleatorias para los valores 'x' e 'y' de cada mina
	v1[0]=rand()%6;
	v1[1]=rand()%6;
	
	//permite asegurarse de que las minas no esten en la misma posicion
	//reescribe el vector v2, hasta que su componente 'x' o 'y' sea distinta a la del vector 1
	do{
		v2[0]=rand()%6;
		v2[1]=rand()%6;
	}while(v2[0]==v1[0] && v2[1]==v1[1]);
	
	//reescribe el vector v3, hasta que sus componente 'x' o 'y' sean distintas a las del vector 1 y 2
	do{
		v3[0]=rand()%6;
		v3[1]=rand()%6;
	}while((v3[0]==v1[0] && v3[1]==v1[1]) || (v3[0]==v2[0] && v3[1]==v2[1]));
	
	//reescribe el vector v4, hasta que sus componente 'x' o 'y' sean distintas a las del vector 1, 2 y 3
	do{
		v4[0]=rand()%6;
		v4[1]=rand()%6;
	}while((v4[0]==v1[0] && v4[1]==v1[1]) || (v4[0]==v2[0] && v4[1]==v2[1]) || (v4[0]==v3[0] && v4[1]==v3[1]));
	
	//reescribe el vector v5, hasta que sus componente 'x' o 'y' sean distintas a las del vector 1, 2, 3 y 4
	do{
		v5[0]=rand()%6;
		v5[1]=rand()%6;
	}while((v5[0]==v1[0] && v5[1]==v1[1]) || (v5[0]==v2[0] && v5[1]==v2[1]) || (v5[0]==v3[0] && v5[1]==v3[1]) || (v5[0]==v4[0] && v5[1]==v4[1]));
	
	//reescribe el vector v6, hasta que sus componente 'x' o 'y' sean distintas a las del vector 1, 2, 3, 4 y 5
	do{
		v6[0]=rand()%6;
		v6[1]=rand()%6;
	}while((v6[0]==v1[0] && v6[1]==v1[1]) || (v6[0]==v2[0] && v6[1]==v2[1]) || (v6[0]==v3[0] && v6[1]==v3[1]) || (v6[0]==v4[0] && v6[1]==v4[1]) || (v6[0]==v5[0] && v6[1]==v5[1]));
	
	//x1 = rand()%8;
    //y1 = rand()%8; ... asi hasta 12 posiciones, 6 vectores
    
    tablero[v1[0]][v1[1]] = 9; //Se inicializa un 'flag' para las minas
    tablero[v2[0]][v2[1]] = 9;
    tablero[v3[0]][v3[1]] = 9;
    tablero[v4[0]][v4[1]] = 9;
    tablero[v5[0]][v5[1]] = 9;
    tablero[v6[0]][v6[1]] = 9;

4. Preguntados

El juego preguntados primero escoge un tema (ciencia, deportes, historia o geografía) aleatoriamente. Cuando fallas alguna pregunta o aciertas todas te da la opción de volver a jugar (pudiendo tocarte un tema diferente).

do{	
	    srand(time(NULL));
	    t = rand()%4;
	
    	if (t==0)
    	P_Ciencia();
	
		else if(t==1)
		P_Deportes();	
	
    	else if(t==2)
    	P_Geografia();
    	
    	else
    	P_Historia();
    	
    	printf ("\nTe gustaria volver a jugar (S/N)? Recuerda que te puede tocar un tema diferente.\n");
    	scanf (" %c", &k);
    }while (k=='s' || k=='S');

Las preguntas son tipo test, habiendo tres opciones. Las preguntas y respuestas están en un fichero (se explicará cómo son utilizados más adelante). Dichas preguntas y respuestas se almacenan en un vector de cadenas de caracteres y se muestran de una en una mediante un bucle "for":

int i,j;
	char preguntas[Num][MaxNum_Caracteres];
	char respuestas[Num][MaxNum_Caracteres];
	char respuesta_correcta[Num];
	char respuesta;
	
    ciencia_preguntas(preguntas);
    ciencia_respuestas(respuestas);
    ciencia_respuesta_correcta(respuesta_correcta);
    
	printf ("TEMA ESCOGIDO: CIENCIA\n");
	
	for (i=0; i<Num; i++)
	{
		printf ("\n%s\n", preguntas[i]);
		printf ("%s\n", respuestas[i]);
		scanf (" %c", &respuesta);
		
		if (respuesta != respuesta_correcta[i])
		{
			printf ("Lo siento, has fallado...");
			break;
		}
	}
	printf ("\nHas terminado. Espero que hayas acertado muchas!\n");
  • Ficheros

En este programa solo se utilizó un fichero, el cual es:

"Usuario.txt"

Este fichero almacena información como : Cuantas personas juegan, sus nombre y apellidos, su edad y su sexo, además guarda los datos seleccionados en el juego de adivina el numero

FILE *u;
	datos aux[Max_Usuarios];
	datos *usuario[Max_Usuarios];
	int i, Num_Usuarios;
	u = fopen ("Usuario.txt", "a");

"cuestiones.txt"

En este fichero se encuentran las preguntas que se le realizaran al usuario en el juego de preguntados. En este juego tenemos 4 funciones así debido a que hay 4 temas (Ciencias, Deporte, Historia y Geografía).

	FILE *q;
	
	q = fopen ("Preguntados/P_Ciencia/cuestiones.txt", "r");
	if (q==NULL){
		printf ("No se ha podido abrir el archivo.\n");
	}
	
	while (fscanf (q, " %[^\n]", preguntas[N]) != EOF)
	N++;
	fclose(q);

"respuesta_correcta.txt"

En este fichero se encuentran solamente las repuestas correctas. En este juego tenemos 4 funciones debido a que hay 4 temas (Ciencias, Deporte, Historia y Geografía).

int N=0;
	FILE *rc;
	
	rc = fopen ("Preguntados/P_Geografia/respuesta_correcta.txt", "r");
	if (rc==NULL){
		printf ("No se ha podido abrir el archivo.\n");
	}
	
	while (fscanf (rc, "%c", &respuesta_correcta[N]) != EOF)
	N++;
	fclose(rc);

Se almacena el contenido en una cadena de caracteres y mediante un bucle "for" se van comparando las respuestas del usuario con la cadena.

for (i=0; i<Num; i++)
	{
		printf ("\n%s\n", preguntas[i]);
		printf ("%s\n", respuestas[i]);
		scanf (" %c", &respuesta);
		
		if (respuesta != respuesta_correcta[i])
		{
			printf ("Lo siento, has fallado...");
			break;
		}
	}

"respuestas.txt"

En este fichero se almacenan las opciones que tendrá el usuario como respuesta a la pregunta realizada, en este fichero solo se encuentran las 3 opciones que tendrá el usuario para contestar a la pregunta.

int N=0;
	FILE *r;
	
	r = fopen("Preguntados/P_Deportes/respuestas.txt", "r");
	if (r==NULL){
		printf ("No se ha podido abrir el archivo.\n");
	}
	
	while (fscanf (r, " %[^\n]", respuestas[N]) != EOF)
	N++;
	fclose(r);
  • Traza de ejecución

A continuación, se presenta un vídeo tutorial que puede ayudar al jugador a entender el programa, si quiere jugar una partida rápida.

Traza_de_ejecucion