Hilfe bei Studienarbeit



  • Liebe C-Community,

    da auch ein Maschinenbaustudent nicht ohne ein Basiswissen in der EDV auskommt, gibt es während des Studiums 2 EDV-Projekte. Das erste habe ich erfolgreich abgeschlossen. Nun sitze ich völlig planlos am zweiten und bräuchte eure Hilfe.

    Ich soll ein kleines (???) Spiel programmieren:
    ---
    Hier mal eine Skizze: https://fotoalbum.web.de/gast/stuttgart.michael/Spiel

    Der Computer schießt eine Kugel unter einem festen Winkel und einer festen Anfangsgeschwindigkeit oder mit einem zufälligen Winkel und einer zufälligen Anfangsgeschwindigkeit. Zufällig/Fest soll über ein Menü wählbar sein.

    Der Zielbalken läuft permanent hin und her.

    Der Spieler muss wenn der Computer gefeuert hat eine Taste drücken, dann öffnet sich ein Menü. In diesem Menü gibt er Anfangsgeschwindigkeit und Abschusswinkel ein. Die Kugel wird abgeschossen.

    Trifft der Spieler den Zielbalken, poppt ein Dialogfenster auf und teilt ihm "Treffer oder so" mit. Es ist eine Highscoreliste zu fürhen.

    Nach einem Schuß soll es die Möglichkeit geben, sich die Bewegung des Ziels und der Kugel nochmals anzuschauen.
    ---

    Das sind so im Wesentlichen die Vorgaben. Mein Problem ist jetzt, dass ich keine Ahnung hab wie anzufangen ist. Die Bewegung würde ich physikalisch über den schiefen Wurf definieren.
    Wenn Ihr mir einzwei Tipps zum vorgehen geben könnet, wäre ich sehr dankbar.

    Viele Grüße
    Michi



  • Erste Frage die ich mir beim lesen gestellt habe, welche Sprache soll es denn sein?
    Ich meine du hast zwar deine Frage im C# .Net Forum gestellt, begrüßt uns dann aber mit der C-Gemeinde, du solltest uns also erstmal mitteilen mit welcher Sprache das gelöst werden soll, oder ist es doch frei wählbar?



  • Hallo,

    ja das war ein Bug von mir. Die Sprache soll Standart C sein.

    Grüße
    Michael



  • Dann bist du im falschen Forum, sicherlich verschiebt dich mal jemand.


  • Administrator

    Und es heisst übrigens Standard mit d.
    Auch solltest du vielleicht ein wenig konkreter werden, was du Wissen möchtest. Denn grundsätzlich wissen wir, dass du ein Spiel machen willst mit der Sprache C. Das ist auch schon mehr oder weniger alles ...
    Da wäre meine Empfehlung: Lies ein Buch über die Spieleprogrammierung mit C, denn ich will hier nicht ein Buch als Beitrag verfassen 😉

    Stell also konkrete Frage dann kann man dir konkrete Antworten geben.

    Grüssli



  • Michael aus Stuttgart schrieb:

    Wenn Ihr mir einzwei Tipps zum vorgehen geben könnet, wäre ich sehr dankbar.
    Michi

    Mir geht es um Tipps zum grundsätzlichen Vorgehen. Zum Beispiel: Mach ein Unterprogramm in dem die X- und Y-Koordinaten ausgerechnet werden ...

    Vielen Dank Dravere für deine Hilfe bezüglich der dt. Sprache. Wenn ich mal wieder ein triviales Problem diesbezüglich habe, komme ich gern wieder auf dich zu. 😉

    Grüße
    Michael


  • Administrator

    Michael aus Stuttgart schrieb:

    Vielen Dank Dravere für deine Hilfe bezüglich der dt. Sprache. Wenn ich mal wieder ein triviales Problem diesbezüglich habe, komme ich gern wieder auf dich zu. 😉

    Besser nicht, ich habe nicht gerade gut abgeschlossen in Deutsch. Ich wollte nur für die Frage voraussorgen, wieso es diese Sternchen eingefügt hat.

    Aber naja, wenn du lieber ironisch wirst, statt konkrete Fragen zu stellen, dann kann ich dir leider nicht helfen. Oder zeig zumindest ein wenig Eigeninitiative.

    Wenn du so allgemein fragst, fällt mir halt auch nur so allgemeines ein wie:
    Du brauchst eine 2D Graphikbibliothek, wie zum Beispiel SFML.

    Grüssli



  • @Dravere: Was ist denn an Michaels Fragen nicht zu verstehen?
    Wenn Du die Fragen nicht umsetzen kannst, dann solltest Du die nicht mit deinen dümmlichen Standard Antworten beantworten.

    Gruß



  • Möglicherweise -den Äußerungen zur Folge- habe ich den Programmieraufwand unterschätzt. Zur Entschuldigung: Mein Prof. traf mal die Aussage dass er die Projekte in 2-4 Stunden (je nach Schwierigkeitsgrad) programmiert. Ich ging eben davon aus das sich mind. ebenso fixe Programmer tummeln. Vielleicht hat er auch ein wenig übertrieben.

    Habt ihr ein Buchtipp für mich? Ihr wisst ja nun wohin es in meiner Projektarbeit gehen soll. Das Buch sollte die Grundlagen behandeln. Darunter verstehe ich die windowsorientierte Programmierung (z.B. Wie programmiere ich eine Windows-Startleiste), die Grundlagen für bewegte Grafikelemente(z.B. Wie programmiere ich den bewegten Zielbalken).Ich steh auf Farbe und Bilder.
    Gibt es vielleicht sogar was vernünftiges, kostenfreies?

    Grüße
    Michael



  • NACHTRAG:

    Das Buch sollte nicht auf eine bestimmte Programmiersoftware z.B. Visual Studio abzielen.



  • Hallo

    Darfst du eine Gui-Bibliothek verwenden?

    chrische



  • Hallo,

    ich habe gerade nochmal nachgelesen. Eine GUI-Bibliothek wurde bei uns in beiden Vorlesungsteilen nicht behandelt. Meiner Meinung nach schließt das aber eine Verwendung nicht grundsätzlich aus. Wenn es also eine große Vereinfachung wäre...

    Grüße
    Michael aus Stuttgart



  • Hallo

    Naja modale Dialogboxen und ein Fenster sind dann schnell erstellt.

    chrische



  • Hallo Michael,

    ihr müßt doch irgendein GUI-Framework verwenden, denn ansonsten dauert alleine die Einarbeitung in eine bestimmte Library Tage oder sogar Wochen.

    Oder wie stellt sich dein Professor sonst die Umsetzung vor (direkt mit der WinAPI???)?

    Welche Entwicklungsumgebung bzw. welchen Compiler verwendest du denn?



  • Th69 schrieb:

    Hallo Michael,

    ihr müßt doch irgendein GUI-Framework verwenden, denn ansonsten dauert alleine die Einarbeitung in eine bestimmte Library Tage oder sogar Wochen.

    Oder wie stellt sich dein Professor sonst die Umsetzung vor (direkt mit der WinAPI???)?

    Welche Entwicklungsumgebung bzw. welchen Compiler verwendest du denn?

    Hallo Th69,

    wir verwenden den Compiler lcc-win32. Die *.rc- bzw. die *.h-Datei habe ich mit Wordpad bearbeitet. Ich vermute das soll so sein, so dass wir wirklich die Basics verstehen - ob das nun sinnvoll ist oder nicht, kann ich nicht entscheiden.

    Zum Weg (Tools) der Umsetzung kann ich nicht viel sagen. Ich kann mal die *.c-Datei posten, die ein Studienkollege in seinem Projekt gebastelt hat:

    /*@@ Wedit generated application. Written Wed Nov 12 09:25:05 2008
     @@header: f:\strassenplanungres.h
     @@resources: f:\strassenplanung.rc
     Do not edit outside the indicated areas */
    /*<---------------------------------------------------------------------->*/
    /*<---------------------------------------------------------------------->*/
    #include <windows.h>
    #include <windowsx.h>
    #include <commctrl.h>
    #include <string.h>
    #include "strassenplanungres.h"
    #include "Prototypen.h"
    
    /*<---------------------------------------------------------------------->*/
    HINSTANCE hInst;		// Instance handle
    HWND hwndMain;		//Main window handle
    
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam);
    /* --- The following code comes from D:\Programme\LCC\lib\wizard\statbar.tpl. */
    
    // Global Variables for the status bar control.
    
    HWND  hWndStatusbar;
    
    /*------------------------------------------------------------------------
     Procedure:     UpdateStatusBar ID:1
     Purpose:       Updates the statusbar control with the appropiate
                    text
     Input:         lpszStatusString: Charactar string that will be shown
                    partNumber: index of the status bar part number.
                    displayFlags: Decoration flags
     Output:        none
     Errors:        none
    
    ------------------------------------------------------------------------*/
    void UpdateStatusBar(LPSTR lpszStatusString, WORD partNumber, WORD displayFlags)
    {
        SendMessage(hWndStatusbar,
                    SB_SETTEXT,
                    partNumber | displayFlags,
                    (LPARAM)lpszStatusString);
    }
    
    /*------------------------------------------------------------------------
     Procedure:     MsgMenuSelect ID:1
     Purpose:       Shows in the status bar a descriptive explaation of
                    the purpose of each menu item.The message
                    WM_MENUSELECT is sent when the user starts browsing
                    the menu for each menu item where the mouse passes.
     Input:         Standard windows.
     Output:        The string from the resources string table is shown
     Errors:        If the string is not found nothing will be shown.
    ------------------------------------------------------------------------*/
    LRESULT MsgMenuSelect(HWND hwnd, UINT uMessage, WPARAM wparam, LPARAM lparam)
    {
        static char szBuffer[256];
        UINT   nStringID = 0;
        UINT   fuFlags = GET_WM_MENUSELECT_FLAGS(wparam, lparam) & 0xffff;
        UINT   uCmd    = GET_WM_MENUSELECT_CMD(wparam, lparam);
        HMENU  hMenu   = GET_WM_MENUSELECT_HMENU(wparam, lparam);
    
        szBuffer[0] = 0;                            // First reset the buffer
        if (fuFlags == 0xffff && hMenu == NULL)     // Menu has been closed
            nStringID = 0;
    
        else if (fuFlags & MFT_SEPARATOR)           // Ignore separators
            nStringID = 0;
    
        else if (fuFlags & MF_POPUP)                // Popup menu
        {
            if (fuFlags & MF_SYSMENU)               // System menu
                nStringID = IDS_SYSMENU;
            else
                // Get string ID for popup menu from idPopup array.
                nStringID = 0;
        }  // for MF_POPUP
        else                                        // Must be a command item
            nStringID = uCmd;                       // String ID == Command ID
    
        // Load the string if we have an ID
        if (0 != nStringID)
            LoadString(hInst, nStringID, szBuffer, sizeof(szBuffer));
        // Finally... send the string to the status bar
        UpdateStatusBar(szBuffer, 0, 0);
        return 0;
    }
    
    /*------------------------------------------------------------------------
     Procedure:     InitializeStatusBar ID:1
     Purpose:       Initialize the status bar
     Input:         hwndParent: the parent window
                    nrOfParts: The status bar can contain more than one
                    part. What is difficult, is to figure out how this
                    should be drawn. So, for the time being only one is
                    being used...
     Output:        The status bar is created
     Errors:
    ------------------------------------------------------------------------*/
    void InitializeStatusBar(HWND hwndParent,int nrOfParts)
    {
        const int cSpaceInBetween = 8;
        int   ptArray[40];   // Array defining the number of parts/sections
        RECT  rect;
        HDC   hDC;
    
       /* * Fill in the ptArray...  */
    
        hDC = GetDC(hwndParent);
        GetClientRect(hwndParent, &rect);
    
        ptArray[nrOfParts-1] = rect.right;
        //---TODO--- Add code to calculate the size of each part of the status
        // bar here.
    
        ReleaseDC(hwndParent, hDC);
        SendMessage(hWndStatusbar,
                    SB_SETPARTS,
                    nrOfParts,
                    (LPARAM)(LPINT)ptArray);
    
        UpdateStatusBar("Ready", 0, 0);
        //---TODO--- Add code to update all fields of the status bar here.
        // As an example, look at the calls commented out below.
    
    //    UpdateStatusBar("Cursor Pos:", 1, SBT_POPOUT);
    //    UpdateStatusBar("Time:", 3, SBT_POPOUT);
    }
    
    /*------------------------------------------------------------------------
     Procedure:     CreateSBar ID:1
     Purpose:       Calls CreateStatusWindow to create the status bar
     Input:         hwndParent: the parent window
                    initial text: the initial contents of the status bar
     Output:
     Errors:
    ------------------------------------------------------------------------*/
    static BOOL CreateSBar(HWND hwndParent,char *initialText,int nrOfParts)
    {
        hWndStatusbar = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER|SBARS_SIZEGRIP,
                                           initialText,
                                           hwndParent,
                                           IDM_STATUSBAR);
        if(hWndStatusbar)
        {
            InitializeStatusBar(hwndParent,nrOfParts);
            return TRUE;
        }
    
        return FALSE;
    }
    
    /*<---------------------------------------------------------------------->*/
    /*@@0->@@*/
    static BOOL InitApplication(void)
    {
    	WNDCLASS wc;
    
    	memset(&wc,0,sizeof(WNDCLASS));
    	wc.style = CS_HREDRAW|CS_VREDRAW |CS_DBLCLKS ;
    	wc.lpfnWndProc = (WNDPROC)MainWndProc;
    	wc.hInstance = hInst;
    	wc.hbrBackground = (HBRUSH)(COLOR_WINDOW+1);
    	wc.lpszClassName = "strassenplanungWndClass";
    	wc.lpszMenuName = MAKEINTRESOURCE(IDMAINMENU);
    	wc.hCursor = LoadCursor(NULL,IDC_ARROW);
    	wc.hIcon = LoadIcon(NULL,IDI_APPLICATION);
    	if (!RegisterClass(&wc))
    		return 0;
    /*@@0<-@@*/
    	// ---TODO--- Call module specific initialization routines here
    
    	return 1;
    }
    
    /*<---------------------------------------------------------------------->*/
    /*@@1->@@*/
    HWND CreatestrassenplanungWndClassWnd(void)
    {
    	return CreateWindow("strassenplanungWndClass","strassenplanung",
    		WS_MINIMIZEBOX|WS_VISIBLE|WS_CLIPSIBLINGS|WS_CLIPCHILDREN|WS_MAXIMIZEBOX|WS_CAPTION|WS_BORDER|WS_SYSMENU|WS_THICKFRAME,
    		CW_USEDEFAULT,0,CW_USEDEFAULT,0,
    		NULL,
    		NULL,
    		hInst,
    		NULL);
    }
    /*@@1<-@@*/
    /*<---------------------------------------------------------------------->*/
    /* --- The following code comes from D:\Programme\LCC\lib\wizard\defOnCmd.tpl. */
    void MainWndProc_OnCommand(HWND hwnd, int id, HWND hwndCtl, UINT codeNotify)
    {
    	switch(id) {
    		// ---TODO--- Add new menu commands here
    		/*@@NEWCOMMANDS@@*/
    		case IDM_EXIT:
    		PostMessage(hwnd,WM_CLOSE,0,0);
    		break;
    
    		case strassenplanung:
    
    					linie_zeichnen(hwnd);
    
    		break;
    	}
    }
    
    /*<---------------------------------------------------------------------->*/
    /*@@2->@@*/
    LRESULT CALLBACK MainWndProc(HWND hwnd,UINT msg,WPARAM wParam,LPARAM lParam)
    {
    	switch (msg) {
    /*@@3->@@*/
    	case WM_SIZE:
    		SendMessage(hWndStatusbar,msg,wParam,lParam);
    		InitializeStatusBar(hWndStatusbar,1);
    		break;
    	case WM_MENUSELECT:
    		return MsgMenuSelect(hwnd,msg,wParam,lParam);
    	case WM_COMMAND:
    		HANDLE_WM_COMMAND(hwnd,wParam,lParam,MainWndProc_OnCommand);
    		break;
    	case WM_DESTROY:
    		PostQuitMessage(0);
    		break;
    	default:
    		return DefWindowProc(hwnd,msg,wParam,lParam);
    	}
    /*@@3<-@@*/
    	return 0;
    }
    /*@@2<-@@*/
    
    /*<---------------------------------------------------------------------->*/
    int WINAPI WinMain(HINSTANCE hInstance, HINSTANCE hPrevInstance, LPSTR lpCmdLine, INT nCmdShow)
    {
    	MSG msg;
    	HANDLE hAccelTable;
    
    	hInst = hInstance;
    	if (!InitApplication())
    		return 0;
    	hAccelTable = LoadAccelerators(hInst,MAKEINTRESOURCE(IDACCEL));
    	if ((hwndMain = CreatestrassenplanungWndClassWnd()) == (HWND)0)
    		return 0;
    	CreateSBar(hwndMain,"Ready",1);
    	ShowWindow(hwndMain,SW_SHOW);
    	while (GetMessage(&msg,NULL,0,0)) {
    		if (!TranslateAccelerator(msg.hwnd,hAccelTable,&msg)) {
    			TranslateMessage(&msg);
    			DispatchMessage(&msg);
    		}
    	}
    	return msg.wParam;
    }
    

    Ich hoffe daraus gehen die Informationen hervor.

    Danke für eure Mühe
    Michael



  • Hallo

    Und verstehst gar nihts vom code? Na dann viel Spaß.

    chrische



  • Darfst du dir die Sprache denn aussuchen? Falls ja nimm einfach BlitzBasic.
    http://de.wikipedia.org/wiki/Blitz_Basic
    Damit brauchst du ca. 50 Zeilen für das Spiel.



  • @chrische5: Das habe ich nie gesagt. Für mich ist jedoch die Programmierung unter Windows neu. In meinem ersten Projekt habe ich in der Konsole Berechnungen zur Binominalverteilung durchgeführt.
    Ich habe mich jetzt damit abgefunden mich am Mo. mit Büchern einzudecken und dann anzugreifen.
    Leider sind meiner Erfahrung nach in vielen Foren Leute vertreten, die weniger an der Lösung des Problems sondern ehr an der Erörterung irgendwelcher Missstände interessiert sind - das geht jetzt ausdrücklich NICHT nur an dich.

    @Fusel.Faktor: Leider muss es C sein. Jedoch hört sich BlitzBasic laut der Wiki-Beschreibung interessant an. Danke für den Tipp.

    Grüße
    Michael


  • Administrator

    @Michael aus Stuttgart,
    Ich hoffe du hast trotz allem mal SFML angeschaut? Es hat eine C Schnittstelle dabei, welche sehr einfach gehalten ist. Hier nochmals den Link:
    http://www.sfml-dev.org/

    Damit solltest du in der Lage sein die graphische Ausgabe schnell und einfach hinzubekommen, ohne dich in die doch relative mühsame WinAPI einzuarbeiten. Oder die Alternative ist noch SDL, sie ist aber ein wenig älter und langsamer als SFML. Allerdings ist die SDL komplett in C geschrieben und vielleicht daher besser für ein C Programm geeignet, aber da wäre ich überfragt, da ich mit der SDL noch nie gearbeitet habe.

    Wenn du konkrete Fragen zur Spieleprogrammierung hast, dann wären diese Foren noch Anlauforte:
    http://www.c-plusplus.net/forum/viewforum-var-f-is-7.html
    http://www.spieleprogrammierer.de/phpBB2/

    Vielleicht gibt es da über die Forensuche noch ein paar gute Büchertipps zur Spieleprogrammierung in C zu finden.

    Grüssli



  • Michael aus Stuttgart schrieb:

    Leider sind meiner Erfahrung nach in vielen Foren Leute vertreten, die weniger an der Lösung des Problems sondern ehr an der Erörterung irgendwelcher Missstände interessiert sind - das geht jetzt ausdrücklich NICHT nur an dich.

    Hör mal, Kollege. DU bist an einer Lösung interessiert, nicht die Leute im Forum. Wenn Du Hilfe brauchst, dann frag ganz konkret. Die Leute sind hilfsbereit, aber ich sehe bisher keine Frage auf die man Antworten könnte ohne Dir vorher das Programmieren beibringen zu müssen. Einige Hinweise kamen ja bereits.

    Eine Studienarbeit sollte in eigenständiger Arbeit durchgeführt. Falls Du andere Fragen hast als "Ich muss für meine Studienarbeit ein Spiel programmieren. Wie mache ich das?", dann immer her damit.


Anmelden zum Antworten