Register for your free account! | Forgot your password?

Go Back   elitepvpers > Coders Den > C/C++
You last visited: Today at 18:59

  • Please register to post and access all features, it's quick, easy and FREE!

Advertisement



Source unnötig lang?

Discussion on Source unnötig lang? within the C/C++ forum part of the Coders Den category.

Closed Thread
 
Old   #1
 
elite*gold: 0
Join Date: Jun 2013
Posts: 1
Received Thanks: 0
Source unnötig lang?

Hallo, wollte eigentlich nur fragen, ob man meine Sourcen irgendwie verkürzen könnte oder so etwas in der Art
Also, das habe ich jetzt ein wenig zum üben geschrieben.
main.cpp
Code:
#include <iostream>
#include <Windows.h>
#include "kampf.h"
#include "kopfzahl.h"

int main(){

kopfoderzahl();
kampf();

getchar();
return 0;
}
kampf_ele.h
Code:
bool auswahl;
int Trank = 20;
int WinLose;
int sleep = 2500;
int HeroTrankanzahl=1;
int GegTrankanzahl=1;
int GegHP = 100;
int HeroHP = 100;
int GegATK;
int HeroATK;
kampf.cpp
Code:
#include <iostream>
#include <Windows.h>
#include <time.h>
#include "kampf.h"
#include "kampf_ele.h"
#include "kopfzahl.h"
//-----KAMPF-----\\


void kampf(){
do{
Hero();
Gegner();
}while(WinLose==0);
}


void Hero(){
srand(time(NULL));
HeroATK =  rand() % (13 - 9 + 1) + 9;

std::cout << "Deine Hp: " << HeroHP <<"	Gegner HP: "  <<GegHP<<std::endl;
std::cout << " 0 = Angreifen	1 = Trank nehmen" <<"("<<HeroTrankanzahl<<")"<<std::endl;
std::cin >> auswahl;

//Hero's Zug
if (auswahl==true){
	if(HeroTrankanzahl==1){
HeroHP += Trank;
HeroTrankanzahl--;
std::cout << "Du hast einen Trank genommen und hast jetzt " << HeroHP <<"	(HP + "<<Trank<<")"<<std::endl;
Sleep (sleep);
	}else{
		std::cout << "Du hast keinen Trank mehr "<<std::endl;
Sleep (sleep);
 kampf();
	}

}

if (auswahl==false){
GegHP -= HeroATK;
if (GegHP>=0){
std::cout << "Du hast deinen Gegner angegriffen und der hat noch " << GegHP << " HP"<<"	( - "<<HeroATK<<")"<<std::endl;
Sleep (sleep);
}
if (GegHP<=0){
std::cout <<"Du hast deinen Gegner angegriffen und der hat keine HP mehr."<< std::endl;
Sleep (sleep);
}
}

//Gewonnen!
if (GegHP<=0){
	std::cout << "Du hast gewonnen!" << std::endl;
	WinLose=1;
}
}
void Gegner(){
srand(time(NULL));
GegATK =  rand() % (13 - 9 + 1) + 9;
//Gegnerischer Zug
if (GegHP <=10&&WinLose==0&&GegTrankanzahl==1){
GegHP+=Trank;
GegTrankanzahl--;
std::cout << " >>Der Gegner hat einen Trank genommen und hat wieder "<< GegHP << " HP."<<"	(HP + "<<Trank<<")"<< std::endl <<std::endl;
Sleep (sleep);
}
else if (WinLose==0){
HeroHP -= GegATK;
if (HeroHP>=0){
std::cout << " >>Der Gegner hat dich angegriffen und du hast noch "<<HeroHP << " HP." <<"	( - "<<GegATK<<")"<< std::endl<<std::endl;
Sleep (sleep);
}
if (HeroHP<=0){
std::cout << " >>Der Gegner hat dich angegriffen und du hast keine HP mehr."<< std::endl<<std::endl;
Sleep (sleep);
}
}
//Verloren!
if (HeroHP<=0){
	std::cout << "Du hast verloren!" << std::endl;
	WinLose=1;	
}


}
kampf.h
Code:
#ifndef _kampf_h_
#define _kampf_h_

void kampf();
void Hero();
void Gegner();


#endif
kopfzahl.cpp
Code:
#include <iostream>
#include <time.h>
#include <Windows.h>
#include "kopfzahl.h"
#include "kampf.h"

bool bMünze;
bool kopfzahl;

void kopfoderzahl(){
srand(time(NULL));
bMünze =  rand() % (1 - 0 + 1) + 0;
std::cout << "			Kopf oder Zahl?\n" 
	      << "Kopf = 0	Zahl = 1" <<std::endl;
std::cin >>kopfzahl;

if (kopfzahl==0){
std::cout << "Du hast \"Kopf\" ausgewaehlt!" << std::endl;
Sleep(1000);
}
else {
std::cout << "Du hast \"Zahl\" ausgewaehlt!" << std::endl;
Sleep(1000);
}

switch (bMünze){
case 0:std::cout << "Die Muenze liegt bei \"Kopf\"!" <<std::endl;Sleep(2000);break;
case 1:std::cout << "Die Muenze liegt bei \"Zahl\"!" <<std::endl;Sleep(2000);break;
}

if(bMünze==kopfzahl){
std::cout << "Du faengst an!\n";
Hero();
}
else{
std::cout << "Der Gegner faengt an!\n";
Gegner();
}
}
kopfzahl.h
Code:
void kopfoderzahl();
Danke im vorraus
kasten23 is offline  
Old 06/03/2013, 15:52   #2
 
Schlüsselbein's Avatar
 
elite*gold: 0
Join Date: Feb 2013
Posts: 1,137
Received Thanks: 869
Source unnötig häßlich wäre der passendere Titel.
Um auf Einzelheiten einzugehen, fehlt mir jetzt die Lust, vielleicht übernimmts ja jemand anders.

Lern die Sprache ordentlich, denk an C++11 und eine einheitliche naming convention - dann schreibe das Ding neu.
Schlüsselbein is offline  
Old 06/03/2013, 16:55   #3
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Was. ist. das. denn.
"bMünze = rand() % (1 - 0 + 1) + 0;" (Ich wills gar nicht in Code-Tags setzen)

Also:
- stell dich auf eine Sprache ein, nicht Gegner, Hero, Kampf
- schreib Klassen
- ...
Ich sag's mal so: das einzig positive, das mir aufgefallen ist: kein globales using namespace std;
Alles andere ist ehrlich gesagt Schrott, lern lieber erst mal die grundsätzlichen Strukturen (genau daran haperts nämlich)
Auch ich muss auf andere verweisen, alle Einzelheiten aufzuzählen.. glaube aber nicht dass sich wer genug Zeit nimmt
Also wie Schlüsselbein: C++ lernen, C++11 anwenden wo geht und bitte keine deutschen Variablennamen mehr..

Padmak
Padmak is offline  
Old 06/03/2013, 19:45   #4
 
Shadow992's Avatar
 
elite*gold: 77
Join Date: May 2008
Posts: 5,430
Received Thanks: 5,878
Quote:
Originally Posted by Schlüsselbein View Post
Source unnötig häßlich wäre der passendere Titel.
Um auf Einzelheiten einzugehen, fehlt mir jetzt die Lust, vielleicht übernimmts ja jemand anders.

Lern die Sprache ordentlich, denk an C++11 und eine einheitliche naming convention - dann schreibe das Ding neu.
Ich bin mir nicht sicher worauf du hässlich beziehst, aber ich finde diese Art von Einrückungs-Stil einfach nur unübersichtlich und hässlich. Wer bitte hat dir das so beigebracht? So viel wie ich weiß, ist das der Stil, der hauptsächlich in Java empfohlen/verwendet wird. Mir jedenfalls missfällt dieser Stil total.

Ich kann nur diese Art von Stil empfehlen (Geschmäcker sind verschieden):
PHP Code:
if (...)
{

}
...

int main()
{
      if (...)
      {
            
FuncAufruf();
      }
      return 
1;

Ein paar Verkürzungen sehe ich direkt auf Anhieb ich schreib es dir mal so kurz und anfängerfreundlich wie möglich (es geht jetzt nur um mögliche Verkürzungen, nicht um besseren Code-Stil!):
PHP Code:
void Gegner()
{

    
GegATK =  rand() % 5  9;
//Gegnerischer Zug
    
if (GegHP <=10 && WinLose==&& GegTrankanzahl==1)
    {
        
GegHP+=Trank;
        
GegTrankanzahl--;
        
std::cout << " >>Der Gegner hat einen Trank genommen und hat wieder "<< GegHP << " HP."<<"    (HP + "<<Trank<<")"<< std::endl <<std::endl;
    }
    else if (
WinLose==0)
    {
        
HeroHP -= GegATK;
        if (
HeroHP>0)
            
std::cout << " >>Der Gegner hat dich angegriffen und du hast noch "<<HeroHP << " HP." <<"    ( - "<<GegATK<<")"<< std::endl<<std::endl;
        else
            
std::cout << " >>Der Gegner hat dich angegriffen und du hast keine HP mehr."<< std::endl<<std::endl;
    }
    
Sleep (sleep);
//Verloren!
    
if (HeroHP<=0)
    {
        
std::cout << "Du hast verloren!" << std::endl;
        
WinLose=1;
    }

PHP Code:
void Hero()
{

    
HeroATK =  rand() % 9;

    
std::cout << "Deine Hp: " << HeroHP <<"    Gegner HP: "  <<GegHP<<std::endl;
    
std::cout << " 0 = Angreifen    1 = Trank nehmen" <<"("<<HeroTrankanzahl<<")"<<std::endl;
    
std::cin >> auswahl;

//Hero's Zug
    
if (auswahl==true)
    {
        if(
HeroTrankanzahl==1)
        {
            
HeroHP += Trank;
            
HeroTrankanzahl--;
            
std::cout << "Du hast einen Trank genommen und hast jetzt " << HeroHP <<"    (HP + "<<Trank<<")"<<std::endl;
            
Sleep (sleep);
        }
        else
        {
            
std::cout << "Du hast keinen Trank mehr "<<std::endl;
            
Sleep (sleep);
            
kampf();
        }

    }
    else
    {
        
GegHP -= HeroATK;
        if (
GegHP>0)
            
std::cout << "Du hast deinen Gegner angegriffen und der hat noch " << GegHP << " HP"<<"    ( - "<<HeroATK<<")"<<std::endl;
        else
            
std::cout <<"Du hast deinen Gegner angegriffen und der hat keine HP mehr."<< std::endl;
        
Sleep (sleep);
    }

//Gewonnen!
    
if (GegHP<=0)
    {
        
std::cout << "Du hast gewonnen!" << std::endl;
        
WinLose=1;
    }

PHP Code:
void kampf()
{
    do
    {
        
Hero();
        
Gegner();
    }
    while(
WinLose==0);

PHP Code:
void kopfoderzahl()
{
    
bMünze =  rand() % 2;
    
std::cout << "            Kopf oder Zahl?\n"
              
<< "Kopf = 0    Zahl = 1" <<std::endl;
    
std::cin >>kopfzahl;

    if (
kopfzahl==0)
        
std::cout << "Du hast \"Kopf\" ausgewaehlt!" << std::endl;
    else
        
std::cout << "Du hast \"Zahl\" ausgewaehlt!" << std::endl;

    
Sleep(1000);

    switch (
bMünze)
    {
    case 
0:
        
std::cout << "Die Muenze liegt bei \"Kopf\"!" <<std::endl;
        break;
    case 
1:
        
std::cout << "Die Muenze liegt bei \"Zahl\"!" <<std::endl;
        break;
    }

    
Sleep(2000);

    if(
bMünze==kopfzahl)
    {
        
std::cout << "Du faengst an!\n";
        
Hero();
    }
    else
    {
        
std::cout << "Der Gegner faengt an!\n";
        
Gegner();
    }

Das wars soweit.
Zusätzlich sind diese ganzen Includes, die du teilweise 2-3x einbinden lässt überflüssig, einmal reicht doch vollkommen.

Ansonsten am Stil gibt es einiges zu bemängeln, nur mal stichartig aufgeführt (Liste ist sicherlich unvollständig):

- Globale Variablen sind möglichst immer zu vermeiden und in deinem Fall sogar 100% vermeidbar.
- Rekursion kann zwar in manchen Situationen gut sein, hier ists aber total überflüssig.
- Sachen, die konstant sind sollte man auch mit const deklarieren (z.B. dein sleep).
- Einheitlicher Funktionsnamenstil ist wichtig (nicht mal den ersten Buchstaben groß und dann bei einer anderen Funktion ihn wieder klein)
- Unnötige Rechnungen selbstwegrechnen (sowas wie 1-0+1 ist total überflüssig, wird vom Compiler zwar eh wegoptimiert, aber macht den Code nicht sonderlich lesbarer)
- Die Funktionen und Variablen sollten klare Bezeichnungen haben, mit Hero() kann kein Mensch etwas anfangen, zumindest nicht auf den ersten Blick.
- Manche meinen reine Nomen sind als Funktionen ungeeignet, liegt aber im Auge des Betrachters
- Code-Teile, die öfter in ähnlicher Art und Weise benötigt werden, sollten zu Funktionen zusammengefasst werden (wenn nötig mit Parametern).
- Klassen wären, wenn man wirklich reines C++ programmieren will auch empfehlenswert, bei C/C++ denke ich sind Klassen nicht das was du zuerst ausbessern solltest, besser wärs dennoch
...

Mehr ist sicher auszustzen, mach jetzt aber erstmal Schluss.
Shadow992 is offline  
Thanks
2 Users
Old 06/04/2013, 05:20   #5

 
Delinquenz's Avatar
 
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
Quote:
Ich kann nur diese Art von Stil empfehlen (Geschmäcker sind verschieden):
Sofern er wenigstens einen einheitlichen Stil verfolgen würde, der mit Einrücken funktioniert, wäre das ja noch ok. Aber selbst das kommt nicht zustande. Achja, afaik schreibt man Makros groß.

Quote:
So viel wie ich weiß, ist das der Stil, der hauptsächlich in Java empfohlen/verwendet wird. Mir jedenfalls missfällt dieser Stil total.
Jo, große Klassen/Funktionsnamen und Camelcase kommt auch aus Java. Sofern man einheitlich codet, soll man es eben nutzen.
Delinquenz is offline  
Old 06/04/2013, 13:24   #6
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by Delinquenz View Post
Sofern er wenigstens einen einheitlichen Stil verfolgen würde, der mit Einrücken funktioniert, wäre das ja noch ok. Aber selbst das kommt nicht zustande. Achja, afaik schreibt man Makros groß.


Jo, große Klassen/Funktionsnamen und Camelcase kommt auch aus Java. Sofern man einheitlich codet, soll man es eben nutzen.
camelCase ist meiner Meinung nach auch in C und C++ sehr verbreitet, allerdings meist nur bei Variablen.
Ich finde auch das sieht viel besser aus als sowas: camel_case.

Was genau meinst du mit große Klassen- und Funktionsnamen? Funktionen und Klassen fangen bei mir und wohl auch den meisten anderen ausschließlich mit einem Großbuchstaben an (natürlich STL und Boost ausgenommen).

Interface Klassen heißen bei mir immer so ISomeClass, C und S-Klassenprefix mach ich nicht, genauso wenig wie die hässliche ungarische Notation.

Globale Variablen fangen bei mir immer mit // an, Klassenvariablen so wie m_someValue.

#defines solltest du immer in GROSS_BUCHSTABEN schreiben und außerdem vermeiden.
Master674b is offline  
Thanks
1 User
Old 06/04/2013, 13:39   #7


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Hä, ein Variablenname kann mit // beginnen? Ich nutze da g_globVar, aber das ist ja Geschmackssache.
Konstanten (die man Defines ohnehin vorziehen sollte) gehören natürlich ebenso gecaps'ed ;O
MrSm!th is offline  
Old 06/04/2013, 16:10   #8
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by MrSm!th View Post
Hä, ein Variablenname kann mit // beginnen? Ich nutze da g_globVar, aber das ist ja Geschmackssache.
Konstanten (die man Defines ohnehin vorziehen sollte) gehören natürlich ebenso gecaps'ed ;O
jo aber vordem musst du noch // oder /* machen:

Quote:
The names of global variables should start with //.
Master674b is offline  
Old 06/04/2013, 16:41   #9
 
.SkyneT.'s Avatar
 
elite*gold: 273
Join Date: Sep 2010
Posts: 1,831
Received Thanks: 786
Quote:
Originally Posted by MrSm!th View Post
Hä, ein Variablenname kann mit // beginnen?
Ich vermute(hoffe) das soll eine Anspielung darauf sein, keine globalen
Variablen zu verwenden
.SkyneT. is offline  
Old 06/04/2013, 16:49   #10

 
Delinquenz's Avatar
 
elite*gold: 0
Join Date: Jan 2009
Posts: 1,160
Received Thanks: 232
Quote:
The names of global variables should start with //.
Musste lachen

Quote:
Was genau meinst du mit große Klassen- und Funktionsnamen? Funktionen und Klassen fangen bei mir und wohl auch den meisten anderen ausschließlich mit einem Großbuchstaben an (natürlich STL und Boost ausgenommen).
Die STL sollte aber den Coding-Stil nach außen hin repräsentieren, oder sehe ich das falsch?
Delinquenz is offline  
Old 06/04/2013, 17:03   #11
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by Delinquenz View Post
Musste lachen


Die STL sollte aber den Coding-Stil nach außen hin repräsentieren, oder sehe ich das falsch?
Das hängt halt alles davon ab mit was man bisher so alles gearbeitet hat, das schwappt dann irgendwann einfach so auf einen über. Ich hab früher auch die ungarische Notation benutzt und mich nun aber davon verabschiedet.

Der Grund war recht simpel: Früher viel mit Windows Zeug zu tun gehabt und dann aber mal eingesehen das es nur meinen Lesefluss stört und das es viel besser aussieht ohne. Außerdem mal mit der Maus über nen Variablennamen fahren reicht schon um zu wissen was es fürn Typ ist. Intellisense ftw.

Das wichtigste ist: arbeitet man mit mehreren Leuten an einem Projekt, sollte man Coding-Guidelines aufstellen an die man sich zu halten hat. Einheitlich muss es immer sein, ganz wurscht wie das nun aussieht. Ich wette bei den MS Entwicklern passt auch nicht jedem die Naming Convention, dennoch ist das immer schön gleichmäßig, das wäre n totales Chaos wenn nicht.
Master674b is offline  
Old 06/04/2013, 17:26   #12
 
_Roman_'s Avatar
 
elite*gold: 0
Join Date: May 2010
Posts: 1,620
Received Thanks: 237
Und was wäre eigentlich na andere Möglichkeit als globale Variablen. Sagen wir mal, z. B. bei der WINAPI hat man die HWND Variable für das Hauptfenster in der WinMain definiert und man braucht die dann bei irgendeiner Funktion (nicht in der WndProc Funktion, da hwnd ja als Parameter gegeben ist). Ich kenne da nur die Möglichkeit, eine globale Variable zu machen.
_Roman_ is offline  
Old 06/04/2013, 17:46   #13
 
Master674b's Avatar
 
elite*gold: 0
Join Date: Dec 2012
Posts: 255
Received Thanks: 110
Quote:
Originally Posted by _Roman_ View Post
Und was wäre eigentlich na andere Möglichkeit als globale Variablen. Sagen wir mal, z. B. bei der WINAPI hat man die HWND Variable für das Hauptfenster in der WinMain definiert und man braucht die dann bei irgendeiner Funktion (nicht in der WndProc Funktion, da hwnd ja als Parameter gegeben ist). Ich kenne da nur die Möglichkeit, eine globale Variable zu machen.
Dafür hast du dann eine Fensterklasse, die die Variable m_hWnd definiert. Dann fügst du noch eine GetHWND methode hinzu und fertig. Die Fensterklasse kann z.B. außerdem im Konstruktor das Fenster erstellen etc.
Master674b is offline  
Thanks
1 User
Old 06/04/2013, 17:47   #14
 
Padmak's Avatar
 
elite*gold: 58
Join Date: Jun 2008
Posts: 2,311
Received Thanks: 8,420
Singletons!
Du kannst ja trotzdem teils Klassenbasiert programmieren, globale Variablen braucht man für sowas eigentlich nich^^

€: ****. Too late^^

Padmak
Padmak is offline  
Thanks
1 User
Old 06/04/2013, 20:10   #15


 
MrSm!th's Avatar
 
elite*gold: 7110
Join Date: Jun 2009
Posts: 28,902
Received Thanks: 25,407
Wtf, Singletons? Man gibt den hwnd den Funktionen einfach als Parameter oO

@globale Variablen
Und ich war mal wieder zu inkompetent, es zu verstehen :<
Quote:
Originally Posted by Delinquenz View Post
Musste lachen


Die STL sollte aber den Coding-Stil nach außen hin repräsentieren, oder sehe ich das falsch?
Was nach außen? Jeder kann ja seinen Stil selbst festlegen.
MrSm!th is offline  
Thanks
2 Users
Closed Thread


Similar Threads Similar Threads
[TUT SOURCE] Offi Schrift trots LANG 1 (ENG)
11/26/2012 - Flyff PServer Guides & Releases - 9 Replies
Hallo wenn ihr die Offi Schrift haben wollt ohne den Versatz im Char-Status Fenster geht in die Wndfield.cpp in Zeile 10521 und macht dort aus: if( ::GetLanguage() == LANG_FRE || ::GetLanguage() == LANG_GER ) einfach: if( ::GetLanguage() == LANG_FRE || ::GetLanguage() == LANG_ENG )
Unnötig
08/17/2011 - WarRock - 4 Replies
Da so viele Leute unnötige Threads öffnen und dafür Thanks bekommen wollt ich das auch mal machen =) :mofo:
[Source Problem] Source auf LANG 6 compilien [D-Flyff Font]
04/13/2011 - Flyff Private Server - 10 Replies
Hey Leutz, ich komme da mal mit nem mehr oder weniger kleinen Problem. Aufgrund der Misserfolge nur die Neuz in LANG 6 zu compilien, hat man mir geraten die kompletten Bins auf LANG 6 zu setzen. Seitdem funktioniert die D-Flyff Schrift super, es ist nichts verrutscht, Login klappt auch etc. Problem ist jetzt nur das ich keine inGame Rechte mehr habe. Habe extra neuen acc erstellt, neuen char bin sämtliche Operatoren ( L, M, N, O, P, Z) durchgegangen nur leider habe ich immer noch...



All times are GMT +1. The time now is 19:00.


Powered by vBulletin®
Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
SEO by vBSEO ©2011, Crawlability, Inc.
This site is protected by reCAPTCHA and the Google Privacy Policy and Terms of Service apply.

Support | Contact Us | FAQ | Advertising | Privacy Policy | Terms of Service | Abuse
Copyright ©2025 elitepvpers All Rights Reserved.