K
Hi Leutz,
ich hab mich mal dran gesetzt und 2 Methoden ausgearbeitet die aber leider nicht so toll funktionieren.
Beide kann man für verschiedene Zwecke einsetzen aber nicht für mein Problem (einen Fluss zu generieren - inklusive Seen).
Methode 1: Methode 1 tut den "Meeresspiegel erhöhen". Vom Programmablauf sollte es eigentlich weiterverwendbar sein. Das Problem liegt aber darin das ich nicht weiß wie Groß der "eventuelle" See wird...
Methode 2: Das ist eigentlich der Code der den Flusslauf berechnen soll. Problem ist das - wenn eine Senke kommt (also ein See entstehen soll) - nicht weiter berechnet werden kann... Im Beispiel hab ich 2 Flüsse machen lassen. Der erste fließt schön ins Meer der Zweite bricht ab wenn es nicht weitergeht...
Hab mir einer einen Vorschlag wie ich alles weitermachen kann?
Kei
______________________________________________________
Methode 1:
mail.cpp
#include <iostream.h>
#include <stdlib.h>
#include "see.hpp"
using namespace std;
int main(int argc, char *argv[])
{
see* wasser = new see();
delete wasser;
system("PAUSE");
return 0;
}
see.hpp
class see {
private:
//See Koordinaten
int sK[10][15];
//Starte mit der Seeerstellung
void createSee(void);
//ausgabe des aktuellen Sees
void showSee(void);
public:
see(void);
~see(void);
};
see.cpp
#include <iostream.h>
#include "see.hpp"
void see::showSee(){
for(int k=0; k<10; k++){
for(int j=0; j<15; j++){
cout << sK[k][j] << " ";
}
cout << endl;
}
}
void see::createSee(){
//höhe
int h=0;
//umgebungen
int xPl;
int xMi;
int yPl;
int yMi;
while(h < 6){
for(int y=1; y<9; y++){
yPl = y+1;
yMi = y-1;
for(int x=1; x<14; x++){
xPl = x+1;
xMi = x-1;
if(sK[yMi][xMi] <= h){
sK[yMi][xMi]++;
}
if(sK[yMi][x] <= h){
sK[yMi][x]++;
}
if(sK[yMi][xPl] <= h){
sK[yMi][xPl]++;
}
if(sK[y][xMi] <= h){
sK[y][xMi]++;
}
if(sK[y][x] <= h){
sK[y][x]++;
}
if(sK[y][xPl] <= h){
sK[y][xPl]++;
}
if(sK[yPl][xMi] <= h){
sK[yPl][xMi]++;
}
if(sK[yPl][x] <= h){
sK[yPl][x]++;
}
if(sK[yPl][xPl] <= h){
sK[yPl][xPl]++;
}
}
}
h++;
}
}
see::see(){
//see Ausgangsansicht
int sA[10][15] = {
{9,9,9,9,9,9,9,9,9,9,9,9,9,9,9},
{8,1,1,1,1,1,1,1,1,1,1,1,1,1,9},
{9,1,1,1,1,1,1,1,1,1,1,1,1,1,9},
{9,1,1,1,1,1,1,1,6,6,6,1,1,1,7},
{9,1,1,1,1,1,1,7,7,7,6,1,1,1,9},
{9,1,1,1,1,1,1,7,8,7,1,1,1,1,9},
{9,1,1,1,1,1,1,7,7,1,1,1,1,1,9},
{9,1,1,1,1,1,1,1,1,1,1,1,1,1,9},
{9,1,1,1,1,1,1,1,1,1,1,1,1,1,9},
{9,9,9,9,9,9,9,9,9,9,9,9,9,9,9}
};
for(int k=0; k<10; k++){
for(int j=0; j<15; j++){
sK[k][j] = sA[k][j];
}
}
createSee();
showSee();
}
see::~see(){
}
______________________________________________________
Methode 2:
main.cpp
#include <iostream.h>
#include <stdlib.h>
#include "see.hpp"
using namespace std;
int main(int argc, char *argv[])
{
see* wasser = new see();
delete wasser;
system("PAUSE");
return 0;
}
see.hpp
class see {
private:
//Map Koordinaten
int map[9][9];
//Fluss
int fluss[9][9];
//Starte mit der Flusserstellung
int createFluss(int,int,int);
//ausgabe der Karte
void showMap(void);
public:
see(void);
~see(void);
};
see.cpp
#include <iostream.h>
#include "see.hpp"
void see::showMap(){
cout << "Map" << endl;
for(int k=0; k<9; k++){
for(int j=0; j<9; j++){
cout << map[k][j] << " ";
}
cout << endl;
}
cout << endl << "Map & Fluss" << endl;
for(int k=0; k<9; k++){
for(int j=0; j<9; j++){
if(fluss[k][j] != 0){
cout << "~" << " ";
}else{
cout << map[k][j] << " ";
}
}
cout << endl;
}
}
int see::createFluss(int x, int y, int flussNr){
/*
Tut einen Flusslauf entstehen lassen
*/
//Wird das Meer erreicht ist der Flusslauf an sein Ende gelangt
if(map[y][x] < 1){
return 1;
}
//Für das aktuelle Feld den Flusspunkt deffinieren
fluss[y][x] = flussNr;
//Berechnet den nächsten Punkt an dem der Fluss weiterfließt
//Flusslauf nach Norden
if(
map[y][x] >= map[y-1][x] &&
fluss[y-1][x-1] == 0 &&
fluss[y-1][x] == 0 &&
fluss[y-1][x+1] == 0
){
createFluss(x, y-1, flussNr);
}
//Flusslauf nach Osten
if(
map[y][x] >= map[y][x+1] &&
fluss[y-1][x+1] == 0 &&
fluss[y][x+1] == 0 &&
fluss[y+1][x+1] == 0
){
createFluss(x+1, y, flussNr);
}
//Flusslauf nach Süden
if(
map[y][x] >= map[y+1][x] &&
fluss[y+1][x-1] == 0 &&
fluss[y+1][x] == 0 &&
fluss[y+1][x+1] == 0
){
createFluss(x, y+1, flussNr);
}
//Flusslauf nach Westen
if(
map[y][x] >= map[y][x-1] &&
fluss[y-1][x-1] == 0 &&
fluss[y][x-1] == 0 &&
fluss[y+1][x-1] == 0
){
createFluss(x-1, y, flussNr);
}
cout << "Senke - Hier müsste der Code für das entstehen eines Sees rein..." << endl;
return 1;
}
see::see(){
//Map
int sA[9][9] = {
{9,9,9,9,9,9,9,9,9},
{9,7,8,7,9,9,8,7,9},
{9,6,4,6,9,9,7,7,9},
{9,5,3,3,9,9,7,6,9},
{9,4,6,2,9,9,4,5,9},
{9,3,1,1,9,9,3,7,9},
{9,7,1,7,9,9,2,2,9},
{9,7,1,7,9,9,9,9,9},
{0,0,0,0,0,0,0,0,0}
};
for(int k=0; k<9; k++){
for(int j=0; j<9; j++){
map[k][j] = sA[k][j];
fluss[k][j] = 0;
}
}
//Fluss bei x=1; y=1 starten mit der FlussNummer 1
createFluss(1,1,1);
//Fluss bei x=6; y=1 starten mit der FlussNummer 2
createFluss(6,1,2);
//Endergebnis ausgeben
showMap();
}
see::~see(){
}