Der Anfänger Thread



  • 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.



  • [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(38): E2040 Deklaration nicht ordnungsgemäß abgeschlossen
    

    so schon wieder ne schwette voller fehler.. 😞



  • 'include\genesis.h' kann nicht geöffnet werden
    'Skelett.h' kann nicht geöffnet werden

    Das musst Du offenbar richtig einbinden. Schau erst mal bei Optionen oder Einstellungen oder Verzeichnissen, ob dort alles richtig eingestellt ist.



  • Entschuldigung, ich bin ein BlutigerAnfänger!
    wie kann ich den dort das verzeichniss angeben?



  • Welcher Compiler bzw. welche IDE benutzt du?

    In VC++ 2003 mußt du das Genesis-Include-Verzeichnis hier eintragen:
    Extras->Optionen->Projects->C++ Verzeichnisse
    Und dort in der Combobox Includeverzeichnisse.

    Genesis hat sicherlich auch Library-Dateien (*.lib), das Verzeichnis auch dort unter Bibliotheksdateien hinzufügen.

    Aber sowas steht eigentlich meistens in den Readme's oder Dokumentation der Bibliotheken (in deineem Fall Genesis3D)... meistens jedenfalls.



  • Schau Dich bei Deinem "Werkzeug" genau im Menü um, sonst wirst Du ständig solche Pannen erleben.


Anmelden zum Antworten