[Anfängerproblem] ein weiteres Übungsprogramm/Spiel
-
@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öchtestPS: 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...
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 angezeigtIch 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.