Der Anfänger Thread



  • Hallo,

    ich bin absoluter neuling in Sachen C++ doch will es unbedingt mal lernen.

    ich hab hier einen Programmschnipsel wo ich grad nicht verstehen kann warum dies nich funktioniert -.-

    char eingabe;
    
     do
       {
        clrscr();
        cout<<"\n\tWaehlen Sie Ihren gewuenschten Schwierigkeitsgrad aus:"
            <<"\n\tFuer leicht (Feld:  8x 8) druecken Sie die Taste\t[l] bzw. [L]"
            <<"\n\tFuer mittel (Feld: 10x10) druecken Sie die Taste\t[m] bzw. [M]"
            <<"\n\tFuer schwer (Feld: 12x12) druecken Sie die Taste\t[s] bzw. [S]\n\t";
        cin>>eingabe;
       }while(eingabe!='l','L','m','M','s','S');
    

    das sollte doch bedeuten, so lange die eingabe ungleich l, L, m, M, s und S ist soll das wiederholt werden.
    Doch wenn einer dieser Tasten gedrück wird soll die variable eingabe den wert in eine switch anweisung mitgenommen werden doch der borland builder kommt mit einer meldung:
    [C++ Warnung] Unit1.cpp(62): W8066 Code wird nie erreicht

    was auf die zeile nach meinem programmcode kommt.

    ich versteh grad nicht warum das so ist.

    DANKE schon einmal für eure hilfe

    MfG Search&Destroy

    P.S. ich geh mal davon aus das noch mehr solcher fragen kommen und ich danke schon einmal für eure gedult 🙂



  • while(eingabe!='l','L','m','M','s','S');
    

    Hi, Das funktioniert leider in C++ nicht so.
    Es muss wenn so aussehen:

    while(eingabe!='l' && eingabe!='L' && eingabe!='m' /*usw.*/);
    


  • vielen dank für die schnelle lösung.
    hat ohne weitere Probleme geklappt. 👍 👍

    was ich vergessen habe zu frage ist:
    welche werte (ich geh mal davon aus das die auch normale ASCII Werte sind) haben die richtungstasten (links, rechts, oben und unten) und die Return (Enter) taste.

    ich weis nur das solche sondertasten 2 werte haben und dass der erste wert 0 sein sollte, soweit richtig?

    //EDIT
    hab grad kurz was ausprobiert.

    kann es sein das die werte folgende sind?
    links: 075
    rechts: 077
    unten: 080
    oben: 072
    Return: 13



  • http://www.c-plusplus.net/forum/viewtopic-var-t-is-39324.html

    Ja, sind sie ( ohne die NULL am Anfang ) ...

    Jetzt gehe ich aber schlafen :xmas1:



  • so ich habe wieder eine weitere Frage:

    wie ist es möglich das er beim generieren einer zufallszahl im bereich von sagen wir mal 100 oder 1000 eine zahl nicht 2 mal erzeugt.

    denn ich bin gerade drüber schiffe versenken zu programmieren und der PC soll nicht 2 mal ins selbe ziel schießen.

    ich weis man braucht dafür:

    randomize();

    und

    random(100);

    währ klasse wenn mir jemand ein ausschlussverfahren für zufallszahlen erklären könnte bzw. mir ein fertiges zeigt.



  • Du mußt dir mitschreiben, welche Zahlen schon gezogen wurden und im Notfall mochmal neu ziehen:

    set<int> zahlen;
    int zzahl;
    if(zahlen.size()==100)// bereits alle möglichen Werte gefunden
      zzahl=random(100);
    else
      do
        zzahl = random(100);
      while(zahlen.find(zzahl)!=zahlen.end());
    
    zahlen.insert(zzahl);
    ...
    

    (eine Alternative wäre es noch, einen vector mit allen möglichen Werten zu füllen und per random_shuffle zu verwürfeln)



  • Hallo

    Zuerst musst du den Zufallsgenerator initialisieren:

    srand(time(NULL));
    

    und zwar genau einmal (Programmstart)

    Dann könntest du alle Zufallszahlen in einen Array packen und jede neue prüfen, ob sie bereits gezogen wurde:

    std::vector<int> Zufallszahlen;
    //Ziehung der Zahl:
    int Zahl = rand()%100; //Zahlen zwischen 0 und 99
    bool Vorhanden = false;
    //prüfen, ob Zahl bereits vorhanden
    for(int i=0; i<Zufallszahlen.size(); ++i)
        if(Zahl == Zufallszahl[i])
            Vorhanden = true;
    if(!Vorhanden)
    {
        //diese Zahl nun in das Array schieben
        Zufallszahlen.push_back(Zahl);
        //und loslegen
    }
    

    Das ist nicht fertig. Du musst natürlich für jede Zahl die Prüfung machen und so weiter. Nur ein kleiner Denkanstoss.

    chrische



  • da waehre auch eine KI denkbar, und zwar wenn er etwas getroffen hat das er in diesem umkreis weiterhin nach dem schiff sucht bis es versenkt ist



  • chrische5
    vielen dank 👍

    jetzt muss ich mir nur was überlegen wie ich es anstelle dass automatisch schiffe per zufall gesetzt werden dann kann ich das gleich übernehmen.

    Mr Evil
    yoa das währe mein nächster schritt aber erst eines nach dem anderen 😉



  • Du erzeugst das Schiff (Startposition x und y sowie Lage (N/S oder O/W)) mit Zufallswerten, prüfst nach, ob es an dieser Stelle Platz findet und trägst es in das Spielfeld des Computers ein (wenn du eine illegale Position getroffen hast - nochmal versuchen).



  • hab mich jetzt heut erst (ich weis is schon lange her) rangesetzt und wollte das mit den zufälligen schießen testen (hab es mir vorher eigentlich noch gar net angeschaut).

    ich habe leider keinen plan vom programmieren mit vectoren (weis deshalb schonmal nicht was ich mit std::vector anfangen soll (da kommt ne fehlermeldung: 'vector' ist kein element von 'std')).

    chrische5
    deshalb wüsste ich nicht wie ich mit umgehen soll.
    vllt währe da noch ein kleiner denkanstoss recht hilfreich

    ich brauch das mit dem zufälligen ja auch noch, wenn die schiffe des PCs von allein gesetzt werden sollen, da darf auch nix doppelt sein.

    P.S. wie gesagt ich bin blutiger anfänger und hab noch fast keine ahnung vom programmieren.



  • Hallo

    Wenn du vector benutzen willst, musst du nich den Header <vector> inkludieren.

    Für den Rest solltest du dir das durchlesen:

    http://www.c-plusplus.net/forum/viewtopic-var-t-is-143816.html

    chrische



  • Du meinst "noch" und nicht "nich"?



  • hallo,
    ich habe auch eine frage.
    ich habe das buch Spieleprogrammieren mit C++ und Genesis3d für kids
    jetzt frage ich ob mir jemand den gesammten quelltext für ein leeres "windowsfenster" gibt?
    wäre nett
    euer neuling



  • C++ kennt keine "windowsfenster". Da musst du schon im entsprechenden Forum für dein System bzw. deinem verwendeten Framework nachschauen.



  • jetzt frage ich ob mir jemand den gesammten quelltext für ein leeres "windowsfenster" gibt?

    http://www.henkessoft.de/C++/WinAPI/WinAPI Kapitel 1 bis 6/api2.htm
    Hierzu musst Du nur Zugriff auf "windows.h" haben.



  • Also im buch ist folgendes:

    //-----------------------------------------------------------------------------
    //Header mit Klassendeklaration von G3DGame
    //-----------------------------------------------------------------------------
    #include <windows.h>
    #include "include\genesis.h"

    class TGame
    {
    public:
    //Eigenschaften
    geEngine *Engine;
    geWorld *World;
    geCamera *Camera;
    geDriver *Driver;
    geDriver_Mode *DMode;
    geXForm3d XForm;
    bool isRunning;
    //Methoden
    void CreateGame (void);
    void RunGame (void);
    void FreeGame (void);
    void SetDriver (void);
    void ExitError (char *Txt);
    };

    //Pfad- und Dateinamen
    const char *Pfad = ".\\levels\";
    const char *BSP_Datei = "World0.bsp";
    const char *GVersion = "GPlay1";
    const int MaxWidth = 640;
    const int MaxHeight = 480;

    HWND GHandle; //Handle des "Spielfensters"

    #include "Skelett.h"
    LRESULT CALLBACK WndProc (HWND hWnd,
    UNIT iMessage, WPARAM wParam, LPARAM lParam);
    int WINAPI WinMain
    (HINSTANCE hInstance, HINSTANCE hPrevInstance,
    LPSTR lpCmdLine, int nCmdShow)
    {
    WNDCLASS Win;
    MSG msg;
    Win.cbClsExtra = 0;
    Win.cbWndExtra = 0;
    Win.hInstance = hInstance;
    Win.hIcon = LoadIcon(hInstance, IDI_APPLICATION);
    Win.hCursor = LoadCursor(NULL, IDC_ARROW);
    Win.hbrBackground =
    (HBRUSH)GetStockObject (BLACK_BRUSH);
    Win.style = CS_HREDRAW | CS_VREDRAW;
    Win.lpfnWndProc = WndProc;
    LRESULT CALLBACK WndProc (HWND hWnd,
    UINT iMessage, WPARAM wParam, LPARAM lParam)
    {
    switch (iMessage)
    {
    case WM_KEYDOWN;
    {
    switch (wParam)
    {
    case VK_ESCAPE:
    {
    PostMessage(hWnd, WM_QUIT, 0, 0);
    }
    }
    }
    default:
    return DefWindowProc
    (hWnd, iMessage, wParam, lParam);
    }
    return 0;
    }
    Win.lpszClassName = "???";
    Win.lpszMenuName = NULL;
    RegisterClass (&Win);
    GHandle = CreateWindow (Win.lpszClassName,
    "Windows Minimum - [Esc]=Ende", WS_TILED,
    CW_USEDEFAULT, CW_USEDEFAULT, MaxWidth,
    MaxHeight, NULL, NULL, hInstance, NULL);
    if (!GHandle)
    {
    return 0;
    }
    ShowWindow (GHandle, nCmdShow);
    UpdateWindow (GHandle);
    isRunning = true;
    while (isRunning)
    {
    while
    (PeekMessage (&msg, NULL, 0, 0, PM_NOREMOVE))
    {
    if (!GetMessage(&msg, NULL, 0, 0))
    {
    isRunning = false;
    break;
    }
    TranslateMessage (&msg);
    DispatchMessage (&msg);
    }
    }
    return 1;
    }

    aber bei mir geht das einfach nicht 😞



  • "Geht nicht" ist keine Fehlerbeschreibung. Was erscheint denn im Protokollfenster, wenn du das Projekt baust? (Fehlermeldungen?)



  • [C++ Fehler] Fenster.cpp(5): E2209 include-Datei 'include\genesis.h' kann nicht geöffnet werden
    [C++ Fehler] Fenster.cpp(11): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(11): E2139 In Deklaration fehlt ;
    [C++ Fehler] Fenster.cpp(12): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(12): E2139 In Deklaration fehlt ;
    [C++ Fehler] Fenster.cpp(13): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(13): E2139 In Deklaration fehlt ;
    [C++ Fehler] Fenster.cpp(14): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(14): E2139 In Deklaration fehlt ;
    [C++ Fehler] Fenster.cpp(15): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(15): E2139 In Deklaration fehlt ;
    [C++ Fehler] Fenster.cpp(16): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(16): E2139 In Deklaration fehlt ;
    [C++ Fehler] Fenster.cpp(35): E2209 include-Datei 'Skelett.h' kann nicht geöffnet werden
    [C++ Fehler] Fenster.cpp(37): E2303 Typname erwartet
    [C++ Fehler] Fenster.cpp(52): E2451 Undefiniertes Symbol 'WndProc'
    [C++ Fehler] Fenster.cpp(53): E2108 Ungültige Verwendung von typedef 'LRESULT'
    [C++ Fehler] Fenster.cpp(53): E2379 In Anweisung fehlt ;
    [C++ Fehler] Fenster.cpp(87): E2451 Undefiniertes Symbol 'isRunning'



  • Deine Nachrichtenfunktion für das Hauptfenster steht ja mitten in WinMain. So geht das natürlich nicht. Setze diesen Teil

    LRESULT CALLBACK WndProc (HWND hWnd,
    UINT iMessage, WPARAM wParam, LPARAM lParam)
    {
    switch (iMessage)
    {
    case WM_KEYDOWN;
    {
    switch (wParam)
    {
    case VK_ESCAPE:
    {
    PostMessage(hWnd, WM_QUIT, 0, 0);
    }
    }
    }
    default:
    return DefWindowProc
    (hWnd, iMessage, wParam, lParam);
    }
    return 0;
    }
    

    einfach mal vor WinMain. Und benutze das nächste mal bitte Code Tags. Ansonsten ist der Code einfach unleserlich, und keiner hat Lust, sich den anzuschauen.


Anmelden zum Antworten