Antwort
von
nach 6 Stunden
0
hilfreich
Re^2: array übergeben
Hey!
Danke zunächst ein mal für die schnelle Antwort. Das Ganze sollte wirklich in C geschehen und nicht in C++.
Gern nehm ich dein Angebot an und kopiere dir mal die(meiner Meinung nach) relevanten Teile hier rein.
aber das wird wirklich etwas mehr... =)
Dazu dann vielleich auch noch einge erklärende Worte: Zunächst weiß ich, dass mein Programmierstil nicht besonders gut ist. Bitte reiß mir deswegen nicht gleich den Kopf ab. Wie gesagt bin mehr oder weniger blutiger Anfänger und freue mich, dass ich überhaupt soweit gekommen bin.
Die Eingabe besteht aus einer while-schleife und einen riesigen switch. Die Fälle sind jedoch alle gleich aufgebaut und ahst du einen verstanden (was dir nicht schwer fallen sollte ;)) hast du alle verstanden. Zum Ende lasse ich mir noch einmal das Feld ausgeben, um zu testen ob die SChiffe wirklich drin stehen. (Ja )
Gleiches mache ich als erstes in der Schussabfrage. Hier ist dann schon nichts mehr von Schiffen zu sehen.
Liegt das daran, dass das ganze bei der Eingabe nur lokal geschieht? (ich war der Meinung, wenn ich in eine Header-Datei mit einer Variablen einbinde, wirkt das wie eine globale Variable?
Die Feld-Header-Datei:
static int feld[11][27]; // Feld für die Eingabe der Boote
static int a_feld[11][27]; // Feld für die Eingabe der Schüsse
Die main:
//eigene Headerdateien
#include "feldausgabe.h" // um die verschiedenen Felder auszugeben
#include "feld.h" //Feld als globale Variable definieren
#include "Schussabfrage.h" //Abfrage der Schüsse
#include "Schiffe.h" //Anzeigen der Auswahlmöglichkeiten
#include "Eingabe.h"
#include "start.h" //Ausgabe des Startbildschirms
int _tmain(int argc, _TCHAR* argv[])
{ int x,y;
start(); //Ausgabe des Startbildschirms
feldausgabe(); //Feldausgabe
Schiffe (); //Ausgabe der Eingabemöglichkeiten
Eingabe ();
system("pause");
clear(); // Löschen des Bildschirms
feldausgabe2();
schussabfrage();//Abfrage der Schüsse
system("pause");
return 0;
}
Die Eingabe-Funktion: (der Übersichtlichkeit habe ich nur die ersten beiden case gepostet)
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "borland.h"
#include "feld.h"
#include "lösche.h"
#include "Eingabe.h"
#include "feldausgabe.h"
int Eingabe()
{
int welches=0, setzen=0;
int posx1=0, posy1=0, hilf1=0, hilf2=0, hilf3=0;
int x,y;
do
{
gotoxy(35,10); //Springe rechts neben das Speilfeld
printf("welches Schiffe mochten sie setzen?");
scanf("%c",&hilf3);
welches = (int) (hilf3-48);
fflush(stdin); //Löschen des Eingabe Puffers
gotoxy(35,11); //springe rechts neben den Bildschirm
printf("welcher Buchstabe?"); // Uboot waagerecht 3 Felder´groß
scanf("%c",&hilf1);
fflush(stdin); //Löschen des Eingabe Puffers
posx1 = (int) hilf1; //Umwandlung von char zu int
gotoxy(35,12); // springe rechts neben das Spielfeld
printf("Welche Nummer?");
scanf("%c",&hilf2);
posy1= (int) (hilf2-48);
fflush(stdin); //Löschen des Eingabe Puffers
switch(welches) // Schalter nach Auswahl des Bootes
{
case 1: if (feld [posx1-64][posy1+1] == '#' || //Uboot waagerecht 3 Felder
feld [posx1-63][posy1+1] == '#' || // Überprüfen ob eins der Ausgewählten Felder belegt ist
feld [posx1-62][posy1+1] == '#')
{
gotoxy(35,16);
printf("Feld bereists belegt!! Neuses Boot und Feld aussuchen");
}
else if (posx1>=65 && posx1<=88) //Überprüfen ob das Boot innerhalb des Spielfeldes gesetzt wird
{ // Setzen des Bootes
feld [posx1-64][posy1+1] = '#';
feld [posx1-63][posy1+1] = '#';
feld [posx1-62][posy1+1] = '#';
gotoxy(posx1+1-64,posy1+10+1); //springe an die gewählte Position
printf("%c",feld [posx1-64][posy1+1]); //Bildschirmausgabe das das Boot gesetzt ist
gotoxy(posx1+1-63,posy1+10+1); //springe an die gewählte Position
printf("%c",feld [posx1-63][posy1+1]); //Bildschirmausgabe das das Boot gesetzt ist
gotoxy(posx1+1-62,posy1+10+1); //springe an die gewählte Position
printf("%c",feld [posx1-62][posy1+1]); //Bildschirmausgabe das das Boot gesetzt ist
}
else
{
gotoxy(35,16);
printf("Schiff liegt außerhalb des Spielfeldes!!");
}
break;
case 2 : if (feld[posx1-64][posy1+1] == '#'||
feld [posx1-63][posy1+1] == '#') //Überprüfen ob das Ausgewählte Feld schon belegt ist
{
gotoxy(35,16);
printf("error!! Neues Boot und Feld auswaelen\n");
}
else if (posx1>=65 && posx1<=89) //Setzen des Bootes
{
feld [posx1-64][posy1+1] = '#';
feld [posx1-63][posy1+1] = '#';
gotoxy(posx1+1-64,posy1+10+1); //springe an die gewählte Position
printf("%c",feld [posx1-64][posy1+1]); //Bildschirmausgabe das das Boot gesetzt ist
gotoxy(posx1+1-63,posy1+10+1); //springe an die gewählte Position
printf("%c",feld [posx1-63][posy1+1]); //Bildschirmausgabe das das Boot gesetzt ist
}
else
{
gotoxy(35,16);
printf("Schiff liegt außerhalb des Spielfeldes!!");
}
break;
printf("Moechten Sie weitere Schiffe setzen?"); //Bedingung while-Schleife
gotoxy(35,14); //springe an diese Position
printf("ja (j) oder nein(n)?");
scanf("%c",&setzen);
fflush(stdin); //Löschen des Eingabe Puffers
if (setzen != 'n')
{
löschen(); //Löschen der vorhergehenden Auswahl und Fehlermeldungen
}
}
while (setzen != 'n');
for (x=1; x<=10; x++) //Ausgabe der Zeichen im Array als Überprüfung
{
for (y=1; y<=26; y++)
{
{
gotoxy(y+1,x+10);
printf("%c",feld[y][x]);
}
}
printf("\n");
}
return 0;
}
Die Schussabfrage:
#include "stdafx.h"
#include "stdlib.h"
#include "stdio.h"
#include "borland.h" // für gotoxy-Befehle
//eigene Headerdateien
#include "feld.h" //Feld als globale Variable definieren
#include "lösche2.h"
int schussabfrage ()
{
int posx=0,posy=0,hilf=0,hilf2=0;
int x,y;
int weiter=0;
float i=0, t=0;
for (x=1; x<=10; x++) //Ausgabe der Zeichen im Array als Überprüfung
{
for (y=1; y<=26; y++)
{
{
gotoxy(y+1,x+10);
printf("%c",feld[x][y]);
}
}
printf("\n");
}
do
{
gotoxy(35,11);
printf("welcher Buchstabe?"); //Abfrage des Schusses
scanf("%c",&hilf);
fflush(stdin); //Löschen des Eingabe Puffers
posx = (int) hilf; //Umwandlung in einen int-Wert
gotoxy(35,12);
printf("Welche Nummer?"); //Abfrage y-wert
scanf("%i",&posy);
fflush(stdin); //Löschen des Eingabe Puffers
//posy = (int) hilf2; //Umwandlung in einen int-Wert
if (a_feld[posx-64][posy+1] == 'o' ||a_feld[posx-64][posy+1] == 'x')
{
gotoxy (35,15);
printf("Feld wurde bereits beschossen!");
}
if ((posx>=65 && posx<=90)&&(posy>=0 && posy<=9)) //gültiger Schuss
if (feld[posx-64][posy+1] == '#') //Vergleich mit gesetzten schiffe
{
a_feld[posx-64][posy+1] = 'x'; //Treffer
t++; //Treffer+1
i++; //Schüsse +1
}
else
{
a_feld[posx-64][posy+1] = 'o'; //kein Treffer
i++; //Schüsse+1
}
else
{
gotoxy (35,15);
printf("ungültiger Schuss");
}
gotoxy(posx+1-64,posy+10+1); //an die gewählte Position springen
printf("%c",a_feld[posx-64][posy+1]); //'x' oder 'o' auf den Bildschirm ausgeben
gotoxy(35,13); //immer an die gleiche stelle springen, damit feld "unbeschädigt" bleibt
printf("brechen sie das suchen mit x ab!"); //Bedingung für die while-schleife
scanf("%c", &weiter);
fflush(stdin); //Löschen des Eingabepuffers
if (weiter != 'x');
{
löschen2(); //Löschen der vorherigen Auswahl
}
}
while (weiter != 'x');
for (x=1; x<=10; x++) //Ausgabe der Zeichen im Array
{ //Anzeigen der Versteckten Schiffe und der Schüsse
for (y=1; y<=26; y++)
{
if (feld[y][x] == '#' && a_feld[y][x] != 'x')
{
gotoxy(y+1,x+10);
printf("%c",feld[y][x]);
}
}
printf("\n");
}
gotoxy(35,17);
printf("Trefferquote:%.2f", (t/i)*100); //Berechnung derr Trefferquote
return 0;
}
FAlls du dir das wirklich angeguckt hast, wäre ich dir sehr dankbar!!!!Auch für tipps und Ansätze bin ich jederzeit offen!!
MfG
Student90