Schiffe versenken mit kleinem Problem
-
Hallo Leute;
ich hab ein kleines aber vielleicht doch ein größeres Problem!
Ich will bzw. muss ein Programm schreiben für das Spiel "Schiffe versenken"!Also hier meine Header Datei:
#ifndef __schiffe_h__ #define __schiffe_h__ #define GETROFFEN 400 void init_feld(int feld[20][20], int spalten, int zeilen); void positioniere_schiffe(int feld[20][20], int spalten, int zeilen, int schiffe, int schifflaenge[]); extern int pruefe_rechts(int feld[20][20], int spalte, int zeile, int laenge, int spaltenges); extern int pruefe_links(int feld[20][20], int spalte, int zeile, int laenge); extern int pruefe_unten(int feld[20][20], int spalte, int zeile, int laenge, int zeilenges); extern int pruefe_oben(int feld[20][20], int spalte, int zeile, int laenge); extern int schiff_zulaessig(int feld[20][20], int spalte, int zeile, int laenge, char richtung, int spaltenges, int zeilenges); extern int treffer(int feld[20][20], int spalte, int zeile, int schifflaenge[]); extern void spielbeginn(int feld[20][20], int spalten, int zeilen, int schiffe, int schifflaenge[]); extern int spiel_ende(int schiffe, int schifflaenge[]); extern void printpositionfeld(int feld[20][20], int spalten, int zeilen); extern void printratefeld(int feld[20][20], int spalten, int zeilen); #endif
Hier der Code für alle Funtkionen:
# include <stdio.h> # include <stdlib.h> # include "schiffe.h" void init_feld(int feld[20][20], int spalten, int zeilen) { int a, b; for(a = 0; a < zeilen; a++) { for(b = 0; b < spalten; b++) feld[a][b] = 0; } printpositionfeld(feld, spalten, zeilen); } void positioniere_schiffe(int feld[20][20], int spalten, int zeilen, int schiffe, int schifflaenge[]) { int i, a; char temp_x, richtung; int x; int y, laenge; for(i = 0; i < schiffe; i++) { printf("\n %d. Schiffe: ", i); fflush(stdin); scanf("%c%d-%d-%c", &temp_x, &y, &laenge, &richtung); x = temp_x - 'a'; y = y - 1; if(schiff_zulaessig(feld, x, y, laenge, richtung, spalten, zeilen)) { for(a = 0; a < laenge; a++) { if(richtung == 'r') feld[y][x+a] = i; if(richtung == 'l') feld[y][x-a] = i; if(richtung == 'u') feld[y+a][x] = i; if(richtung == 'o') feld[y-a][x] = i; } schifflaenge[1] = laenge; printpositionfeld(feld, spalten, zeilen); } else { printf("\nIhre Schiffstellung ist nicht zulaessig!\n\n"); printf("Die Schiffe schneiden sich oder passen nicht ins Feld.\n\n"); printf("Geben Sie eine neue Stellung ein.\n\n"); i--; } } printf("\nAlle Schiffe wurden positioniert."); printf("\nZum Weitermachen die Eingabetaste betaetigen."); scanf("%c", &temp_x); } int pruefe_rechts(int feld[20][20], int spalte, int zeile, int laenge, int spaltenges) { int i; if(spalte + laenge > spaltenges) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile][spalte+i] != 0) return 0; } return 1; } int pruefe_links(int feld[20][20], int spalte, int zeile, int laenge) { int i; if(spalte + 1 - laenge < 0) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile][spalte- i] != 0) return 0; } return 1; } int pruefe_unten(int feld[20][20], int spalte, int zeile, int laenge, int zeilenges) { int i; if(zeile + laenge > zeilenges) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile+i][spalte] != 0) return 0; } return 1; } int pruefe_oben(int feld[20][20], int spalte, int zeile, int laenge) { int i; if(zeile + 1 - laenge < 0) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile-i][spalte] != 0) return 0; } return 1; } int schiff_zulaessig(int feld[20][20], int spalte, int zeile, int laenge, char richtung, int spaltenges, int zeilenges) { if(richtung == 'r') return pruefe_rechts(feld, spalte, zeile, laenge, spaltenges); if(richtung == 'l') return pruefe_links(feld, spalte, zeile, laenge); if(richtung == 'u') return pruefe_unten(feld, spalte, zeile, laenge, zeilenges); if(richtung == 'o') return pruefe_oben(feld, spalte, zeile, laenge); return 0; } int treffer(int feld[20][20], int spalte, int zeile, int schifflaenge[]) { if(feld[zeile][spalte] > 0 && feld[zeile][spalte] <= 20) { schifflaenge[feld[zeile][spalte]]--; return 1; } return 0; } void spielgebinn(int feld[20][20], int spalten, int zeilen, int schiffe, int schifflaenge[]) { int i; int rzeile; char temp_rspalte; int rspalte; for(i = 0; i < 20; i++) printf("\n\n"); printratefeld(feld, spalten, zeilen); for(i = 0; ;i++) { int schiff; printf("\n %d. Schuss: ", i+1); scanf("%c%d", &temp_rspalte, &rzeile); fflush(stdin); rspalte = temp_rspalte - 'a'; rzeile = rzeile - 1; if((feld[rzeile][rspalte] > GETROFFEN) || (feld[rzeile][rspalte] == 'w') || (feld[rzeile][rspalte] == '#')) { printf("Sie haben auf dieses Feld bereits geschossen."); printratefeld(feld, spalten, zeilen); continue; } if(treffer(feld, rspalte, rzeile, schifflaenge)) { schiff = feld[rzeile][rspalte]; feld[rzeile][rspalte] += GETROFFEN; if(!schifflaenge[schiff]) { int a, b; for(a = 0; a < zeilen; a++) { for(b = 0; b < spalten; b++) { if(feld[a][b] == schiff + GETROFFEN) feld[a][b] = '#'; } } } } else feld[rzeile][rspalte] = 'w'; printratefeld(feld, spalten, zeilen); if(spiel_ende(schiffe, schifflaenge))/*Hier ist der Fehler*/ { printf("\nALLE SCHIFFE VERSENKT !!!\n\n"); break; } } } int spiel_ende(int schiffe, int schifflaenge[]) { int i; for(i = 1; i <= schiffe; i++) { if(schifflaenge[i]) return 0; } return 1; } void printpositionfeld(int feld[20][20], int spalten, int zeilen) { int a, b; printf("\n "); for(a = 0; a < spalten; a++) printf(" %c", 'a'+a); printf("\n"); for(a = 0; a < zeilen; a++) { printf("%2d", a+1); for(b = 0; b < spalten; b++) { if(feld[a][b] == 0) printf(" -"); else printf(" x"); } printf("\n"); } } void printratefeld(int feld[20][20], int spalten, int zeilen) { int a, b; printf("\n "); for(a = 0; a < spalten; a++) printf(" %c", 'a'+a); printf("\n"); for(a = 0; a < zeilen; a++) { printf("%2d", a+1); for(b = 0; b < spalten; b++) { if(feld[a][b] > GETROFFEN) { printf(" x"); continue; } if(feld[a][b] == '#') { printf(" #"); continue; } if(feld[a][b] == 'w') { printf(" w"); continue; } printf(" -"); } printf("\n"); } }
Also der Compilier sagt mir einen Error an, der so lautet:
"Id returned 1 Exit Status"hab keine Ahnung mehr was ich falsch gemacht habe, sitze schon seit einigen Stunden dabei! ich finde nichts mehr!
-
Wo ist deine main Funktion?
-
Heinzi1991 schrieb:
Also der Compilier sagt mir einen Error an, der so lautet:
"Id returned 1 Exit Status"Das ist eine Meldung vom Linker. Der wird irgendetwas vermissen. Wie lauten denn die Meldungen davor?
Das extern bei den Funktionsdeklarationen kannst du weglassen.
Defines sollten in Großbuchstaben sein (allgemeine Praxis)
Überlasse Defines mit _ vor dem Namen dem Compiler.
-
Nirvash schrieb:
Wo ist deine main Funktion?
Mist, das wollte ich ja auch noch fragen
-
eine main Funktion hab ich noch nicht, kann es vl daran liegen, das ich noch keine main Funktion habe?
-
DirkB schrieb:
Das ist eine Meldung vom Linker. Der wird irgendetwas vermissen. Wie lauten denn die Meldungen davor?
Dann lies die Meldungen nochmal gründlich. Da wird schon drin stehen, dass er main vermisst.
-
Schreib doch einfach eine untendrunter:
int main() { }
und probiere es aus!
-
Also hier ist meine Main Funktion, aber die ist auf einer eigenen Datei!
# include <stdio.h> # include <stdlib.h> # inlcude "schiffe.h" main() { int feld[20][20]; int spalten, zeilen, schiffe; int schifflaenge[20]; printf(" S C H I F F E V E R S E N K E N \n\n\n"); printf("Anzahl Spalten (1 - 20): "); scanf("%d", &spalten); printf("Anzahl Zeilen (1 - 20): "); scanf("%d", &zeilen); printf("Anzahl Schiffe: "); scanf("%d", &schiffe); printf("\n\n\n"); printf("Die Eingabe der Schiffe erfolgt in der Form:\n"); printf("Spalte Zeile - Laenge - Richtung.\n"); printf("Richtung: u => nach unten\n"); printf(" o => nach oben\n"); printf(" r => nach rechts\n"); printf(" l => nach links\n"); init_feld(feld, spalten, zeilen); positioniere_schiffe(feld, spalten, zeilen, schiffe, schifflaenge); spielbeginn(feld, spalten, zeilen, schiffe, schifflaenge); }
-
Gibst du beim compilieren denn alle Dateien mit an?
Welchen Compiler (Name, Version) benutzt du und wie rufst du ihn auf?
Und wie lauten die Meldungen vom Compiler/Linker?
-
also hier der gesamte code mit der main funtkion:
# include <stdio.h> # include <stdlib.h> # include "schiffe.h" void init_feld(int feld[20][20], int spalten, int zeilen) { int a, b; for(a = 0; a < zeilen; a++) { for(b = 0; b < spalten; b++) feld[a][b] = 0; } printpositionfeld(feld, spalten, zeilen); } void positioniere_schiffe(int feld[20][20], int spalten, int zeilen, int schiffe, int schifflaenge[]) { int i, a; char temp_x, richtung; int x; int y, laenge; for(i = 0; i < schiffe; i++) { printf("\n %d. Schiffe: ", i); fflush(stdin); scanf("%c%d-%d-%c", &temp_x, &y, &laenge, &richtung); x = temp_x - 'a'; y = y - 1; if(schiff_zulaessig(feld, x, y, laenge, richtung, spalten, zeilen)) { for(a = 0; a < laenge; a++) { if(richtung == 'r') feld[y][x+a] = i; if(richtung == 'l') feld[y][x-a] = i; if(richtung == 'u') feld[y+a][x] = i; if(richtung == 'o') feld[y-a][x] = i; } schifflaenge[1] = laenge; printpositionfeld(feld, spalten, zeilen); } else { printf("\nIhre Schiffstellung ist nicht zulaessig!\n\n"); printf("Die Schiffe schneiden sich oder passen nicht ins Feld.\n\n"); printf("Geben Sie eine neue Stellung ein.\n\n"); i--; } } printf("\nAlle Schiffe wurden positioniert."); printf("\nZum Weitermachen die Eingabetaste betaetigen."); scanf("%c", &temp_x); } int pruefe_rechts(int feld[20][20], int spalte, int zeile, int laenge, int spaltenges) { int i; if(spalte + laenge > spaltenges) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile][spalte+i] != 0) return 0; } return 1; } int pruefe_links(int feld[20][20], int spalte, int zeile, int laenge) { int i; if(spalte + 1 - laenge < 0) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile][spalte- i] != 0) return 0; } return 1; } int pruefe_unten(int feld[20][20], int spalte, int zeile, int laenge, int zeilenges) { int i; if(zeile + laenge > zeilenges) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile+i][spalte] != 0) return 0; } return 1; } int pruefe_oben(int feld[20][20], int spalte, int zeile, int laenge) { int i; if(zeile + 1 - laenge < 0) return 0; for(i = 0; i < laenge; i++) { if(feld[zeile-i][spalte] != 0) return 0; } return 1; } int schiff_zulaessig(int feld[20][20], int spalte, int zeile, int laenge, char richtung, int spaltenges, int zeilenges) { if(richtung == 'r') return pruefe_rechts(feld, spalte, zeile, laenge, spaltenges); if(richtung == 'l') return pruefe_links(feld, spalte, zeile, laenge); if(richtung == 'u') return pruefe_unten(feld, spalte, zeile, laenge, zeilenges); if(richtung == 'o') return pruefe_oben(feld, spalte, zeile, laenge); return 0; } int treffer(int feld[20][20], int spalte, int zeile, int schifflaenge[]) { if(feld[zeile][spalte] > 0 && feld[zeile][spalte] <= 20) { schifflaenge[feld[zeile][spalte]]--; return 1; } return 0; } void spielgebinn(int feld[20][20], int spalten, int zeilen, int schiffe, int schifflaenge[]) { int i; int rzeile; char temp_rspalte; int rspalte; for(i = 0; i < 20; i++) printf("\n\n"); printratefeld(feld, spalten, zeilen); for(i = 0; ;i++) { int schiff; printf("\n %d. Schuss: ", i+1); scanf("%c%d", &temp_rspalte, &rzeile); fflush(stdin); rspalte = temp_rspalte - 'a'; rzeile = rzeile - 1; if((feld[rzeile][rspalte] > GETROFFEN) || (feld[rzeile][rspalte] == 'w') || (feld[rzeile][rspalte] == '#')) { printf("Sie haben auf dieses Feld bereits geschossen."); printratefeld(feld, spalten, zeilen); continue; } if(treffer(feld, rspalte, rzeile, schifflaenge)) { schiff = feld[rzeile][rspalte]; feld[rzeile][rspalte] += GETROFFEN; if(!schifflaenge[schiff]) { int a, b; for(a = 0; a < zeilen; a++) { for(b = 0; b < spalten; b++) { if(feld[a][b] == schiff + GETROFFEN) feld[a][b] = '#'; } } } } else feld[rzeile][rspalte] = 'w'; printratefeld(feld, spalten, zeilen); if(spiel_ende(schiffe, schifflaenge)) { printf("\nALLE SCHIFFE VERSENKT !!!\n\n"); break; } } } int spiel_ende(int schiffe, int schifflaenge[]) { int i; for(i = 1; i <= schiffe; i++) { if(schifflaenge[i]) return 0; } return 1; } void printpositionfeld(int feld[20][20], int spalten, int zeilen) { int a, b; printf("\n "); for(a = 0; a < spalten; a++) printf(" %c", 'a'+a); printf("\n"); for(a = 0; a < zeilen; a++) { printf("%2d", a+1); for(b = 0; b < spalten; b++) { if(feld[a][b] == 0) printf(" -"); else printf(" x"); } printf("\n"); } } void printratefeld(int feld[20][20], int spalten, int zeilen) { int a, b; printf("\n "); for(a = 0; a < spalten; a++) printf(" %c", 'a'+a); printf("\n"); for(a = 0; a < zeilen; a++) { printf("%2d", a+1); for(b = 0; b < spalten; b++) { if(feld[a][b] > GETROFFEN) { printf(" x"); continue; } if(feld[a][b] == '#') { printf(" #"); continue; } if(feld[a][b] == 'w') { printf(" w"); continue; } printf(" -"); } printf("\n"); } } main() { int feld[20][20]; int spalten, zeilen, schiffe; int schifflaenge[20]; printf(" S C H I F F E V E R S E N K E N \n\n\n"); printf("Anzahl Spalten (1 - 20): "); scanf("%d", &spalten); printf("Anzahl Zeilen (1 - 20): "); scanf("%d", &zeilen); printf("Anzahl Schiffe: "); scanf("%d", &schiffe); printf("\n\n\n"); printf("Die Eingabe der Schiffe erfolgt in der Form:\n"); printf("Spalte Zeile - Laenge - Richtung.\n"); printf("Richtung: u => nach unten\n"); printf(" o => nach oben\n"); printf(" r => nach rechts\n"); printf(" l => nach links\n"); init_feld(feld, spalten, zeilen); positioniere_schiffe(feld, spalten, zeilen, schiffe, schifflaenge); spielbeginn(feld, spalten, zeilen, schiffe, schifflaenge); }
ich benutze den devc++!
Meldung vom compilier: [Linker Error]...321: undefined reference to 'Spielbeginn(int()[20], int, int, int, int)
-
In C wird Groß-Kleinschreibung unterschieden.
Spielbeginn ist etwas anderes als spielbeginn.
Schau mal genau hin.
-
DirkB schrieb:
Welchen Compiler (Name, Version) benutzt du ..
Es gibt da eine verbreitete Version 4.9.9.2 vom März 2005.
Die ist schon über acht Jahre alt. mittlerweil gibt es aber eine neuere.
-
int main()
wäre angebrachter als nur
main()
-
so hab endlich meinen fehler gefunden! hab einmal Spielbeginn falsch geschrieben!
-
Heinzi1991 schrieb:
eine main Funktion hab ich noch nicht, kann es vl daran liegen, das ich noch keine main Funktion habe?
Hattest Du wirklich 300 Zeilen Code geschrieben ohne zwischendurch mal zu testen?
Man schreibt ein Programm nicht in einem Rutsch runter!
-
Heinzi1991 schrieb:
so hab endlich meinen fehler gefunden! hab einmal Spielbeginn falsch geschrieben!
Das finde ich etwas merkwürdig, denn in dem Code den du uns gezeigt hast, war alles richtig.
Also hast du uns nicht den Code gezeigt, mit dem du arbeitest. Da können wir dann auch keine Fehler finden.Immer Copy&Paste von dem aktuellen Stand.