| Autor |
Nachricht |
Modarek
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2012
Beiträge: 5
|
Modarek Mitglied
13:14:33 07.08.2012 Titel: |
|
Zitieren |
So,
ich habe es endlich geschafft.
Wahrscheinlich ist es keine elegante Lösung, aber sie funktioniert. Anstatt mit "continue" zu arbeiten habe ich es mit einem "Label" und "goto" gemacht.
Hier der Code:
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | void Snake::putFruit() {
putFruit:
while (true) {
int tmpX = random()%_maxX + 1;
int tmpY = random()%_maxY + 1;
for (int i = 0; i <= S.size(); i++)
if (S[i].x == tmpX && S[i].y == tmpY)
goto putFruit;
if (tmpX >= _maxY - 2 || tmpY >= _maxX - 3)
goto putFruit;
fruit.x = tmpX;
fruit.y = tmpY;
break;
}
move(fruit.y, fruit.x);
addch(fruitChar);
refresh();
} | |
Vielen Dank an alle die geholfen haben!
LG Modarek |
|
|
|
 |
C. elegans
Unregistrierter
|
C. elegans Unregistrierter
14:40:05 07.08.2012 Titel: |
|
Zitieren |
| Modarek schrieb: |
Wahrscheinlich ist es keine elegante Lösung [...]
|
Das ist richtig Und die Verwendung von goto macht es richtig schlimm. Die Vorposter haben es ja schon gesagt: Zerlege das in ein paar logische Methoden
| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | struct coord
{
int x;
int y;
coord(int x, int y) : x(x), y(y)
{
}
};
/*
* Ich nehme mal an, Deine Snake sei definiert als vector<coord> S
*/
bool isOnSnake(coord f)
{
for (int i = 0; i <= S.size(); i++)
{
if (f == S[i])
{
return true;
}
}
return false;
}
coord makeRandomCoordinate(coord min, coord max)
{
coord c;
do
{
c.x = random()%_maxX + 1;
c.y = random()%_maxY + 1;
} while ( (c.x >= max.x ) || (c.y >= max.y)
|| (c.x < min.x ) || (c.y < min.y));
return c;
}
void Snake::putFruit()
{
coord fruit;
do
{
fruit = makeRandomCoordinate(coord(0,0), coord(maxY-2, maxX-3));
} while (isOnSnake(fruit));
move(fruit.y, fruit.x);
addch(fruitChar);
refresh();
} | | |
|
|
|
 |
camper
Mitglied
Benutzerprofil
Anmeldungsdatum: 06.08.2004
Beiträge: 5802
|
camper Mitglied
14:59:27 07.08.2012 Titel: |
|
Zitieren |
EIn bisschen gekürzt wird daraus| C++: | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 | struct coord
{
int x;
int y;
};
bool operator==(const coord& lhs, const coord& rhs) { return lhs.x == rhs.x && lhs.y == rhs.y; }
bool isOnSnake(const coord& f)
{
return find(begin(S), end(S), [&](const coord& s_pos){ return f == s_pos; }) != end(S);
}
coord makeRandomCoordinate(coord min, coord max)
{
return { random()%(max.x-min.x+1)+min.x, random()%(max.y-min.y+1)+min.y };
}
coord makeFreeRandomCoordinate(coord min, coord max)
{
for (;;)
{
coord pos = makeRandomCoordinate( min, max );
if ( !isOnSnake( pos ) )
return pos;
}
}
void Snake::putFruit()
{
coord fruit = makeFreeRandomCoordinate({0,0}, {maxY-2, maxX-3});
move(fruit.y, fruit.x);
addch(fruitChar);
refresh();
} | | |
Zuletzt bearbeitet von camper am 09:44:23 08.08.2012, insgesamt 2-mal bearbeitet |
|
 |
C. elegans
Unregistrierter
|
C. elegans Unregistrierter
09:39:08 08.08.2012 Titel: |
|
Zitieren |
@Camper: Ja, das ist noch mal kürzer. Wobei: Der operator== ist m.E. nicht nötig, da die struct Elementweise verglichen wird. Dann wäre es noch kürzer.
Ich hatte zuerst eine ähnliche Version, allerdings nicht mit dem schönen random Konstrukt von Dir. Dann habe ich mir aber überlegt, dass der TO bei der Version von mir gar nichts mehr von seinem Code wiederfindet. Ich denke, zum Lernen sind kleinere (Fort-)Schritte hilfreicher (wobei Deine Lösung die deutlich elegantere ist ) |
|
|
|
 |
zergleicher
Unregistrierter
|
zergleicher Unregistrierter
08:08:17 09.08.2012 Titel: |
|
Zitieren |
Ne, operator== ist immer nötig, wenn es sich um benutzerdefinierte Typen handelt. Klassen werden nicht automatisch memberweise verglichen. |
|
|
|
 |
cazubi
Unregistrierter
|
cazubi Unregistrierter
11:05:56 23.10.2012 Titel: |
|
Zitieren |
Da ihr jetzt ja schon alle so schön über Snake redet und voll im Thema drinne seit habe ich auch eine Frage.
Um C zu lernen hab ich jetzt auch Snake programmiert und es eigentlich komplett fertig, das einzige was mir noch fehlt ist das die Schlange sich nicht von alleine bewegen kann.
Ich lasse die Richtung in die sich die Schlange bewegen soll von einem getchar() auslesen welches nicht mit <ENTER> bestätigt werden muss. Der nächste Schritt wäre dem programm zu sagen nach einer bestimmten zeit geh in die letzt gegangene Richtung aber wie ?? |
|
|
|
 |
Belli
Mitglied
Benutzerprofil
Anmeldungsdatum: 29.08.2009
Beiträge: 1773
|
Belli Mitglied
11:23:36 23.10.2012 Titel: |
|
Zitieren |
| zergleicher schrieb: | | Ne, operator== ist immer nötig, wenn es sich um benutzerdefinierte Typen handelt. Klassen werden nicht automatisch memberweise verglichen. |
Das ist falsch!
Edit:
Doch nicht falsch - ich habs mit dem operator= verwechselt, der standardmäßig erzeugt wird. |
Zuletzt bearbeitet von Belli am 11:30:10 23.10.2012, insgesamt 1-mal bearbeitet |
|
 |
SeppJ
Moderator
Benutzerprofil
Anmeldungsdatum: 10.06.2008
Beiträge: 17983
|
SeppJ Moderator
11:31:04 23.10.2012 Titel: |
|
Zitieren |
|
 |
|
Nächstes Thema anzeigen
Vorheriges Thema anzeigen
Sie können Beiträge in dieses Forum schreiben. Sie können auf Beiträge in diesem Forum antworten. Sie können Ihre Beiträge in diesem Forum nicht bearbeiten. Sie können Ihre Beiträge in diesem Forum nicht löschen. Sie können an Umfragen in diesem Forum nicht mitmachen.
|
|
|
|
|