simplex
[Versuchstier]
Hallo liebe Community!
Ich stehe vor einem kleinen Problem. Gegeben ist mein n-Damen auf dem Schachbrett-Programm. Nun stehe ich vor der Hürde, wie ich die "gesamte" Ausgabe in eine *.txt Datei speichern kann. Das Programm an sich funktioniert - aber seht selbst, er speichert mir nur komische Zeichen. Wäre super, wenn sich das jemand anschauen könnte.
Mein zweites Problem ist der Einbau eines "Struct".
Vllt. hat ja jemand ein paar Tipps! Wäre super..muss das Ding nämlich bald abgeben und ich bin mit meinem Latein am Ende!
Gruß
micha
Ich stehe vor einem kleinen Problem. Gegeben ist mein n-Damen auf dem Schachbrett-Programm. Nun stehe ich vor der Hürde, wie ich die "gesamte" Ausgabe in eine *.txt Datei speichern kann. Das Programm an sich funktioniert - aber seht selbst, er speichert mir nur komische Zeichen. Wäre super, wenn sich das jemand anschauen könnte.
Mein zweites Problem ist der Einbau eines "Struct".
Vllt. hat ja jemand ein paar Tipps! Wäre super..muss das Ding nämlich bald abgeben und ich bin mit meinem Latein am Ende!
Gruß
micha
Code:
#include <stdio.h>
#include <stdlib.h> // Die Definitionsdatei <stdlib.h> vereinbart Funktionen zur Umwandlung von Zahlen,
// für Speicherverwaltung und ähnliche Aufgaben.
#include <conio.h>
int feld[10][10]; //maximal 8x8 Feld, da es sonst zu viele Lösungen gibt
int anzahl_felder; // Größe des Schachbretts
int anzahl_loesungen=0; // Gibt Anzahl der Lösungen an, wird beim Start auf 0 gesetzt
void initialisiere_feld(int start)
{
for (int a=start; a<=anzahl_felder; a++)
for (int b=0; b<=anzahl_felder; b++)
if (start>=0) feld[a][b]=0;
}
int zaehle_damen() //Funktion durchläuft jedes einzelne Feld
{
int count=0; //Zählt die Damen, die sich in dem Feld befinden
for (int a=0; a<=anzahl_felder; a++)
for (int b=0; b<=anzahl_felder; b++)
if (feld[a][b]==1)count++;
return count; //Anzahl der "gefundenen" Damen wird an Funktion zurückgegeben
}
int horizontal(int x, int y) // Durchläuft als erstes die Horizontale
{
int ergebnis=0; //keine Kollision außer wenn:
for (int i=0; i<=anzahl_felder; i++)
{
if (feld[i][y]==1) //y bleibt hier gleich, da die Funktion nur eine Horizontale durchläuft
//==1:bedeutet dass sich in der Horizontale eine Dame befindet
{
ergebnis=1; //Kollision! Abbruch
break;
}
}
return ergebnis;
}
int vertikal(int x, int y)
{
int ergebnis=0;
for (int i=0; i<=anzahl_felder; i++)
{
if (feld[x][i]==1) //x bleibt gleich, da hier nur eine Vertikale durchlaufen wird
{
ergebnis=1; //Kollision! Abbruch
break;
}
}
return ergebnis;
}
int diagonale1(int x, int y) //Diagonale von rechts unten nach links oben
{
int ergebnis=0;
int x1=x;
int y1=y;
for (int i=-anzahl_felder; i<=anzahl_felder; i++)
{
x1=x+i; // da z.B. die Diagonalen von (2,2)
y1=y+i; // (1,1),(3,3) und (4,4) sind
if ((x1>anzahl_felder)||(y1>anzahl_felder)||(i==0)||(x1<0)||(y1<0))
continue; //Bedingung damit die Funktion nicht über den Spielfeldrand läuft,
//bzw nicht das Feld (x,y) prüft
if (feld[x1][y1]==1)
{
ergebnis=1; //Kollision! Abbruch
break;
}
else
ergebnis=0; //keine Kollision
}
return ergebnis;
}
int diagonale2(int x, int y) //Diagonale von unten links nach oben rechts
{
int ergebnis=0;
int x1=x;
int y1=y;
int i=1;
for (i=1; i<=anzahl_felder; i++)
{
x1=x+i; //nach oben
y1=y-i;
if ((x1>anzahl_felder)||(y1>anzahl_felder)||(x1<0)||(y1<0)) continue;
if (feld[x1][y1]==1)
{
ergebnis=1; //kollision gefunden! Abbruch
break;
}
}
for (i=1; i<=anzahl_felder; i++)
{
x1=x-i; //nach unten
y1=y+i;
if ((x1>anzahl_felder)||(y1>anzahl_felder)||(x1<0)||(y1<0)) continue; //bedingung für über den spielfeldrand-->überspringen
if (feld[x1][y1]==1)
{
ergebnis=1; //Kollision! Abbruch
break;
}
}
return ergebnis;
}
int ueberpruefe_dame(int x, int y)
{
int ergebnis=0;
if ((horizontal(x,y)+vertikal(x,y)+diagonale1(x,y)+diagonale2(x,y))==0) ergebnis=0; else {ergebnis=1;} //überprüft ob irgendwo eine Kollision ist
return ergebnis;
}
void zeichne_feld(void) //Ausgabe
{
anzahl_loesungen++;
printf("\tLoesung Nr.%d\n\n\t",anzahl_loesungen);
for (int a=0; a<=anzahl_felder; a++)
{
for (int b=0; b<=anzahl_felder; b++)
if (feld[b][a]==0) printf("%c ",254); else printf("%c ",1);
printf("\n\t");
}
printf("\n-------------------------------------------------\n");
}
void speicher() //Speichert die Ausgabe.
{
FILE * datei;
datei = fopen ("feld.txt", "a");
anzahl_loesungen++;
fprintf(datei, "\tLoesung Nr.%d\n\n\t",anzahl_loesungen);
for (int a=0; a<=anzahl_felder; a++)
{
for (int b=0; b<=anzahl_felder; b++)
if (feld[b][a]==0) fprintf(datei, "%d ",0);
else fprintf(datei,"%d ",1);
fprintf (datei, "\n");
}
fclose(datei);
}
/*
int a=0;
int b=0;
FILE * datei;
datei = fopen ("feld.txt", "a");
for (a=0; a<9;a++ ) {
for (b=0; b<9; b++) {
fprintf (datei, "%d", (feld[a][b]));}
fprintf (datei, "\n");
}
*/
void dame(int spalte)
{
if (spalte<=anzahl_felder){
for (int a=0; a<=anzahl_felder; a++)
if (ueberpruefe_dame(spalte,a)==0) {feld[spalte][a]=1; dame(spalte+1);}
if (zaehle_damen()==(anzahl_felder+1)){zeichne_feld(); } //Alle Damen gesetzt -->eine Lösung gefunden!!
initialisiere_feld(spalte-1);
}
}
void main()
{
printf(" Herzlich Willkommen zu dem Projekt n-Damen auf dem Schachbrett.\n\n");
printf(" Im folgenden Schritt muessen Sie ihre Spielfeld-Groesse x * x festlegen. \n\n");
printf (" Sie koennen fuer x die Zahlen zwischen 4 und 10 verwenden. \n\n"); //Eingabe durch Benutzer
scanf("%d",&anzahl_felder);
anzahl_felder--; // da die Nummerierung bei 0 anfängt (8 Felder --> 0-7)
initialisiere_feld(0);
dame(0);
speicher();
getch();
}