15*15 Spielfeld mit Arrays. Einzelne Rauslöschen und nachrücken
-
ja ich habs so verglichen if(x.pos==x.pos+1).
Also so in der Art. Wie würdet ihr es machen? Und wie ändern ich dann den inhalt?
MFG
-
Also der Vergleich wird immer falsch sein - wenn, dann solltest du die Array-Inhalte miteinander vergleichen.
-
Du könntest die Farbe direkt mit
ReadConsoleOutputAttribute
aus der Konsole lesen, entsprechend das Zeichen mit
ReadConsoleOutputCharacter
Zum Setzen gibt es analoge Funktionen, deren Name mit Write beginnt.
-
if (iar[pos.X][pos.Y] == ..)
..Aber dein Code sieht ehrlich gesagt schrecklich aus, räum da mal auf!
-
So, habs jetzt nach dem Vorschlag von cooky451 gemacht. Teilweise funktioniert es aber es setzt dann auch auf andersfarbige ein leerzeichen. Deshalb glaub ich das er beim vergleich nicht die farbe vergleicht.
Schaut so inetwa aus:if(iar[pos.X][pos.Y]==iar[pos.X+1][pos.Y]) { printf(" "); } if(iar[pos.X][pos.Y]==iar[pos.X-1][pos.Y]) { printf(" "); }
Und wie stell ich es jetzt an dass er dann die ganze reihe kontrolliert? Sollt ich dann jeden wert abfragen?
MFG
-
Was ist da das Problem?
for( 1. Feld bis letztes Feld; Feld++)
...
-
ja er soll nur die nebeneinanderliegenden löschen, nciht alle auf dem Spielfeld.
Ein beispiel für mein Programm wäre hilfreicher.
Danke
-
Natürlich
sollte das Feld in einen 15 * 15 Array per:
for( 1. Feld bis letztes Feld; Feld++) entweder in Zeile oder in Spalte und, wenn du es entsprechend codierst kannst du auch dein ganzes Array so abarbeiten.
...Nimm dir ein Blatt Papier zeichne dein Array drauf und überlege wie du das zeilen- oder spaltenweise mittels zwei "for()" codiert bekommst. Und, wenn du per den beiden for alle Felder deines Arrays ansprechen kannst, überlegst du unter welchen Bedingungen da etwas "geändert" werden soll.
for( Zeile oder Spalte )
for( das was noch nicht ist siehe Zeile zuvor )
{
hier die Bedingungen, wann welches Feld wie geändert werden soll
}
-
okay danke!!! Versuche mich später mal daran.
Wenn wir schon dabei sind, wie lasse ich dann die Zeichen von oben und der Seite nachrrücken?MFG
-
Hatten wir das nicht schon zuvor in diesem Beitrag angedeutet?
Lies das nochmal von vorn
-
Hab das jetzt ewig ausprobiert mit der for Schleife zum rauslöschen. Aber ich komme nicht drauf, wie das funktionieren soll. Ich muss dann ja eig. auch noch die cursor position einbauen oder wie soll ich das verstehen? Steh momentan auf dem Schlauch.
Über Hilfe würde ich mich freuen
-
"Du siehst in der unteren Zeile nach ob alle Felder belegt sind.
Wenn nicht, gehe in der Spalte nach oben bis du etwas findest - schreibe die Info des gefundenen Feldes nach unten auf das nicht belegte und schreibe wo das gefundene Feld war ein Leerfeld."Wie kann ich das machen? Wie kann ich abfragen wo ein leerzeichen ist?(Leerzeichen=Gelöscht)
Wie verschiebe ich den Inhalt? Mit einem Pointer?Das Problem mit der for schleife habe ich auch noch nicht gelöst.
Wäre sehr froh wenn mir jemand Helfen würde
-
Naja, die Koordinaten der Cursorposition musst du natürlich auch speichern, sobald der Benutzer mit der Maus klickt. Ebenfalls müssen die Koordinaten deines Feldes bekannt sein.
Dann musst du prüfen, ob dein Feld getroffen wurde, wenn der Benutzer geklickt hat. Wenn ja, das "nachsehen" geht mittels if-Abfrage, hier nur für ein Element, z.B.if ( Feld[x][y] == GRUEN ) { Feld[x][y] = WEISS; // gelöscht oder so... ...
Das kann man natürlich in einer Schleife für eine ganze Zeile oder Spalte, oder fürs ganze Feld machen.
Wenn dann alle Elemente von oben/unten/links/rechts nachrücken sollen,
dann machst du das ebenfalls in einer Schleife durch Umkopieren der Elemente.
-
else { 1; }
was hattest du denn da vor?
ich habe deinen code etwas überarbeitet und ein paar neue features eingebaut.
guckst du:#include <stdio.h> #include <windows.h> #include <conio.h> #include <stdlib.h> #include <time.h> HANDLE hOut, hIn; BOOL bRun; #define FIELD_WIDTH 15 #define FIELD_HEIGHT 15 int xcur, ycur; // aktuelle cursorpos. im feld. const int field_color = BACKGROUND_INTENSITY; // Diese Struktur hat u.A. den Vorteil, dass sie Zeichen und Farben speichern kann, ohne sie gleich sichtbar machen zu müssen. CHAR_INFO field[FIELD_WIDTH][FIELD_HEIGHT]; BOOL init_console(void) { hOut = GetStdHandle(STD_OUTPUT_HANDLE); hIn = GetStdHandle(STD_INPUT_HANDLE); return NULL != hOut && NULL != hIn; } void gotoxy (short x, short y) { COORD position = {x, y}; SetConsoleCursorPosition (hOut, position); } void field_initialisation(void) { int x, y; srand(time(NULL)); for(x=0; x<FIELD_WIDTH; x++) { for(y=0; y<FIELD_HEIGHT; y++) { field[x][y].Attributes = field_color | rand() % 16; // Es gibt nur 16 Konsolenfarben für den Vordergrund. field[x][y].Char.AsciiChar = '#'; } } } void view_field() { int i, j; for(i=0; i<FIELD_WIDTH; i++) { for(j=0; j<FIELD_HEIGHT; j++) { gotoxy(i,j); SetConsoleTextAttribute(hOut, field[i][j].Attributes ); putchar('x'); } } } void cb(void) // clear input buffer { int c; while ((c = getchar()) != EOF && c != '\n'); } void cls(void) { system("cls"); } // hilft bereichsüberschreitungen zu verhindern int coords_valid(int x, int y) { return x > -1 && x < FIELD_WIDTH && y > -1 && y < FIELD_HEIGHT; } void delete_chars() { SetConsoleTextAttribute(hOut, FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE ); puts("Not implemented yet ..."); bRun = FALSE; } int main(int argc, char *argv[]) { int a; if ( FALSE == init_console() ) return 0; bRun = TRUE; field_initialisation(); view_field(); gotoxy(xcur, ycur); while(bRun) { a = _getch(); switch(a) { case 83: // Entf delete_chars(); break; case 'w': if (coords_valid( xcur, ycur - 1 )) gotoxy( xcur, --ycur ); break; case 'a': if (coords_valid( xcur-1, ycur )) gotoxy( --xcur, ycur ); break; case 's': if (coords_valid( xcur, ycur + 1 )) gotoxy( xcur, ++ycur ); break; case 'd': if (coords_valid( xcur+1, ycur )) gotoxy( ++xcur, ycur ); break; /* default: SetConsoleTextAttribute(hOut, FOREGROUND_GREEN|FOREGROUND_RED|FOREGROUND_BLUE ); printf("UNKNOWN: %d\n", a); */ } } }
das löschen und nachrücken der zeichen überlasse ich zur krönung dir.
-
Danke für deine Bemühungen!!!
Bin aber schon fertig also kann eigentlich geschlossen werdenVielen Dank für eure Hilfe