Hilfe bei programmierung eines kleinen Spiels - C++ Windows forms

C

Crymes

Guest
Hallo,

Ich habe vor, mein Konsolen Spiel benutzerfreundlich auf eine Oberfläche zu portieren.
Es geht um ein kleines Programm, das Zufallszahlen erstellt, die ndann erraten weerden müssen.
Das Problem ist, dass ich noch nie so eine Forms Anwendung mit C++ erstellt hab.

Meine ersten Fragen:

Stehen die eingebundenen Biblitheken ganz oben richtig?
Kann man da auch seine Funktionen deklarieren?
Wie programmiere ich einen Zufallsgenerator? (Das srand(time(NULL) geht nicht :( )

Freue mich sehr über Hilfe :daumen:
Anhang anzeigen 525538
 
Hi,
also eigentlich ist srand() schon der richtige Weg, ich habe aber auch gearde keine Zeit, mich das nochmal einzulesen, aber ich hbae hier mal nen bisschen Source-Code, der diese Funktion auch nutzt, vielleicht, findeste da deinen Fehler:

Code:
#include <iostream>
#include <sstream>
#include <vector>
#include <time.h>
#include <algorithm>
#include <stdlib.h>
using namespace std;

int main(int argc, char* argv[])
{
    istringstream isst;
    int parameter;
    int zufallszahl;
    int ergebniss;
    vector<int> zahlen;
    vector<int>::iterator position_zahl, nach_erste_ebene;
    int Anzahl;
    
    ergebniss = 0;
    
    isst.str( argv[1] );                      
    isst >> parameter;
    srand ( time(NULL) ); 
    
    for(int i = 0;i < parameter; ++i)
    {
        zufallszahl = rand() % 10 + 1;
        zahlen.push_back(zufallszahl);
    }
    
    for(vector<int>::iterator erste_ebene = zahlen.begin(); erste_ebene != zahlen.end(); ++erste_ebene)
    {
        nach_erste_ebene = erste_ebene+1;
        Anzahl = count(zahlen.begin(), zahlen.end(), *erste_ebene);
        --Anzahl;
        if (Anzahl > 0)
        {
            for (int nummer = Anzahl; nummer != 0; --nummer)
            {
                position_zahl = find(nach_erste_ebene, zahlen.end(), *erste_ebene);
                zahlen.erase(position_zahl);
            }
        }
    }
    
    for (vector<int>::iterator it = zahlen.begin(); it != zahlen.end(); ++it) 
    {
        cout << *it;
        if (it != zahlen.end()-1)
            cout << " + ";
    }
    
    for(vector<int>::iterator position = zahlen.begin(); position != zahlen.end(); ++position)
    {
        ergebniss = ergebniss + *position;
    }
    cout << " = " << ergebniss << endl;
    
}
 
Bei mir kommt immer folgender Fehler:

error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt.
 
Wenn ich srand mit deinen includes in meinen Windows-Forms Code setze.
Bei der Konsole hat srand bei mir auch immer funktioniert, nur (kann das mit .NET zusammenhängen?) jetzt nicht mehr.
 
Leute, kann es sein, dass ich mich hier mit einer exotischen Programmiersprachenkombination abfinde?
Könnt ihr mir sagen, was gerade so üblich ist?

Ich möchte eigentlich nur (fürs Lernen) benutzerfreundliche Programme entwickeln, die nicht in so ner öden Konsole laufen.

Mit was ist denn Steam, Catalyst, CPU-Z usw. programmiert worden?
 
Leute, kann es sein, dass ich mich hier mit einer exotischen Programmiersprachenkombination abfinde?
Könnt ihr mir sagen, was gerade so üblich ist?

Ich möchte eigentlich nur (fürs Lernen) benutzerfreundliche Programme entwickeln, die nicht in so ner öden Konsole laufen.
Was ich so mitbekommen habe, versuchst du dich an C++ .NET (aka "Managed C++" - das ist kein reines C++, sondern C++ basierend auf .NET!). Ich persönlich mag diese Kombination überhaupt nicht und finde sie ziemlich hässlich, ist aber halt mein subjektives Empfinden. Sehr angenehm ist beispielsweise C#. Damit kann man auch sehr viel machen. Alternativ Java (wobei hier GUI-Programmierung evtl. etwas komplizierter ist, zumindest wenn man C# gewöhnt ist). Wenn du bei "echtem" C++ bleiben willst, schau dir mal Qt an.

Mit was ist denn Steam, Catalyst, CPU-Z usw. programmiert worden?
In der Regel C++ (ob und welche Frameworks/Libs die zusätzlich nutzen, kann ich momentan aber nicht sagen).
 
Also würdest du mir C# mit .NEt empfehlen?
Hab das mal bei einer Anzeige von Dice gelesen, dass man neben C++ auch da Kenntnisse haben muss, scheint also auch noch ziemlich aktuell zu sein?
 
erst einmal gibt es ein paar Grundgleichungen zu lernen:
C++ != C++.NET
Genau so wie VisualBasic != BASIC

C++.Net ist imo eine ziemlich komische Kombination da es C++ seiner letzten Vorteile, die Geschwindigkeit durch direkten Hardwarezugriff, beraubt. Da kann man auch gleich C# nehmen.
 
Also, dann werde ich mich mal mit C# beschäftigen :ugly:

Ist das für mich besser, wenn ich mich an .NET versuch oder erst mein "Spiel" in der Konsole neu schreib?
 
Wenn du C++ lernen willst dann lass halt .NET sein. Wenn du schnell ein Programm mit schnieker Oberfläche programmieren willst(was nicht böse ist, auch wenn das manch hardcore Progger vielleicht gleich schreiben wird) versuch es mit C#.

Tipp am Rande zu Zufallszahlen:
Dafür braucht es nun wirklich keine vorgefertigte Funktion. Einfach irgend einen schnellen Timer(bzw Systemzeit in ms) nehmen und mit Modulo auf den gewünschten Wertebereich stutzen.
 
-> in C# kommt man sehr schnell rein und hat auch sehr schnell gute Ergebnisse, allerdings fällt es danach schwerer sich z.B. wieder mit C++ anzufreunden, was definitiv aufwendiger ist. (Ich habe allerdings auch den Anfang mit C# gemcht und bin nun dort wieder angekommen ;) )

-> Probier dein SPiel mal in C# umzusetzen (da gibts ja auch ne Konsole :D ) und sonst bleib bei C++ ABER dann auch richtiges C++! C++.NET passt wirklich nicht gut zusammen, denn C++ ist eigentlich nicht für .NET gemacht. C# war von Anfang an eine Grundsprache für .NET.

-> Falls dein Spiel auch in andere Dimensionen gehen soll, dann schau dir mal SlimDX an, damit arbeite ich im Moment und bin .. naja "begeistert" :daumen:
 
OK, Ich nehm jetzt C# .Net . Ihr müsst wissen, ich programmier eigentlich nur aus Laune und zum Lernen (vielleicht brauchts man später noch?), deshalb mögen meine Projekte sinnlos erscheinen:)
 
mal die erste Frage: Wie definiere ich am einfachsten globale Variablen?
Ich weiss, dass ich die in einem event als public kennzeichnen kann, geht das nicht auch C++ ähnlicher, dass man die am Anfang des Programms hinschreibt?:hail:
 
Eine globale variable definierst du ,wie schon richtig geschrieben, indem du public davor schreibst. Was soll da einfacher gehen?

Es ist aber "unschick" direkt auf Variablen einer anderen Klasse zu zu greifen. Stattdessen setzt man die Variablen private und bietet set- und get-Funktionen die dann wiederum public sind.
 
Naja, ich bin es gewöhnt,dass man die einfach ausserhelb eines Events (in c++ Funktion) hinschreibt und dann überall verwenden kann?
 
Zuerst einmal:
Ereignis ist nicht gleich Funktion. Ein Ereignis kann eine Funktion auslösen, ist aber selbst keine.

Eine der großen Verbesserungen von Java, C# etc. ist eben dass nicht jede Variable überall ansprechbar ist(Stichwort: Kapselung). Es kann nämlich ziemlich ungemütlich werden wenn der Falsche auf die falsche Variable greift.
 
Ich hab schon das erste Problem, hier mein Code:

Code:
[FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2]
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]private[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]void[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] button1_Click([/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]object[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] sender, [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]EventArgs[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] e)
{
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]string[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] eingabe;
[/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff][FONT=Consolas][SIZE=2][COLOR=#0000ff]int[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2] eingabe2;
eingabe = textBox1.Text;
eingabe2 = [/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af][FONT=Consolas][SIZE=2][COLOR=#2b91af]Convert[/SIZE][/FONT][/SIZE][/FONT][/SIZE][/FONT][FONT=Consolas][SIZE=2][FONT=Consolas][SIZE=2].ToInt16(eingabe);
textBox1.Clear();
[/SIZE][/FONT][/SIZE][/FONT]

Wenn ich in die textBox1 ein Buchstabe oder klange Zahlen eingeb, stürzt das Programm ab (oder hält an, wie man will).
Woran liegt das?
 
Convert.ToInt16 konvertiert das Argument in eine 16-Bit Ganzzahl (maximal 32.767, da es sich um einen signed int handelt -> Vorzeichen braucht auch ein Bit). Wenn du nun einen Zahl angibst, die größer als besagte 32.767 ist oder es überhaupt keine Zahl ist (String) wird entweder ein falscher Wert angenommen oder es fliegt eine Exception (Ausnahme). Das musst du natürlich beachten und ggf. behandeln.
 
Gibt es eine Möglichkeit zu Prüfen, ob die Eingabe ein unerwünschtes Zeichen (Buchstabe, etc) beinhaltet?
Dann könnte ich da ja eine Messagebox anzeigen.

Vielleicht so in der Art: bekopmme integer, wenn das Fehlschlägt, dann melde Fehler/zeige MEssageBox?
 
Zurück