Problem mit der Kollisions Prüfung
-
Hallo zusammen ^^, ähhm ganz eigenartig, wenn ihr das Programm selber mal kompiliert bemerkt ihr dass das geschoss nicht das macht was es eigendlich tun sollte.
ich glaube das bei der Zuweißung etwas schief geht daher das geschoss stehen bleibt wenn auch in dem Feld nichts ist. vielleicht könnt ihr mir helfen, die kollision prüfung des Spielers wird nochmal überarbeitet, und ich muss an dem Gegner rumprogrammieren das er noch was macht, und die level Gestaltung - was ich damit sagen will es is eigendlich noch nichts fertig aber solang mein geschoss nicht richtig funktioniert und ich auch keine ahnung habe warum will ich auch nicht weiter arbeiten. (Das geschossscript ist in den Routen drinnen) ^^
DANKE FÜR DIE HILFE
#include <iostream> #include <windows.h> #include <conio.h> const int MAX_X=40; //Spielfeld Größe const int MAX_Y=15; void spielfeld(int spielerx, int spielery); // Deklaration der Funktionen int eingabe(); void gotoxy(int x, int y); int main() { int i, x, y; int ausis = 0; spielfeld(20,8); /aufruf der Funktion, Spieler positionen return 0; } void spielfeld(int spielerx, int spielery) { int i, k; int spieleraltx, spieleralty; int eingabe1; int geschoss, richtung, abgefeuert; int geschossy, geschossx; int geschossalty, geschossaltx; int gegnerhit, movep; richtung = 1; //Werte zuweißen, daher sonst Fehler entsteht geschoss = 0; char spielfeld1[MAX_X][MAX_Y]; // Spielfeld Array deklarieren bool zuviel=true; // endlosschleife for(i=0;i<MAX_Y; i++) { for(k=0;k<MAX_X; k++) { if ( i == 0 || k == 0 || i == 15 - 1 || k == 40 - 1) {spielfeld1[i][k] = 'X';} else {spielfeld1[i][k] = ' ';} std::cout << spielfeld1[i][k]; } std::cout << std::endl; } // Spielfeld deklaration gotoxy(spielerx, spielery); //Spieler auf das Spielfeld positionieren spielfeld1[spielery][spielerx] = 'S'; std::cout << spielfeld1[spielery][spielerx] << std::endl; gotoxy(10, 5); //Gegner1 spielfeld1[spielery][spielerx] = 'G'; std::cout << spielfeld1[spielery][spielerx] << std::endl; gotoxy(20, 5); //Gegner2 spielfeld1[spielery][spielerx] = 'G'; std::cout << spielfeld1[spielery][spielerx] << std::endl; gotoxy(30, 5); //Gegner3 spielfeld1[spielery][spielerx] = 'G'; std::cout << spielfeld1[spielery][spielerx] << std::endl; do{ //beginn der endlos schleife eingabe1 = eingabe(); //eingabe des spielers in eingabe1 speichern if (eingabe1 == 1) // Spielereingabe überprüfen (Nur die bewegungen, kein Feuer) { i = spielery; spieleraltx = spielerx; if (i<14) //Alte kollisions abfrage das spieler nicht ausserhalb der Spielfeld begrenzung ist { spielery++; spieleralty = i; if(geschoss==0){richtung = 1;} // Wenn ein Geschoss existiert, darf die richtung nicht mehr verändert werden movep = 1; // Spielerbewegt sich 1 } } else if (eingabe1 == 2) { i = spielery; spieleraltx = spielerx; if(i>2) { spielery--; spieleralty = i; if(geschoss==0){richtung = 2;} movep = 1; } } else if (eingabe1 == 3) { i = spielerx; spieleralty = spielery; if(i<39) { spielerx++; spieleraltx = i; if(geschoss==0){richtung = 3;} movep = 1; } } else if (eingabe1 == 4) { i = spielerx; spieleralty = spielery; if(i>2) { spielerx--; spieleraltx = i; if(geschoss==0){richtung = 4;} movep = 1; } } if(movep==1)//wenn sich spieler bewegt hat { gotoxy(spielerx, spielery); //konsolenpointer setzen auf neue Position spielfeld1[spielery][spielerx] = 'S'; // Felddeklariern std::cout << spielfeld1[spielery][spielerx] << std::endl; //schreiben spielfeld1[spieleralty][spieleraltx] = ' '; // Altes Feld deklarieren gotoxy(spieleraltx, spieleralty); //konsolenpointer setzen auf alte Pos. std::cout << spielfeld1[spieleralty][spieleraltx] << std::endl; //schreiben movep = 0; // bewegung abgeschlossen } if(eingabe1 < 5)//totaler müll setzt nur die eingabe auf 0 zurück wenn diese kleiner wie 5 ist {eingabe1 = 0;} Sleep(10); // Programm wird verlangsamt damit man Geschoss verfolgen und sehen kann //###################################################################### //###################################################################### //###################################################################### //###################################################################### //###################################################################### if(eingabe1 == 6) //wenn die Eingabe6 war dann { if(geschoss != 1)//wenn ein geschoss schon nicht existiert dann { if (richtung == 1) // richtung des Spielers abfragen { geschossy = spielery; // Geschosspos. von spieler übernehmen geschossx = spielerx; geschossy++; // Geschosspos. jenach Richtung ändern } else if (richtung == 2) { geschossy = spielery; geschossx = spielerx; geschossy--; } else if (richtung == 3) { geschossy = spielery; geschossx = spielerx; geschossx++; } else if (richtung == 4) { geschossy = spielery; geschossx = spielerx; geschossx--; } if (spielfeld1[geschossy][geschossx] == ' ') // Nur wenn der spieler in ein freies Feld feuert wird geschoss erzeugt. {geschoss=1; abgefeuert=1;} else{geschoss=0;abgefeuert=0;} } } if (geschoss==1) // wenn ein geshcoss existiert { if(abgefeuert == 1) // Wenn das geschoss abgefeuert wurde(vor dem spieler ist) { spielfeld1[geschossy][geschossx] = '0'; gotoxy(geschossx, geschossy); // erzeugt geschoss, setzt abgefeurt zurück std::cout << spielfeld1[geschossy][geschossx] << std::endl; abgefeuert=0; } else if (abgefeuert == 0) // wenn ein geschoss schon unterwegs ist. { geschossalty = geschossy;//geschossalt übernimmt aktuelle Pos. geschossaltx = geschossx; if(richtung == 1)// Pos. wird verändernt jenach Richtung { geschossy++; } else if(richtung == 2) { geschossy--; } else if(richtung == 3) { geschossx++; } else if(richtung == 4) { geschossx--; } if(spielfeld1[geschossy][geschossx] == 'X') // Kollisions Prüfung {// wenn in dem nächsten Feld ein X ist wird alte Pos gelöscht (mit ' ' ersetzt) spielfeld1[geschossalty][geschossaltx] = ' '; gotoxy(geschossaltx, geschossalty); std::cout << spielfeld1[geschossalty][geschossaltx] << std::endl; geschoss = 0; //Geschoss wird zurückgesetzt } else if (spielfeld1[geschossy][geschossx] == 'G') { // wenn das nächste Feld einen (G)egner enthält wird Gegner gelöscht und alte Position spielfeld1[geschossy][geschossx] = ' '; gotoxy(geschossx, geschossy);d std::cout << spielfeld1[geschossy][geschossx] << std::endl; spielfeld1[geschossalty][geschossaltx] = ' '; gotoxy(geschossaltx, geschossalty); std::cout << spielfeld1[geschossalty][geschossaltx] << std::endl; geschoss = 0; // Geschoss wird gelöscht zurückgesetzt gegnerhit = 1; // Gegnertreffer wird gezählt } else if (spielfeld1[geschossy][geschossx] == ' ') { // Wenn das Feld LEER ist wird das Geschoss eins weiter gesetzt und alte Pos wird geschlöscht (' ') spielfeld1[geschossy][geschossx] = '0'; gotoxy(geschossx, geschossy); std::cout << spielfeld1[geschossy][geschossx] << std::endl; spielfeld1[geschossalty][geschossaltx] = ' '; gotoxy(geschossaltx, geschossalty); std::cout << spielfeld1[geschossalty][geschossaltx] << std::endl; geschoss = 1; // Geschoss existiert weiter } } } //###################################################################### //###################################################################### //###################################################################### //###################################################################### //Sleep(0); }while (zuviel=true); // Endlosschleife std::cin >> i;// ergibtkeinen sinn } int eingabe() { char eingabe; if(kbhit()){ eingabe = getch(); switch (eingabe) { case 'S': case 's': return 1; break; case 'W': case 'w': return 2; break; case 'D': case 'd': return 3; break; case 'A': case 'a': return 4; break; case 'E': case 'e': return 5; break; case ' ': return 6; break; } }return 0; } void gotoxy(int x, int y) { HANDLE hCon = GetStdHandle(STD_OUTPUT_HANDLE); COORD pos; pos.X=x-1; pos.Y=y-1; SetConsoleCursorPosition(hCon, pos); }
-
//bitte löschen
ausversehen entstanden
danke
-
kann es sein das du manche blöcke aus meinem programm verwendest???
die darstellung des spielfeldest und die "bewegun" ähneln sich sehr stark sogar in der formmeins aus meinem snake programm (welches ich gekalut haben soll!!!):
spielfeld[Alt_y][Alt_x]= ' ';
spielfeld[beweg_y][beweg_x]= '\x01';
gotoxy(beweg_x,beweg_y);
cout<<spielfeld[beweg_y][beweg_x];
gotoxy(Alt_x,Alt_y); //Löscht altes feld
cout<<spielfeld[Alt_y][Alt_x];und deins hat:
gotoxy(spielerx, spielery); //konsolenpointer setzen auf neue Position
spielfeld1[spielery][spielerx] = 'S'; // Felddeklariern
std::cout << spielfeld1[spielery][spielerx] << std::endl; //schreiben
spielfeld1[spieleralty][spieleraltx] = ' '; // Altes Feld deklarieren
gotoxy(spieleraltx, spieleralty); //konsolenpointer setzen auf alte Pos.
std::cout << spielfeld1[spieleralty][spieleraltx] << std::endl;hat eine starke ähnlich keit mit meinem auser das du erst darstelst und dann löscht sonst hat das schon starke ähnlich keiten sogar spielfeld wurde fast 100% übrnommen
das micht mir eig nix aus fühl mich erher noch geehrt wenn man cod stücke die poste verwenetok jetzt zu deiner frage die ich nicht verstehe was soll dein programm machen
zudem kannst eig das std: wenn man es so oft verwendet durch einen nammensraum am anfang sparen
deine int in der main sind nutzlos also löschen oder auskommentieren wenn du sie später verwenden möchtest
dann hast du am anfang ein prob mit einem \ da gehört noch eins rein das es ein kommentar wird und ein d ist nach einem ;
-
Fehler hab ich schon längst gefunden, Array is falsch dimensioniert.
Ich hab mir die Funktion geklaut aber mittlerweile läuft das Programm auch anders...
-
This is a automatic generated message from c&&p Detector V.1.04
System has detected scriptkiddie at adress [germany 186.234.120.96 - \"qriz\"] The following event has occured: 006: copy'n paste event.
-
was soll das programm machen wenn du auf ein feld mit einem G kommst???
bin zufaul um dein programm ansatz durchzulessen
-
Copy&&paste Detec schrieb:
This is a automatic generated message from c&&p Detector V.1.04
System has detected scriptkiddie at adress [germany 186.234.120.96 - \"qriz\"] The following event has occured: 006: copy'n paste event.
Ich mein ich find ja misstrauen im Internet gut, währe ich in eurer Position würd ich mir selber nicht trauen. ^^
Scriptkiddie, jetzt im ernst ich bin 20 Jahre alt bin in einem Handwerklichen Beruf, den ich noch nie ausüben wollte und lerne Programmieren aus spaß und weil ich schon in der Hauptschule noch n00biger QBasic "programmiert" habe. Ich weiß das meine scripts kacke sind, ich weiß auch das euch niemand dazu zwingt meine "kacke" zuverbessern, anzuguggen, vorallem weil mein script wahrscheinlich unübersichtlich, scheisse strukturiert ist und weil es massig an Unterfunktionen fehlt und weil ich natürlich kein OOP benutze. Ich programmiere wahrscheinlich genau so kacke wie alle hier als sie ihre ersten scripts programmiert haben. Ich schäme mich nicht wenn ich eine Fremde Funktion für mein Programm benutze, denn diese eine Funktion ändert nichts daran das ich das Programm geschrieben habe. Ich finde es nur schade weil ich mir hier angemeldet habe in der Hoffung das ich mich verbessern kann, stattdessen werde ich nur wegen Sachen angeflamed. sorry das ich wie die meisten keinen FIAE gemacht hab oder Informatik studiere, und mich dadurch nicht im Detail mit dem Programmieren auskenne(und jeden C++ Befehl kenne, und jede Funktion). Wird wahrscheinlich auch mein letzter Post sein, dann bleibt wohl mein C++ Buch mein einziger Ratgeber nur blöd das der mir nicht antworten kann..
bb qriz