Juego de RPG basado en texto en C ++ -- ++ campo con game campo con role-playing-game camp codereview Relacionados El problema

Text-based RPG game in C++


3
vote

problema

Español

Este es un juego de RPG basado en texto que he hecho en C ++ y me encantaría una revisión en ella. Soy un novato 100% completo con tal vez 2 semanas de experiencia de C ++, ¡así que me encantaría algunas lecciones sobre lo que hice mal y cómo puedo mejorar! Principalmente solo use muchas declaraciones de interruptor y if Declaraciones.

Si hay algo malo o cosas que puedan cambiar y mejorar, apreciaría mucho si pudieras caminarme a través de lo que estaba mal, por qué estaba mal y cómo evitar que suceda nuevamente. Realmente no sé muchos términos de C ++, así que Elif sería increíble.

Aquí está mi simple Main.CPP. Creo que eso se llama un constructor y lo estoy usando para llamar a mi Meadowgiant.cpp por la carretera.

  #include <iostream> #include <string> #include "MeadowGiant.h"  int main() { MeadowGiant obj1; }   

meadowgiant.h

  #define MEADOWGIANT_H  class MeadowGiant { public:     MeadowGiant(); protected: };  #endif   

meadowgiant.cpp

  #include "MeadowGiant.h" #include <iostream> #include <string> #include <time.h> #include <stdio.h> #include <stdlib.h>  MeadowGiant::MeadowGiant() { int trail, caveEnter; int fight1; int loot; int goblinAttack, goblinHP, HP, attack, action1, ability;  goblinAttack = 5; goblinHP = 10; HP = 100;  std::cout << -Insert story narrative- Choose a trail to go down. "; std::cin  >> trail;       if(trail==1)     {     std::cout << "-Insert story narrative- Come across a cave. Do you go in? ";     std::cin  >> caveEnter;          if(caveEnter==1)         {         std::cout << "You are ambushed by a goblin. Run or fight? ";         std::cin >> fight1;          goblinFight:         loot = rand() % 4 + 1;         srand(time(NULL));                     if(fight1==1)         {         std::cout   << "Your HP: " << HP << std::endl;         std::cout   << "Enemy HP: " << goblinHP << std::endl;         std::cout   << "What do you do?                      << "[1] Attack [2] Run  ";         std::cin    >> action1;         }             if(goblinHP<=0)             {             std::cout << "You have slain the goblin! "                        << "You head towards the chest and take the spoils "                       << "of battle! ";                  switch(loot)             {             case 1: std::cout << "You find a bastard sword! ";                               attack = attack + 7;                               goto exitCave;             case 2: std::cout << "You find an Enchanted Staff! ";                               attack = attack + 10;                               goto exitCave;             case 3: std::cout << "You find an Obsidian Dagger! ";                               attack = attack + 9;                               goto exitCave;             case 4: std::cout << "You find a Holy Mace! ";                               attack = attack + 10;                               goto exitCave;             }     else if(action1==1)     {     std::cout   << "You successfully hit the goblin! "                 << "He strikes back! ";     attack = rand() % 10 + 1;       srand(time(NULL));      goblinHP = goblinHP - attack;     HP = HP - goblinAttack;     goto goblinFight;     }     else if(action==2)     {     std::cout   << "You take the cowards way out and leave the cave. ";     goto exitCave;     }     } else if(caveEnter==2) { exitCave: std::cout << "You have exited the cave. "; }  else { goto exitCave; } } }   

El formato de mi código real no se ve así en mi IDE. El código es el mismo, pero las pestañas son mucho más limpias en mi compilador, por lo que si es un problema, ya estoy en ello.

Original en ingles

This is a text-based RPG game I've made in C++ and would love some review on it. I am a 100% complete newbie with maybe 2 weeks of C++ experience so I'd love some lessons on what I did wrong and how I can improve! I mainly just use a lot of switch statements and if statements.

If there is anything wrong or things that could change and improve I'd very much appreciate if you could walk me through what was wrong, why it was wrong and how to prevent it from happening again. I really don't know a lot of C++ terms so ELIF would be awesome.

Here's my simple main.cpp. I think that's called a constructor and I'm using it to call my MeadowGiant.cpp down the road.

#include <iostream> #include <string> #include "MeadowGiant.h"  int main() { MeadowGiant obj1; } 

MeadowGiant.h

#define MEADOWGIANT_H  class MeadowGiant { public:     MeadowGiant(); protected: };  #endif 

MeadowGiant.cpp

#include "MeadowGiant.h" #include <iostream> #include <string> #include <time.h> #include <stdio.h> #include <stdlib.h>  MeadowGiant::MeadowGiant() { int trail, caveEnter; int fight1; int loot; int goblinAttack, goblinHP, HP, attack, action1, ability;  goblinAttack = 5; goblinHP = 10; HP = 100;  std::cout << -Insert story narrative- Choose a trail to go down.\n"; std::cin  >> trail;       if(trail==1)     {     std::cout << "-Insert story narrative- Come across a cave. Do you go in?\n";     std::cin  >> caveEnter;          if(caveEnter==1)         {         std::cout << "You are ambushed by a goblin. Run or fight?\n";         std::cin >> fight1;          goblinFight:         loot = rand() % 4 + 1;         srand(time(NULL));                     if(fight1==1)         {         std::cout   << "Your HP: " << HP << std::endl;         std::cout   << "Enemy HP: " << goblinHP << std::endl;         std::cout   << "What do you do?\n                     << "[1] Attack [2] Run \n";         std::cin    >> action1;         }             if(goblinHP<=0)             {             std::cout << "You have slain the goblin!\n"                        << "You head towards the chest and take the spoils\n"                       << "of battle!\n";                  switch(loot)             {             case 1: std::cout << "You find a bastard sword!\n";                               attack = attack + 7;                               goto exitCave;             case 2: std::cout << "You find an Enchanted Staff!\n";                               attack = attack + 10;                               goto exitCave;             case 3: std::cout << "You find an Obsidian Dagger!\n";                               attack = attack + 9;                               goto exitCave;             case 4: std::cout << "You find a Holy Mace!\n";                               attack = attack + 10;                               goto exitCave;             }     else if(action1==1)     {     std::cout   << "You successfully hit the goblin!\n"                 << "He strikes back!\n";     attack = rand() % 10 + 1;       srand(time(NULL));      goblinHP = goblinHP - attack;     HP = HP - goblinAttack;     goto goblinFight;     }     else if(action==2)     {     std::cout   << "You take the cowards way out and leave the cave.\n";     goto exitCave;     }     } else if(caveEnter==2) { exitCave: std::cout << "You have exited the cave.\n"; }  else { goto exitCave; } } } 

The format of my actual code doesn't look like this in my IDE. The code is the same, but the tabs are much cleaner in my compiler so if that's an issue, I'm already on it.

        
       
       

Lista de respuestas

8
 
vote

Hay una serie de cosas que veo que pueden ayudarlo a mejorar su código.

FIX TYPOS

Hubo tantos tipográficos en este código que tenía que hacer varias correcciones antes de que el código se compilaría. Recomendaría componer la pregunta sin conexión, utilizando un editor de texto que cambia las pestañas a los espacios. Luego corta y pega todo el asunto en CODEREVIEW. ¡Ahorrará mucha gente mucho tiempo, incluyendo y especialmente en usted!

No ponga todo en el constructor

El MeadowGiant Clase tiene todo su código en el constructor. Eso no es muy buen diseño. En su lugar, sería mejor instanciar a uno o más de ellos y luego usar las funciones miembros para manipular el objeto.

Uso solo necesario #include S

La línea #include <stdio.h> es necesario y se puede eliminar de manera segura.

no resienten al generador de números aleatorios más de una vez

El programa llama actualmente srand Después de cada llamada a rand() . Esto realmente no es necesario ni aconsejable. En su lugar, solo llámelo una vez cuando el programa comience y luego continúe usando rand() para obtener números aleatorios. Mejor aún, vea la siguiente sugerencia.

Considere usar un mejor generador de números aleatorios

Si está utilizando un compilador que admite al menos C ++ 11, considere usar un mejor generador de números aleatorios. En particular, en lugar de rand , es posible que desee ver std::uniform_real_distribution y amigos en el encabezado <random> .

Use la concatenación de cadena constante

Este código actualmente tiene una serie de instancias que se parecen a esto (o lo harían si los errores tipográficos fueron fijos):

  std::cout << "You have slain the goblin! "     << "You head towards the chest and take the spoils "     << "of battle! ";   

Esto llama al operador #include0 . En su lugar, podrías escribir esto:

  #include1  

Esto solo llama #include2 una vez. El compilador concatiene automáticamente los literales de cadena juntos.

Evite usar #include3

Tener una proliferación de #include4 Las declaraciones suele ser un signo de mal diseño. Mejor sería eliminarlos por completo: hace que el código sea más fácil de seguir y menos propenso a errores. En este código, es probable que pueda usar un bucle en lugar:

  #include5  

Use C ++ - El estilo incluye

En lugar de incluir #include6 debe usar #include7 . La diferencia está en los espacios de nombres, como puede leer sobre esta pregunta .

Eliminar las variables no utilizadas

Las variables no utilizadas son un signo de código de mala calidad, y no desea escribir un código de mala calidad. En este Código, 99887766555443318 no se utiliza. Su compilador es lo suficientemente inteligente como para informarle sobre esto si lo hace muy bien.

 

There are a number of things that I see that may help you improve your code.

Fix typos

There were so many typos in this code that I had to do quite a number of fixes before the code would even compile. I'd recommend composing the question offline, using a text editor that changes tabs to spaces. Then cut and paste the whole thing into CodeReview. It will save many people lots of time, including and especially you!

Don't put everything into the constructor

The MeadowGiant class has all of its code in the constructor. That's not very good design. Instead, it would be better to instantiate one or more of them and then use member functions to manipulate the object.

Use only necessary #includes

The #include <stdio.h> line is not necessary and can be safely removed.

Don't reseed the random number generator more than once

The program currently calls srand after every call to rand(). This is really neither necessary nor advisable. Instead, just call it once when the program begins and then continue to use rand() to get random numbers. Better yet, see the next suggestion.

Consider using a better random number generator

If you are using a compiler that supports at least C++11, consider using a better random number generator. In particular, instead of rand, you might want to look at std::uniform_real_distribution and friends in the <random> header.

Use constant string concatenation

This code currently has a number of instances that look like this (or would if the typos were fixed):

std::cout << "You have slain the goblin!\n"     << "You head towards the chest and take the spoils\n"     << "of battle!\n"; 

This calls the << operator three times. Instead, you could write this:

std::cout << "You have slain the goblin!\n"     "You head towards the chest and take the spoils\n"     "of battle!\n"; 

This only calls << once. The compiler automatically concatenates the string literals together.

Avoid using goto

Having a proliferation of goto statements is usually a sign of bad design. Better would be to eliminate them entirely -- it makes the code easier to follow and less error-prone. In this code, it's probable that you could use a loop instead:

for (goblinHP = 10; goblinHP > 0; ) {     // code to implement goblin attack goes here } 

Use C++-style includes

Instead of including stdlib.h you should instead use #include <cstdlib>. The difference is in namespaces as you can read about in this question.

Eliminate unused variables

Unused variables are a sign of poor quality code, and you don't want to write poor quality code. In this code, ability is unused. Your compiler is smart enough to tell you about this if you ask it nicely.

 
 
4
 
vote

Objetos en C ++ deben tomar las propiedades de las ideas que representan. En lugar de usar el constructor de clase para realizar la totalidad del programa, los objetos (s) deben contener campos y métodos que describan las cualidades del objeto y las posibles acciones perfectables de los objetos.

Es útil aquí pensar en los objetos en el contexto más clásico de la palabra. Los objetos tienen cualidades, y son capaces de hacer las cosas en un sentido general. En la programación orientada a objetos, la idea es describir estos objetos y sus relaciones entre sí a través de la declaración de campos y métodos, tanto privados al objeto como manipulados internamente, y públicos a su usuario y manipulados por el usuario u otros objetos.

Todo esto es bastante abstracto, pero es un concepto difícil de transmitir, y uno aprendido mucho mejor a través de un método académico tradicional como UNI o un libro que algunos párrafos en línea.

Por ejemplo, en lugar de:

  #include9  

Considerar:

  #include <stdio.h>0  

y así sucesivamente.

 

Objects in C++ should take the properties of the ideas they represent. Instead of using the class constructor to perform the entirety of the program, the object(s) should contain fields and methods that describe the object's qualities and the objects' possible performable actions.

It's useful here to think of objects in the more classic context of the word. Objects have qualities, and are capable of doing things in a general sense. In object-oriented programming, the idea is to describe these objects and their relations to each other through the declaration of fields and methods, both private to the object and manipulated internally, and public to its user and manipulated by the user or other objects.

This is all quite abstract, but it's a difficult concept to convey, and one much better learned through a traditional scholarly method like uni or a book than a few paragraphs online.

For example, instead of:

class MeadowGiant { public:     MeadowGiant(); protected: }; 

Consider:

class MeadowGiant { public: //default constructor, initializes with default data MeadowGiant(); //contructor to initialize object with defined data MeadowGiant(int health, weapon* current_weapon, std::string name, std::string description); //function to combat this creature with another and update values accordingly void creature_combat(MeadowGiant *othercreature); private: //structure for the creatures weapon struct weapon  {     std::string name;     int damage;     float durability; } //pointer to the creatures weapon weapon* creature_weapon; //the creatures descriptive fields int health; int xp; std::string name, description; } 

And so on.

 
 

Relacionados problema

14  Creador de personajes para un juego de rol  ( Character creator for a role playing game ) 
gol: Escribe un programa de creador de personajes para un juego de rol. El jugador Se debe dar un grupo de 30 puntos para gastar en cuatro atributos: ...

6  Primeros borradores del código de aventura de ultima  ( First drafts of ultima like adventure code ) 
Un amigo y yo observamos la mayoría de los videos de la sintaxis de ThenEwboston para Python 3 y pasamos 2 horas intentando juntar nuestro primer programa / a...

3  Clase de menú / Structura para RPG  ( Menu class struct for rpg ) 
Planeo usar esta estructura de menú en un rpg jugado en el terminal. Quiero hacer un RPG similar a D & Amp; d. Me gustaría consejos sobre mis métodos para la ...

2  Código de principiante para un simulador de batalla basado en texto  ( Beginner code for a text based battle simulator ) 
Quería ver si alguien quisiera revisar el código existente que tengo para un programa principiante que simula una batalla. He aprendido mucho mientras lo hice...

6  JavaScript RPG basado en texto  ( Javascript text based rpg ) 
Estoy haciendo un RPG basado en texto en JavaScript. Funciona, pero me gustaría saber cómo mejorarlo, como el código de código. Además, quiero saber cómo hace...

3  Diseño del sistema de buff / debuff del monstruo  ( Monster buff debuff system design ) 
A continuación se muestra una colección de clases que componen mi sistema de buff / debuff. La falla más grande de mi diseño que no pude superar es la clase b...

-1  Clases (y tal vez subclases) para personajes en un juego de Python  ( Classes and maybe subclasses for characters in a python game ) 
Estoy practicando clases y subclases en Python. No estoy seguro de si puede ser útil agregar una subclase al siguiente código, en lugar de agregar métodos a l...

7  Juego de texto de RPG WIP  ( Rpg text game wip ) 
Agradecería cualquier comentario constructivo en mi juego, tengo la intención de agregar gráficos 2D simples en algún momento, pero queremos hacer que el "esq...

8  Inventario de juegos de fantasía - CH. 5 Automatizar las cosas aburridas  ( Fantasy game inventory ch 5 automate the boring stuff ) 
Aquí hay un ejercicio de práctica: inventario de juegos de fantasía $ - $ estás creando un videojuego de fantasía. La estructura de datos para mode...

7  Esqueleto para un RPG basado en texto  ( Skeleton for a text based rpg ) 
Soy nuevo en Python y creó este pequeño programa. Básicamente es un esqueleto para un simple RPG basado en texto. El programa es un menú que le permite: Cr...




© 2022 respuesta.top Reservados todos los derechos. Centro de preguntas y respuestas reservados todos los derechos