Spiel



  • Hallo zusammen,
    Habe folgendes Problem: Ich soll eine Art Spiel machen. Es soll ein Feld mit doppeltem Rand da sein und ein X soll hin und her schweben, bis es den Rand irgendwann berühert. Dazu soll man eine vorgegene main.cpp nutzen und eine feld.h und feld.cpp dazuschreiben, um die Funktionen zu implementieren. Habe allerdings keine Idee wie ich das machen soll. Tipps jedlicher Art wären super. Ich bin bis jetzt so weit:

    void printPositionInField(float markerX, float markerY)
    {
    	char chquer = 205;
    	char chlaengs = 186;
    	char linksoben = 201;
    	char linksunten = 200;
    	char rechtsunten = 188;
    	char rechtsoben = 187;
    	char leerstelle = 32;
    	markerX;
    	markerY;
    
    	if (markerX == -10 && markerY == 10)
    	{
    		cout << "X";
    	}
    	else
    		cout << linksoben;
    
    	if (markerX >= -9 && markerX <= 9 && markerY == 10)
    	{
    		for (int spalte = -9; spalte < markerX; spalte++)
    		{
    			cout << chquer;
    		}
    		cout << "X";
    		for (int spalte = markerX; spalte <= 9; spalte++)
    		{
    			cout << chquer;
    		}
    	}
    	else
    	{
    		for (int spalte = -9; spalte <= 9; spalte++)
    		{
    			cout << chquer;
    		}
    	}
    
    	if (markerX == 10 && markerY == 10)
    	{
    		cout << "X";
    		cout << endl;
    	}
    	else
    	{
    		cout << rechtsoben;
    		cout << endl;
    	}
    
    	if (markerX >= -10 && markerY <= 9 && markerY >= -9 && markerX <= 10)
    	{
    		for (int zeile = -9; zeile < 9; zeile++)
    		{
    			for (int spalte = -9; spalte < 9; spalte++)
    			{
    				cout << leerstelle;
    			}
    		}
    	}
    	else
    	{
    		for (int zeile = -9; zeile < 9; zeile++)
    		{
    			for (int spalte = -9; spalte < 9; spalte++)
    			{
    				cout << leerstelle;
    			}
    		}
    	}
    
    	if (markerX == 10 && markerY == -10)
    	{
    		cout << "X";
    		cout << endl;
    	}
    	else
    	{
    		cout << linksunten;
    	}
    
    	for (int spalte = -9; spalte < 9; spalte++)
    	{
    		cout << chquer;
    	}
    	cout << rechtsunten;
    
    }
    

    Den Teil, wo man die Kollision definiert, habe ich noch nicht angefangen..

    Vielen Dank schonmal!



  • Hier ist Tipp Nr. 1: Verwende C++ Code Tags (zu finden unter dem Text edit Feld)
    Weitere Tipps könnten folgen...
    Ich finde, dass deine Problembeschreibung etwas genauer sein könnte. Ich habs zumindest nicht so wirklich kapiert... Außerdem kann ich persönlich nicht viel mit deinem Code anfangen, er kompiliert nicht und ist nur ein kleiner Ausschnitt.



  • okay, also danke schonmal für die tipps 😉
    ich füge mal die main.cpp datei hinzu...
    Das problem ist jetzt folgendes: man soll zwei Methoden definieren, diese sind gut aus der main.cpp erkennen. die eine soll ein feld ausgeben, sowie ein "X". man muss hier allerdings darauf achten das sich das feld ja verändert, je nachdem, wo das X gerade ist. Die main.cpp gibt bereits vor, dass sich das X bewegt, darum muss man sich also nicht kümmern.

    Die zweite methode soll einfach nur vorgeben, dass sich das spiel beendet, wenn das X mal auf den Rand kommen sollte.

    Ist klar was man jetzt eigentlich machen soll?^^

    Achso und die headerdatei enthält ja eigentlich keine neuen informationen, diese brauche ich also nicht reinzustellen oder?



  • so sieht die vorgegebene main aus:

    #include "feld.h"
    
    // Einstiegspunkt des Programms
    int main()
    {
    	// Die Position unseres Markers auf dem Feld, zum Start 
    	// setzen wir diese auf 0,0 welches die Mitte des Feldes sein soll
    	int markerX = 0;
    	int markerY = 0;
    	// Solange der Marker im Feld ist soll die Schleife laufen
    	while (true)
    	{
    		// Diese Anweisung löscht den Inhalt der Konsole
    		system("cls");
    
    		// Gib das Feld aus und die Markierung
    		printPositionInField(markerX, markerY);
    
    		// Prüfe ob die Markierung mit dem Rand kollidiert, 
    		// wenn ja brechen wir die Schleife ab
    		if (checkCollision(markerX, markerY))
    			break;
    
    		//Verschiebe den Marker in eine beliebige Richtung
    		markerX += rand() % 5 - 2;
    		markerY += rand() % 5 - 2;
    	}
    	system("pause");
    	return 0;
    }
    


  • Wollte nur sehen, ob es funktioniert!

    void printPositionInField(float markerX, float markerY) 
    { 
    char chquer = 205; 
    char chlaengs = 186; 
    char linksoben = 201; 
    char linksunten = 200; 
    char rechtsunten = 188; 
    char rechtsoben = 187; 
    char leerstelle = 32; 
    markerX; 
    markerY; 
    
    if (markerX == -10 && markerY == 10) 
    { 
    cout << "X"; 
    } 
    else 
    cout << linksoben; 
    
    if (markerX >= -9 && markerX <= 9 && markerY == 10) 
    { 
    for (int spalte = -9; spalte < markerX; spalte++) 
    { 
    cout << chquer; 
    } 
    cout << "X"; 
    for (int spalte = markerX; spalte <= 9; spalte++) 
    { 
    cout << chquer; 
    } 
    } 
    else 
    { 
    for (int spalte = -9; spalte <= 9; spalte++) 
    { 
    cout << chquer; 
    } 
    } 
    
    if (markerX == 10 && markerY == 10) 
    { 
    cout << "X"; 
    cout << endl; 
    } 
    else 
    { 
    cout << rechtsoben; 
    cout << endl; 
    } 
    
    if (markerX >= -10 && markerY <= 9 && markerY >= -9 && markerX <= 10) 
    { 
    for (int zeile = -9; zeile < 9; zeile++) 
    { 
    for (int spalte = -9; spalte < 9; spalte++) 
    { 
    cout << leerstelle; 
    } 
    } 
    } 
    else 
    { 
    for (int zeile = -9; zeile < 9; zeile++) 
    { 
    for (int spalte = -9; spalte < 9; spalte++) 
    { 
    cout << leerstelle; 
    } 
    } 
    } 
    
    if (markerX == 10 && markerY == -10) 
    { 
    cout << "X"; 
    cout << endl; 
    } 
    else 
    { 
    cout << linksunten; 
    } 
    
    for (int spalte = -9; spalte < 9; spalte++) 
    { 
    cout << chquer; 
    } 
    cout << rechtsunten; 
    
    }
    

    Main

    #include "feld.h" 
    
    // Einstiegspunkt des Programms 
    int main() 
    { 
    // Die Position unseres Markers auf dem Feld, zum Start 
    // setzen wir diese auf 0,0 welches die Mitte des Feldes sein soll 
    int markerX = 0; 
    int markerY = 0; 
    // Solange der Marker im Feld ist soll die Schleife laufen 
    while (true) 
    { 
    // Diese Anweisung löscht den Inhalt der Konsole 
    system("cls"); 
    
    // Gib das Feld aus und die Markierung 
    printPositionInField(markerX, markerY); 
    
    // Prüfe ob die Markierung mit dem Rand kollidiert, 
    // wenn ja brechen wir die Schleife ab 
    if (checkCollision(markerX, markerY)) 
    break; 
    
    //Verschiebe den Marker in eine beliebige Richtung 
    markerX += rand() % 5 - 2; 
    markerY += rand() % 5 - 2; 
    } 
    system("pause"); 
    return 0; 
    }
    

    Ja... scheint so.



  • kann mir niemand irgendwelche anhaltspunkte sagen?
    habe echt keine idee, wie ich dieses feld erstellen soll..



  • Was muss man eigentlich machen, damit der Code nicht formatiert wird und die Tags sichtbar sind? 🙄 😃


  • Mod

    Anti-Spezialist schrieb:

    Was muss man eigentlich machen, damit der Code nicht formatiert wird und die Tags sichtbar sind? 🙄 😃

    Man kann BBCode ausschalten, entweder gezielt bei jedem Beitrag (Checkbox ganz tief unter dem Editfenster) und ich meine auch allgemein im Profil. Warum jemand irgendeine dieser Optionen nutzen sollte (wie es hier anscheinend der Fall ist), kann ich jedoch nicht beantworten. Angst vor allem, was mit "Internet" und "Code" zu tun hat?


  • Mod

    delkandto schrieb:

    kann mir niemand irgendwelche anhaltspunkte sagen?
    habe echt keine idee, wie ich dieses feld erstellen soll..

    Ich weiß nicht, was du wissen willst.



  • also: ich soll ein Programm erstellen, wo eine X in einem Feld umherfliegt und wenn es auf den Rand kommt, anhält. Dazu soll ich die bereits gepostete main.cpp nutzen, jedoch muss man die beiden Funktionen implementieren, also einmal die Position von diesem X und einmal den Stopp des Programms, wenn das X auf den Rand kommt.

    Ich weiß ist etwas durcheinander, kann man es dennoch verstehen?



  • Und was ist mit "feld.h" ? Vielleicht kann dann mal jemand kapieren, was denn mit `Feld` gemeint sein soll



  • Feld ist einfach ein umrandeter Bereich im Konsolenfenster. Das ist jetzt aber nicht so schwer zu verstehen.



  • genau, meine umrandung hier ist ein doppel rahmen aus der ascii tabelle. dabei spielen länge und breite erstmal keine rolle!



  • Habe hier mal ein ziemlichen Kram zusammen geschrieben.

    Das geht sicherlich tausend mal besser, aber somit biete ich wenigstens Stoff, auf den sich die besseren Leute hier beziehen können, um bessere Versionen zu posten etc.
    Ich glaub die mögen das nicht, wenn kein Ansatz existiert.

    #include <iostream>
    #include <Windows.h>
    
    int main() {
    	int markX = 0, markY = 0; // Wäre der entsprechende Start-value
    	int topBotRows = 50;
    	int leftRightRows = 23;
    	markX = ((topBotRows - 1) / 2) + markX;
    	markY = ((leftRightRows - 1) / 2) + markY;
    
    	for (int rounds = 0; rounds = 100; rounds++) {
    
    			if (markX <= 0 || markX >= topBotRows-1 || markY <= 0 || markY >= leftRightRows-1) {
    				std::cout << "Collision";
    			break;
    		    }
    
    		for (int k = 0; k < leftRightRows; k++) {
    			std::cout << "|";
    			for (int i = 0; i < topBotRows; i++) {
    				if (k == 0 || k == leftRightRows - 1)
    					std::cout << "-";
    				else if (markX == i && markY == k)
    					std::cout << "X";
    				else
    					std::cout << " ";
    			}
    			std::cout << "|" << std::endl;
    
    		}
    		system("cls");
    		markX += rand() % 5 - 2;
    		markY += rand() % 5 - 2;
    	}
    
    	std::cin.get();
    	return 0;
    }
    

    Keine Ahnung was eine sinnvolle Alternative zu system("cls") ist, entsprechend viele newlines rauszuhauen fühlt sich irgendwie auch nicht besser an.

    Gibt anscheinend auch ein paar libs, um auf der Konsole mit Koordinaten zu zeichnen, PDCurse für Windows zB. Weiß aber nicht, wie sinnvoll solche sind.



  • Für Windows kannst du dir mal die Improved Console anschauen.


Anmelden zum Antworten