Schiffe versenken

Programm in C.
Schiffe versenken.

In dem Programm ist was faul. Zeigt meine Schiffe an, aber keine Treffer. Und versenken geht schon gar nicht.
Mir fehlt langsam der Durchblick.
Hier der Code: Hoffe, dass meine Kommentare ausreichend sind.
Code:
#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
    int i,j,x,y, anzBoote;
  //   das Spielfeld wird in 10 Zeilen a 10 felder aufgeteilt
  char  sfx[100];
  char* feld[10] ;  // array von zeigern auf den zeilenanfang der i-ten zeilen
  for (i=0; i < 10; i++) feld[i] = sfx+10*i;  //   adresse des 10*i-ten elements in sfx (ist erstes (genauer nulltes) element der i-ten zeile)
  // initialisiere feld, alles 0:
  for (i=0; i < 10; i++)
      for (j=0; j < 10; j++)
          feld[i][j] = 0;
  // schiffe setzen:  koordinaten x,y  
  anzBoote = 0;   //  so viele boote sind auf dem spielfeld
  do {
      printf("\n Bitte x-Koordinate eingeben:");
      scanf("%i", &x);
      printf("\n Bitte y-Koordinate eingeben:");
      scanf("%i", &y);
      // pruefe daten:  x,y  im spielfeld und noch kein schiff an dieser stelle
      if (0<= x && x <10 && 0 <= y && y < 10 && !(feld[y][x] & 2)) {
              feld[y][x] = 2;
              anzBoote++;
      }
      printf("\n Weiter mit j.");
  } while (getch() == 'j');
  /*
  // Ausgabe
  printf("\n");
  for (i=0; i < 10; i++) {  
      for (j=0; j< 10; j++)
            if (feld[i][j] & 2) printf("x"); else printf(".");
      printf("\n");
  }
  */
  
  // versenken
  while (anzBoote) {
        printf ("\n\n");
        for (i = 0; i < 10; i++) {
            for (j = 0; j < 10; j++)
                if (feld[i][j] & 1) {
                               if (feld[i][j] & 2) printf("X"); else printf("0");
                } else printf(".");
            printf("\n");
        }
        printf("\n Bitte x-Koordinate eingeben:");
      scanf("%i", &x);
      printf("\n Bitte y-Koordinate eingeben:");
      scanf("%i", &y);
      if ( 0<= x && x < 10 && 0 <= y && y < 10) {
         if (!(feld[y][x] & 1)) {
            feld[y][x] = feld[y][x] | 1;
            if (feld[y][x] & 2) anzBoote--;
         }
      }
      
      
  } 
  system("PAUSE");	
  return 0;
}
Wo liegen die Fehler, kann man die zwei verschachtelten Schleifen vereinfachen?

LG T

Editiert von CDW: [ CODE ] [ /CODE ] - damit es auch lesbar wird ;)
 
1. Es gibt zweidimensionale Arrays.
2. Wenn ich das so übersetze, kann ich Schiffe setzen, schießen und auch treffen. Alles wird einigermaßen logisch angezeigt.
3. Benutz code-tags...
 
zu hoch?

also das was du gemacht hast ist wesenlich höher als zweidimensionale arrays

fals du nicht weißt wie das geht:

Code:
bool felder[10][10]; //legt einen Array mit 10x10 Feldern an
felder[5][6] = true; //und so greift man darauf zu
 
@lagalopex

Kläre mich doch auf.
*plonk* kann jeder schreiben.

Das ist ein Board, keine Stelle, um Leute als doof hinzustellen.
 
Es läuft ja, aber nicht richtig.
Muss ein logischer Fehler sein, welchen ich aber nicht finde.
Deshalb die Frage an das Board um Hilfe.
LG T

leicht geänderter code als anhang:

#include <stdio.h>
#include <stdlib.h>

int main(int argc, char *argv[])
{
int i,j,x,y, anzBoote;
// das Spielfeld wird in 10 Zeilen a 10 felder aufgeteilt
char sfx[100];
char* feld[10] ; // array von zeigern auf den zeilenanfang der i-ten zeilen
for (i=0; i < 10; i++) feld = sfx+10*i; // adresse des 10*i-ten elements in sfx (ist erstes (genauer nulltes) element der i-ten zeile)
// initialisiere feld, alles 0:
for (i=0; i < 10; i++)
for (j=0; j < 10; j++)
feld[j] = 0;
// schiffe setzen: koordinaten x,y
anzBoote = 0; // so viele boote sind auf dem spielfeld
do {
printf("\n Bitte x-Koordinate eingeben:");
scanf("%i", &x);
printf("\n Bitte y-Koordinate eingeben:");
scanf("%i", &y);
// pruefe daten: x,y im spielfeld und noch kein schiff an dieser stelle
if (0<= x && x <10 && 0 <= y && y < 10 && !(feld[y][x] & 2)) {
feld[y][x] = 2;
anzBoote++;
}
printf("\n Weiter mit j.");
} while (getch() == 'j');
/*
// Ausgabe
printf("\n");
for (i=0; i < 10; i++) {
for (j=0; j< 10; j++)
if (feld[j] & 2) printf("x"); else printf(".");
printf("\n");
}
*/

// versenken
while (anzBoote) {
printf ("\n\n");
for (i = 0; i < 10; i++) {
for (j = 0; j < 10; j++)
if (feld[j] & 1) {
if (feld[j] & 2) printf("X"); else printf("0");
} else printf(".");
printf("\n");
}
printf("\n Bitte x-Koordinate eingeben:");
scanf("%i", &x);
printf("\n Bitte y-Koordinate eingeben:");
scanf("%i", &y);
if ( 0<= x && x < 10 && 0 <= y && y < 10) {
if (!(feld[y][x] & 1)) {
feld[y][x] = feld[y][x] | 1;
if (feld[y][x] & 2) {
anzBoote--;
printf("\a");
}
}
}


}
system("PAUSE");
return 0;
}
 
ok dann tu uns doch bitte den gefallen und strukturiere dienen code mal ordentlich

d.h. mache ordentliche Funktionen wie z.B.

shoot_to(x,y,player)
is_there_a_ship(x,y,player)
set_ship_to(x,y,player)

die namen sind jetzt natürlich doof, aber so ind er richtung

dann en ordenltichen main loop in dem nur noch wenig code steht
dann is das ganze auch lesbar^^
 
Im Editor sieht das besser aus. Stimmt. Ist aber in C#. Und ohne die Schleifen bekomme ich das nicht hin. Bin aber auch nicht der super Programmierer.

Sind die Felder richtig deklariert? Das wäre meines erachtens eine Fehlerquelle.

LG T
 
tu mir doch bitte den gefallen nd verwende zweidimensionale arrays, die sind einfacher
Beispiel:

Code:
const int VERSENKT = 1;
const int VORBEI = 2;
const int UNBEKANNT = 0;

	int felder[10][10];

	//Felder initialisieren

	for(int i = 0; i < 10; i++)
	{
		for(int j = 0; j < 10; j++)
		{
			felder[i][j] = UNBEKANNT;
		}
	}

	//Felder ausgeben

	for(int i = 0; i < 10; i++)
	{
		for(int j = 0; j < 10; j++)
		{
			switch(felder[i][j])
			{
				case VERSENKT:
					cout << "x";
                                       break;
				case VORBEI:
					cout << ".";
                                       break;
				case UNBEKANNT:
					cout << " ";
			}
		}
		cout << endl;
	}

das id jetz c++, bei c müsstest du entsprechen printf verwenden
 
Danke für Deine Arbeit.
Aber das Programm läuft bei mir nicht. Error in Zeile 19.
Und C++ ...null Ahnung.
Wo steckt denn in dem ursprünglichem Code nun der Fehler?

LG T
 
ok angehängt ist eine version mit formatierter ausgabe, da musst du nur noch das setzen und abschießen einbauen(sollte kein problem sein)

das was ich gemacht habe is nich direkt c++, um wieder dir vertrauten code daraus zu machen
musst du nur die cout durch printf() ersetzen

versuch es bitte so, denn das was du da versucht hast ist zimelich schlechter stil und du solltest dir nicht angewöhnen so zu programmieren ;-)
 
Danke!!!
Der Stil hat mir auch nicht so gefallen. Mir war bloss wichtig, dass das Prog. läuft. Will mir aber auch keine Mischform (C, C++) angewöhnen.

Nächstes Programm sieht besser aus. Bin am arbeiten.

LG T.
 
Zurück
Oben