Tetrominos-Spiel

Joseph97

Grünschnabel
Hallo zusammen, ich muss ein simple Tetrominos-Spiel in c programmieren, und was ich schwer finde, ist , die Position der Tetris zu berechnen. also wie kann man die Y-werte berechnen, wenn man die X-werte zur Verfügung gestellt bekommt??
Meine Idee, wäre, dass man erst mal hin schaut ,ob der Platz frei ist oder nicht, und dann werden die tetris da gelegt, wo es Platz gibt.
ich konnte das aber in c nicht realisieren.
C:
typedef struct tetris{
  int position [2][2];
int nummer;
int x;
int y;
struct tetris *next;
}tetris;

typedef struct feld{
int zeilen;
int spalten;
tetris **tetr;
}feld
ich würde mich wirklich sehr freuen, wenn sich jemand meldet.
Liebe Grüße.
 

Technipion

Erfahrenes Mitglied
Hallo Joseph97,
kannst du die Datenstruktur ein bisschen genauer erklären? Du hast als Koordinaten ja int x und int y, aber wofür ist dann int position[2][2]?

Außerdem: Warum hat feld einen zweifachen Pointer auf ein tetris? Würde ein normaler Zeiger nicht reichen?

also wie kann man die Y-werte berechnen, wenn man die X-werte zur Verfügung gestellt bekommt??
Und wie genau meinst du das? In dem code wird ja gar nichts berechnet...

Gruß Technipion
 

Joseph97

Grünschnabel
Hallo,
ich bin eigentlich nicht sicher, ob meine Structs richtig definiert sind.
position[2][2] habe ich definiert, um die tetris ausgeben zu können.
Beispiel:

Eingabe könnte z.b. wie folgt sein..

1 0
2 1
3 2
1 3
1 8

Bei der ersten Zahl z.b(1) geht es um die Sorte des Tetriminos. in der Aufgabe ist Sorte(1) z.b. ein quadratischer 2x2 Block.
Bei der zweiten Zahl z.b (5) geht es um die X-Position.

Ausgabe sollte so sein
311
311
33
2
222
11 11
11 11
 

Jennesta

Erfahrenes Mitglied
Joseph97,
wir sind hier alle wirklich gewillt dir zu helfen. Aber du musst uns schon mehr Informationen liefern. Du solltest in die Formulierung der Aufgabe/Frage mindestens genauso viel Arbeit hinein stecken, wie wir benötigen um dir zu helfen.
Ich sehe mich leider bei den Informationen nicht in der Lage dir eine Lösung zu liefern. Im ersten Beitrag sprichst du von Berechnungen, wobei wir keine sehen. Die Aufgabenstellung ist mir zudem auch unklar. Der einzige Quellcode den du gegeben hast sind die structs, wobei du im zweiten Beitrag selbst sagst, dass du nicht einmal sicher bist ob die stimmen. Wie du von der Eingabe zur Ausgabe kommst verstehe ich nicht.
Bitte denke daran, dass wir deutlich weniger Infos haben als du.
 

Joseph97

Grünschnabel
Hallo,
In dieser Aufgabe geht es um Tetrominos. Tetrominos bestehen aus vier quadratischen Blöcken, die nicht gedreht werden können.

Das Tetromino der Sorte 0 ist ein senkrechter Balken.
Das Tetromino der Sorte 1 ist ein quadratischer 2x2 Block
Das Tetromino der Sorte 2 hat die Form des umgedrehten Buchstaben T.
......

Diese Tetrominos sollen nacheinander auf einem Spielfeld mit einer Breite von 10 Kästchen und unbegrenzter Höhe platziert werden. d.h. (x, y) ∈ {0, . . . , 9} × {0, . . . }

Die Eingabe erfolgt über eine Text-Datei mit zwei Spalten und jeweils einer Zeile pro Tetromino. In jeder Zeile steht zuerst die Tetromino-Sorte (0-4), dann folgt ein Leerzeichen, die x-Position (0-9) und schließlich ein Zeilenumbruch (\n).
beispiel:
4 5
0 0
3 4
2 7

Die Ausgabe des Spielfelds erfolgt ebenfalls über eine Text-Datei. Hierbei soll für jede Koordinate des Spielfelds ausgegeben werden, welche Sorte von Tetromino sich dort befindet, oder ein Leerzeichen, wenn dort nichts ist.


Meine Lösung:
ich habe erstmal zwei structs definiert. einmal Tetris mit Nummer, x un y. Und einmal das Spielfeld mit Zeilen,
Spalten, und eine Liste von Tetriminos.

ich habe dann ein paar Funktionen implementiert, wie

C:
spielfeld* feld_einlesen(FILE *in){  //liest die ersten zwei Zeilen, und gibt sie weiter an tetris_einlesen()
  spielfeld *sf = malloc(sizeof(spielfeld)); //erstmal Platz für Spielfeld.
  sf->tetr = malloc(sizeof(tetris)); //die Höhe muss dynamisch wachsen. aber WIE??
  int nummer, x;
  while (fscanf(in, "%d %d", &nummer, &x)!= EOF){
       tetris_einlesen(nummer, x);
  }

    return sf;
}

tetris* tetris_einlesen(int nummer, int x){
  tetris *t = malloc (sizeof(tetris));
  t->nummer = nummer;
  t->x      = x;
  int y     = y_berechnen(nummer, x);//y muss berechnet werden
  t->y      = y;
  einfuegen(t,nummer, x, y);
  return t;
}

int y_berechnen (int nummer, int x){//die Funktion ist nicht vollständisch!!
//Meine Idee: ich wolte erstmal y berechnen, und dann mit ist_frei() überprüfen, ob der Platz (x,y) frei ist.
//ES kann also nur ein einziges Y geben, da die Tetris nicht umgedreht werden sollen.
  int boolean = ist_frei();
  return 0;
}
int ist_frei(void){
//überprüft, ob der Platz wirkilich frei ist.
  return 0;
}

tetris * einfuegen(tetris *start, int nummer, int x, int y){
//Hier werden die Tetris eingefügt.
    if(start == NULL){
        start = malloc(sizeof(tetris));
        start->nummer = nummer;
        start->x = x;
        start->y = y;
        start->next = NULL;
        return start;
    }
    tetris *neu = malloc(sizeof(tetris));
    neu->nummer = nummer;
      neu->x = x;
      neu->y = y;
    neu->next = start;
    start = neu;
    return start;
}


//sehen Sie die Anhänge, um besser zu verstehen, wie die Ausgabe aussehen soll
void print_feld(spielfeld *sf, FILE *out){
    int j, k;
    for(j = 0; j < sf->zeilen; j++){
        for(k = 0; k < sf->spalten; k++){
      fprintf(out,"%i\n",sf->tetr[j].nummer);
        }
        printf("\n");
    }
}

Deutliches Beispiel...
Eingabe:
1 0
2 1
3 2
1 3
1 8
Ausgabe: sehe den Anhang..



Ein- und Ausgabe findet ihr im Anhang.

ich hoffe, ich könnte euch einen besseren Überblick über die Aufgabe liefern. Freue mich auf jede Hilfe.
Liebe Grüße
 

Anhänge

  • Ausgabe.txt
    424 Bytes · Aufrufe: 1

Neue Beiträge