[Anfängerproblem] ein weiteres Übungsprogramm/Spiel



  • danke
    und was gibt es da für eine möglichkeit??? hab bisher noch nicht so viel erfahrung in C^^



  • zum beispiel eine verkette liste... ist sicher nicht die leichteste variante, kam mir aber als erstes in den Kopf



  • sowas:http://perlgeek.de/de/artikel/einfach-verkettete-listen???
    da blick ich überhaupt nicht durch 😕



  • Hey,
    dieser Auschnitt aus dem Buch: C++ von Anfang an zeigt dir schonmal wie du den Highscore speichern kannst:
    http://www.willemer.de/informatik/cpp/fileop.htm
    Ich weis zwar nicht wie weit du bist, aber einen Highscore, könntest du als Array von Struct darstellen z.B.

    #include <string.h>
    struct Tscore
    {
    string name;
    int score
    };
    main ()
    {
    Tscore highscore[10];
    }
    

    das Array dann per Bubbelsort sortieren (einfach googlen, bubblesort ist wirklich leicht). Speichern halt wie auf der seite gezeigt.

    mfg



  • @pspracers
    ist auch nicht leicht in C.
    Hatte damals auch probleme damit.
    Aber wenn du es mal verstanden hast, dann bringt dich das ungemein weiter.

    'struct' liefert dir viele möglichkeiten. Und verkette listen haben den vorteil, das sie nicht eingeschränkt sind.

    Ich würde sagen, bei deinem jetzigen stand wäre es vllt sogar ein guter Zeitpunkt zu cpp zu wechseln. Aber ich will dir da nicht rein reden...

    vllt noch eine anmerkung zu deinen Hindernissen. Die sind alles andere als schön gemacht... Das würd ich mit einer schleife machen. Und wirklich mit der liste...
    Alternative wäre ein riesen array, und du merkst dir wie viele elemente drin sind.
    Oder ein kleines array und es immer wieder vergrößern. Das 'geht' auch. Weil du ja dynamisch bleiben möchtest

    PS: versuch mal sinnvoll in Funktionen auszulagern.



  • danke schonmal für die ganze hilfe 👍
    ich mach jetzt das erste jahr HTL(bereich mobile computing, software engineering) und da kommt noch so einiges auf mich zu(C/C++(Anfangs nur konsolenanwendungen),Java und C# kommen auch noch in den höheren klassen)
    ist nicht Cpp einfach nur eine erweiterte version von C?

    naja hab das min den hindernissen so gut wie möglich mit meinem derzeitigen wissenstand gemacht(wahrlich nicht wirklich viel^^)

    "array" sagt mir moment noch überhaupt nichts 😕

    Hab schon überlegt ob man das mit den Hindernissen auch mit einer Schleife machen kann, mir ist aber nichts eingefallen 😞

    @Captain Morgan
    also das ist jetzt für mich reines raten, aber würde bei diese zeile
    Datei << "Dies geht in eine Datei" << Variable << endl;
    dann so aussehn?
    Datei << "%d" << highscore << endl;

    hab jetzt erstmal den code so geändert das der higscore zumindest in einer variable gespeichert wird und nur wenn übertroffen überschrieben wird:

    #include <stdio.h>
    #include <conio.h>
    #include "HTL_Konsole.h"
    #include <time.h>
    #include <stdlib.h>
    #include <windows.h>
    #include <cstdlib>
    
    #define		UP		72
    #define		DOWN	80
    #define		LEFT	75
    #define		RIGHT	77
    
    #pragma warning(disable:4996)
    
    void main()
    {
    	int x = 10;	//Aktuelle x-Position des zu bewegenden Zeichens
    	int y = 5;	//Aktuelle y-Position des zu bewegenden Zeichens
    	int dx = 1;	//Aktuelle x-Positionsänderung des Zeichens
    	int dy = 0;	//Aktuelle y-Positionsänderung des Zeichens
    	int taste;	//Aktueller Tastencode
    	int futterX;
    	int futterY;
    	int counter = 0;
    	int hindernisX;
    	int hindernisY;
    	int hindernisX2 = 0;
    	int hindernisY2 = 0;
    	int hindernisX3 = 0;
    	int hindernisY3 = 0;
    	int auswahl;
    	int anzahlhindernisse = 1;
    	int newround = 0;
    	int versuche = 1;
    	int highscore = 0;
    
    	do
    	{
    	//Bildschrim löschen
    	system("cls");
    
    	printf("1...Spiel starten\n");
    	printf("2...Optionen\n");
    	printf("3...Ende\n");
    	printf("Auswahl: ");
    	scanf("%d", &auswahl);
    
    	switch(auswahl)
    	{
    	case 1:
    	//Bildschrim löschen
    	system("cls");
    	//corsor ausschalten
    	cursoroff();
    
    	//Zufallszahlengenerator initialisieren
    	srand((unsigned)time(NULL));
    
    	if(anzahlhindernisse == 1)
    	{
    	//Hindernis auf eine zufällige Position stellen
    	hindernisX = rand() % 80 + 1;
    	hindernisY = rand() % 25 + 1;
    	gotoxy(hindernisX, hindernisY);
    	printf("H");
    	}
    
    	if(anzahlhindernisse == 2)
    	{
    	//Hindernis auf eine zufällige Position stellen
    	hindernisX = rand() % 80 + 1;
    	hindernisY = rand() % 25 + 1;
    	gotoxy(hindernisX, hindernisY);
    	printf("H");
    	//Hindernis auf eine zufällige Position stellen
    	hindernisX2 = rand() % 80 + 1;
    	hindernisY2 = rand() % 25 + 1;
    	gotoxy(hindernisX2, hindernisY2);
    	printf("H");
    	}
    
    	if(anzahlhindernisse == 3)
    	{
    	//Hindernis auf eine zufällige Position stellen
    	hindernisX = rand() % 80 + 1;
    	hindernisY = rand() % 25 + 1;
    	gotoxy(hindernisX, hindernisY);
    	printf("H");
    	//Hindernis auf eine zufällige Position stellen
    	hindernisX2 = rand() % 80 + 1;
    	hindernisY2 = rand() % 25 + 1;
    	gotoxy(hindernisX2, hindernisY2);
    	printf("H");
    	//Hindernis auf eine zufällige Position stellen
    	hindernisX3 = rand() % 80 + 1;
    	hindernisY3 = rand() % 25 + 1;
    	gotoxy(hindernisX3, hindernisY3);
    	printf("H");
    	}
    
    	//Futter setzten
    	futterX = rand() % 80 + 1;
    	futterY = rand() % 25 + 1;
    	gotoxy(futterX, futterY);
    	printf("X");
    
    	//Spielschleife
    	while(true)
    	{
    
    		//Tastenabfrage
    		if(kbhit())
    		{
    			taste = getch();
    			if(taste == 224)
    			{
    				taste = getch();
    			}
    
    			switch(taste)
    			{
    					case UP:	dx = 0;
    								dy = -1;
    								break;
    
    					case DOWN:	dx = 0;
    								dy = 1;
    								break;
    
    					case LEFT:	dx = -1;
    								dy = 0;
    								break;
    
    					case RIGHT:	dx = 1;
    								dy = 0;
    								break;
    			}
    		}
    
    		//Zeichen an alter Position löschen
    		gotoxy(x, y);
    		printf(" ");
    
    		//Neue Poition ermitteln
    		x = x + dx;
    		y = y + dy;
    
    		//Prüfen ob das Zeichen ausserhalb des Bildschirmes ist
    
    		if(x > 80)
    		{
    			x = 1;
    		}
    		if(x < 1)
    		{
    			x = 80;
    		}
    
    		if(y > 25)
    		{
    			y = 1;
    		}
    		if(y < 1)
    		{
    			y = 25;
    		}
    
    		//Counter
    		if((x == futterX)&&(y == futterY))
    		{
    			counter++;
    			futterX = rand() % 80 + 1;
    			futterY = rand() % 25 + 1;
    			gotoxy(futterX, futterY);
    			printf("X");
    
    		}
    
    		//Hindernisse
    		if((x == hindernisX)&&(y == hindernisY))
    		{
    			versuche--;
    			if(versuche == 0)
    			{
    			break;
    			}
    			//Hindernis auf eine zufällige Position stellen
    			hindernisX = rand() % 80 + 1;
    			hindernisY = rand() % 25 + 1;
    			gotoxy(hindernisX, hindernisY);
    			printf("H");
    		}
    
    		if((x == hindernisX2)&&(y == hindernisY2))
    		{
    			versuche--;
    			if(versuche == 0)
    			{
    			break;
    			}
    			//Hindernis auf eine zufällige Position stellen
    			hindernisX2 = rand() % 80 + 1;
    			hindernisY2 = rand() % 25 + 1;
    			gotoxy(hindernisX2, hindernisY2);
    			printf("H");
    		}
    
    		if((x == hindernisX3)&&(y == hindernisY3))
    		{
    			versuche--;
    			if(versuche == 0)
    			{
    			break;
    			}
    			//Hindernis auf eine zufällige Position stellen
    			hindernisX3 = rand() % 80 + 1;
    			hindernisY3 = rand() % 25 + 1;
    			gotoxy(hindernisX3, hindernisY3);
    			printf("H");
    		}
    
    		//Zeichen an der neuen Position ausgeben
    		gotoxy(x, y);
    		printf("%c", 219);
    
    		//Zeitverzögerung
    		Sleep(70); 
    	}
    
    			//Bildschrim löschen
    			system("cls");
    			if(counter > highscore)
    			{
    				highscore = counter;
    				gotoxy(32, 10);
    				printf("Neuer Highscore!!!");
    			}
    
    			gotoxy(31, 12);
    			printf("Game Over, Score: %d", counter);
    			gotoxy(35, 13);
    			printf("Highscore: %d", highscore);
    
    			getch();
    		break;
    
    	case 2:
    		//Bildschrim löschen
    		system("cls");
    		gotoxy(35, 1);
    		printf("Optionen");
    		gotoxy(1, 3);
    		printf("Anzahl Hindernisse(max. 3, derzeit %d): ",anzahlhindernisse);
    		scanf("%d", &anzahlhindernisse);
    		gotoxy(1, 4);
    		printf("Anzahl Versuche(derzeit %d): ",versuche);
    		scanf("%d", &versuche);
    		break;
    	case 3:
    		exit(0);
    
    	}
    	//Bildschrim löschen
    	system("cls");
    	gotoxy(1, 1);
    	printf("Zurueck ins Menue?\n", newround);
    	printf("1...ja\n");
    	printf("2...nein\n");
    	printf("Auswahl: ");
    	scanf("%d", &newround);
    	}
    	while(newround == 1);
    
    	//Bildschrim löschen
    	system("cls");
    
    }
    


  • Also erstmal ist Cpp keine C erweiterung. Jedenfalls nicht in einem so einfachen sinne... Eigentlich ist alles anders. Die ganze Denkweise beim Programmieren ändert sich irgendwie.

    #pragma warning(disable:4996) <-- Das ist iwie nicht schön glaube ich. Gibts keine andere Möglichkeit? Wird das warning von deinem HTL header erzeugt?

    Dein Programm schau ich mir jetzt mal an...

    http://codepad.org/Ewo5ElBi

    Compilier mal, und wenns nicht geht, poste fehler. Aber versuch sie dennoch selber zu finden.

    Hab C ewig nimmer gemacht, und hab garkeinen compiler mehr. Aber wenn ich heinen hätte würd der wegen der htl datei eh fehler melden...



  • das #pragma warning wurde einfach vom beamer abgeschrieben, hat glaube ich irgentwas mit visual sudio 08 zu tun(auch mein erstes hello world programm hat schon diese zeile drinstehn)

    zum code:
    vom compiler gibts keine probleme, aber im spiel kann man soviele hindernisse einstellen wie man will,es immer nur eins angezeigt



  • wenn immer nur eins ausgegeben wird muss der fehler hier liegen:

    for(int i=0; i<anzahlhindernisse; i++)
        {
            hindernisX = rand() % 80 + 1;
            hindernisY = rand() % 25 + 1;
    
            barriers[i].hindernisX = hindernisX;
            barriers[i].hindernisY = hindernisY;
    
            gotoxy(hindernisX, hindernisY);
            printf("H");
        }
    

    Da wird der ja ausgegeben 😉
    Heißt da musst du suchen.

    lass dir mal x und y koordinate ausgeben. Und guck mal ob die sich verändert



  • In Zeile 37 hast du:

    int anzahlhindernisse = 1;
    

    Warum sollen dann mehr dargestellt werden?
    Läuft nach 3 oder 4 kleinen Änderungen unter free bcc 5.5
    Zwar nicht ganz wie beabsichtigt - da müsste man noch etwas mehr ändern - aber man kann erkennen wo es klemmt.

    MfG f.-th.



  • zum code:
    vom compiler gibts keine probleme, aber im spiel kann man soviele hindernisse einstellen wie man will,es immer nur eins angezeigt

    Ich nehme an das er das schon eingestellt haben wird...

    WAs ist den FreeBCC? Würd das acuh gern mal Compilieren, aber da gibts probleme, vorallem da ich auf einer IBM Unix plattform compiliere...
    Könnte am header liegen...

    Wo musste denn noch was verbessert werden?



  • Bin jetzt nicht der Unix/Linux Spezi.
    Du musst die Funktion gotoxy nachbilden. Da sollte es aber schon auch fertiges geben, wenn ich die Buschtrommeln richtig deute.

    windows.h und den C++ Header würde ich auch nicht drin lassen unter Unix.

    Mit Wine hab ich auch keine Erfahrung wie gut sich da Windows emulieren lässt?

    Wer es unter Windows testen möchte hier mal der erste Teil des Quelltextes mit den Änderungen für C-Compiler:

    #include <stdio.h>
    #include <conio.h>
    // #include "HTL_Konsole.h"
    #include <time.h>
    #include <stdlib.h>
    #include <windows.h>
    
    #define        UP        72
    #define        DOWN    80
    #define        LEFT    75
    #define        RIGHT    77
    
    #pragma warning(disable:4996)
    
    typedef short cord; // wert für coordinaten
    
    void gotoxy(cord x, cord y)
    {
        HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE);
        COORD pos;
        pos.X=x-1; // speichert X Position
        pos.Y=y-1; // speichert Y Position
        SetConsoleCursorPosition(hCon, pos); // Cursorposition
    }
    
    void cursoroff()
    {
        CONSOLE_CURSOR_INFO ci = {15,0};
        SetConsoleCursorInfo(GetStdHandle(STD_OUTPUT_HANDLE) , &ci);
    }
    
    int main()
    {
        int x = 10;    //Aktuelle x-Position des zu bewegenden Zeichens
        int y = 5;    //Aktuelle y-Position des zu bewegenden Zeichens
        int dx = 1;    //Aktuelle x-Positionsänderung des Zeichens
        int dy = 0;    //Aktuelle y-Positionsänderung des Zeichens
        int taste;    //Aktueller Tastencode
        int futterX;
        int futterY;
        int counter = 0;
        int hindernisX;
        int hindernisY;
        int hindernisX2 = 0;
        int hindernisY2 = 0;
        int hindernisX3 = 0;
        int hindernisY3 = 0;
        int auswahl;
        int anzahlhindernisse = 1;
        int newround = 0;
        int versuche = 1;
        int highscore = 0;
    
        do
        {
        //Bildschrim löschen
        system("cls");
    
        printf("1...Spiel starten\n");
        printf("2...Optionen\n");
        printf("3...Ende\n");
        printf("Auswahl: ");
        scanf("%d", &auswahl);
    
        switch(auswahl)
        {
        case 1:
        //Bildschrim löschen
        system("cls");
        //corsor ausschalten
        cursoroff();
    
        //Zufallszahlengenerator initialisieren
        srand((unsigned)time(NULL));
    
        if(anzahlhindernisse == 1)
        {
        //Hindernis auf eine zufällige Position stellen
        hindernisX = rand() % 80 + 1;
        hindernisY = rand() % 25 + 1;
        gotoxy(hindernisX, hindernisY);
        printf("H");
        }
    
        if(anzahlhindernisse == 2)
        {
        //Hindernis auf eine zufällige Position stellen
        hindernisX = rand() % 80 + 1;
        hindernisY = rand() % 25 + 1;
        gotoxy(hindernisX, hindernisY);
        printf("H");
        //Hindernis auf eine zufällige Position stellen
        hindernisX2 = rand() % 80 + 1;
        hindernisY2 = rand() % 25 + 1;
        gotoxy(hindernisX2, hindernisY2);
        printf("H");
        }
    
        if(anzahlhindernisse == 3)
        {
        //Hindernis auf eine zufällige Position stellen
        hindernisX = rand() % 80 + 1;
        hindernisY = rand() % 25 + 1;
        gotoxy(hindernisX, hindernisY);
        printf("H");
        //Hindernis auf eine zufällige Position stellen
        hindernisX2 = rand() % 80 + 1;
        hindernisY2 = rand() % 25 + 1;
        gotoxy(hindernisX2, hindernisY2);
        printf("H");
        //Hindernis auf eine zufällige Position stellen
        hindernisX3 = rand() % 80 + 1;
        hindernisY3 = rand() % 25 + 1;
        gotoxy(hindernisX3, hindernisY3);
        printf("H");
        }
    
        //Futter setzten
        futterX = rand() % 80 + 1;
        futterY = rand() % 25 + 1;
        gotoxy(futterX, futterY);
        printf("X");
    
        //Spielschleife
        while(1) // because it is C
        {
    
            //Tastenabfrage
    

    Den Rest könnt ihr übernehmen.
    So kriecht schon mal was - Erweiterungen und Optimierungen? Da lasst eurer Phantasie freien Lauf.

    MfG f.-th.



  • Sqwan schrieb:

    Also erstmal ist Cpp keine C erweiterung. Jedenfalls nicht in einem so einfachen sinne... Eigentlich ist alles anders.

    Jo CPP = C Pre-Processor != C++ 😉



  • hi

    verfassen ja immer mehr leute in diesem tread ihre beiträge 🙂

    int anzahlhindernisse = 1;
    

    naja ist die nazahl an hindernissen die dargestellt werden soll, und als standart wert hab ich das auf 1 gestellt

    die HTL_Konsole.h hab ich jetzt auch mal für euch hochgeladen:
    klick

    @f.-th.
    Wenn ich das unter windwos compiliere kommt im Visual studio folgender fehler:
    1>spiel.obj : error LNK2005: "void __cdecl cursoroff(void)" (?cursoroff@@YAXXZ) ist bereits in HTL_Konsole.obj definiert.

    @Sqwan
    was bedeutet dieses [i] und der punkt??

    barriers[i].
    


  • Die Fehlermeldung bei dir kommt weil du kein "jungfräuliches" System hast.
    Du hast ja die HTL_Konsole noch in deinem Projekt drin.
    Wenn die die komplett heraus nehmen würdest, wär da keine Fehlermeldung.

    Herausnehmen würde ich es an deiner Stelle nicht, solange du damit Schulprojekte bearbeitest.

    Du hast da nur einen Teil der HTL_Konsole verlinkt. Aber da es da viele ähnliche Projekte gibt, ist das kein Problem. Da war doch vor ein paar Tage das Projekt conat und hier im Forum siehe "improved Console 4.0"

    Spwan meint: barries ~ Hindernisse
    Da solltest du dir das Kapitel Arrays ansehen.

    MfG f.-th.


Anmelden zum Antworten