Dev - C++ - Game

 
Vista:
Imágen de perfil de Dennis
Val: 141
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Game

Publicado por Dennis (63 intervenciones) el 02/10/2020 15:46:21
Saludos a todos.
Me gustaría que me dieran su opinión sobre este pequeño juego, cualquier cosa que me sirva para mejorar se lo aceptare.
Gracias de antemano.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
#include <iostream>
#include <conio.h>
#include <stdlib.h>
#include <cmath>
 
#include "libreria.h"
 
using namespace std;
 
int main(){
    int elegir, partidasTotal = 0, contadorPartidas = 0;
    int usuPoints = 0, cpuPoints = 0, empate = 0;
    int usuJugada = 0, cpuJugada;
    srand((NULL));
    presentacion();
    cout<< "\t\t\t\t  > ";
     cin>> elegir;
 
    switch(elegir){
        case 1:
            ls();
            partidas();
            cout<< "\n\t\t\t\t   > ";
             cin>> partidasTotal;
 
            while(contadorPartidas < partidasTotal){
                ls();
                analisisGame(usuPoints, cpuPoints, empate, partidasTotal);
                marcador(usuPoints, cpuPoints, empate, contadorPartidas);
                game();
                cout<< "\n\t\t\t\t  > ";
                 cin>> usuJugada;
                cpuJugada = rand() % 3;
                if(usuJugada == 1 || usuJugada == 2 || usuJugada == 3){
                    if(usuJugada == 1 && cpuJugada == 0 || usuJugada == 2 && cpuJugada == 1 || usuJugada == 3 && cpuJugada == 2){
                        empate++;
                    }else
                    if(usuJugada == 1 && cpuJugada == 2 || usuJugada == 2 && cpuJugada == 0 || usuJugada == 3 && cpuJugada == 1){
                        usuPoints++;
                    }else
                    if(usuJugada == 3 && cpuJugada == 0 || usuJugada == 1 && cpuJugada == 1 || usuJugada == 2 && cpuJugada == 2){
                        cpuPoints++;
                    }
                contadorPartidas++;
                }
            }
                ls();
                analisisGame(usuPoints, cpuPoints, empate, partidasTotal);
                marcador(usuPoints, cpuPoints, empate, contadorPartidas);
                game();
        case 2:
            return 0;
 
        default:
            ls();
            teclaIncorrecta();
    }
getch();
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
#include <iostream>
#include <conio.h>
 
using namespace std;
 
void presentacion(void){
	cout<< "\n\n";
	cout<< "\t\t\t******************************" <<endl;
	cout<< "\t\t\t*     PIEDRA PAPEL TIJERA    *" <<endl;
	cout<< "\t\t\t******************************" <<endl;
	cout<< "\t\t\t*\t 1- JUGAR   \t     *" <<endl;
	cout<< "\t\t\t*\t            \t     *" <<endl;
	cout<< "\t\t\t*\t 2- SALIR   \t     *" <<endl;
	cout<< "\t\t\t*\t            \t     *" <<endl;
	cout<< "\t\t\t******************************" <<endl;
}
 
void partidas(){
	cout<< "\n\n\n\t\t\tTECLEE LA CANTIDAD DE PARTIDAS" <<endl;
}
 
void game(){
    cout<< "\n\t\t\t\t    MARQUE" <<endl;
    cout<< "\n\t\t\t1-PIEDRA   2-PAPEL   3-TIJERA" <<endl;
 }
 
 int marcador(int usuarioPuntos, int cpuPuntos, int empatePuntos, int partidasConteo){
    cout<< "\nPARTIDAS:" << partidasConteo <<endl;
    cout<< "USUARIO: " << usuarioPuntos <<endl;
    cout<< "CPU: " << cpuPuntos <<endl;
    cout<< "EMPATE(s): " << empatePuntos <<endl;
}
 
int analisisGame(double usuario, double cpu, double empate, double partidasTotal){
    int partidasRestantes      = partidasTotal - empate;
    double usuarioPorcientoWin = (usuario / partidasRestantes) * 100;
    double cpuPorcientoWin     = (cpu     / partidasRestantes) * 100;
 
    cout<< "% DE GANAR USUARIO: " << usuarioPorcientoWin <<endl;
    cout<< "% DE GANAR CPU    : " << cpuPorcientoWin     <<endl;
}
 
void teclaIncorrecta(void){
	cout<< "\n\n\t\t\t\t**********************" <<endl;
	cout<< "\t\t\t\t*  TECLA INCORRECTA  *"	  <<endl;
	cout<< "\t\t\t\t**********************" <<endl;
	cout<< "\n\n\n\n\n\t\t    POR FAVOR PRESIONE UNA TECLA PARA CONTINUAR." <<endl;
	getch();
}
 
void ls(void){
	system("cls");
}
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Game

Publicado por Rodrigo (539 intervenciones) el 02/10/2020 16:17:11
Cuando usas muchas constantes explícitas el programa se hace mas dificil de leer y es posible que hayan errores escondidos.
Define constantes o mejor usa un enum para las distintas posibilidades de juego que existen.
Parece que el jugador puede usar 1, 2, y 3 mientras el computador usa 0, 1, 2 ? Esta bien eso? Por que no usas los mismos valores para ambos jugadores?

En analisisGame haces una resta y luego divides por el resultado de esa resta. Que pasa si la resta te da cero? o sea si el total es igual al numero de empates, tiene sentido la division por cero? Parece que hay algo que corregir ahi.

Al descubrir si hay alguien que gano, estas usando 2 veces la misma logica, excepto que en un caso usas al jugador primero y en el otro el computador primero, pero esencialmente son las mismas comparaciones. Sugiero hacer una funcion que te indique si hay ganador.

En ese caso, tu programa podria verse algo asi como:

1
2
3
4
5
6
7
if( gana( opcionJugador, opcionComputador ) {
    ganaJugador++;
} else if( gana( opcionComputador, opcionJugador) ) {
    ganaComputador++;
} else {
    empates++;
}


Los cases de un switch tipicamente terminan en un break, sino pasan de largo a la siguiente opcion. Eso es lo que quieres?

El compilador, generalmente necesita ver el prototipo de las funciones que no han sido vistas previamente. Como varias funciones estan definidas en otro modulo, los prototipos deberian aparecer antes del main.

Usa el boton "</>Codigo" para encerrar tu codigo pues se ve mejor, no se pierde la indentacion, aparece con lineas y es mas facil indicar donde hay cosas por mejorar.

El codigo aparece asi
1
2
3
4
5
6
int main() {
   if( condicion ) {
       instruccion
   }
   return 0;
}

y no asi

int main() {
if( condicion ) {
instruccion
}
return 0;
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar
Imágen de perfil de Dennis
Val: 141
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Game

Publicado por Dennis (63 intervenciones) el 02/10/2020 16:41:20
Gracias.
El usuario utiliza 1,2,3 pero hace un tiempo escribí esto: rand() % 4, utiliza un do-while por si sale 0 volver a repetir la operación pero en ocasiones se sumaban las partidas pero no ponía si era empate o si el usuario o cpu había ganado, eso me costo horas rompiéndome la cabeza hasta que anoche cambie el código completo, y como tenia dudas decidí exponerlo aquí.
En cuanto a la división, tienes razón, no había pensado en eso, me pondré en función de eso.
Los switch también no tuve en cuenta el break, es importante, porque como dijo, como no esta el programa sigue de largo.
Lo que no comprendí muy bien es lo que quiso decir con lo del compilador, a la función se refiere es a las de la librería.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
Imágen de perfil de Rodrigo
Val: 1.755
Plata
Ha mantenido su posición en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

Game

Publicado por Rodrigo (539 intervenciones) el 02/10/2020 16:48:35
que tal usar rand() % 3 + 1 ?

si la funcion f1 llama a la funcion f2, deberian escribirse en este orden:

- la funcion llamada antes que la funcion llamadora

1
2
3
4
5
6
7
8
9
tiporetorno f2(parametros) {
 ...
}
 
tiporetorno f1(parametros) {
 ...
 f2( .. ) // f1 llama a f2, y el compilador la tuvo a la vista antes
  ..
}

- la funcion llamada, definida en cualquier parte, dentro o fuera del modulo, pero incluye el prototipo antes.

1
2
3
4
5
6
7
tiporetorno f2(parametros);  // <-- el propotipo antes
 
tiporetorno f1(parametros) {
 ...
 f2( .. )  // f1 llama a f2 y el compilador tuvo los tipos a la vista antes
  ..
}
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
1
Comentar