Einfaches Entscheidungsproblem in furchtbarer Form :) Wie verbessern?
-
Hallo, Ich bin neu hier wie auch in c++ und habe soeben in einem channel mitgeteilt bekommen, dass dieser code, völlig "crappy" sei. Nun weiß ich nicht ob ich genau hier richtig bin: Er ist unter Linux für die Console geschrieben.
Wie kann man diesen Code besser ausdrücken bzw. vereinfachen (da einige Bugs auftreten):
if((set_pos_x==++pos_x&& set_pos_y==pos_y-2)||(set_pos_x==--pos_x && set_pos_y==pos_y-2)||(set_pos_x==pos_x-2 && set_pos_y==--pos_y) || (set_pos_x==pos_x-2 && set_pos_y==++pos_y)||(set_pos_x==--pos_x && set_pos_y==pos_y+2)||(set_pos_x==++pos_x && set_pos_y==pos_y+2)||(set_pos_x==pos_x+2 && set_pos_y==++pos_y)||(set_pos_x==pos_x+2 && set_pos_y==--pos_y)){ return true; }else{ return false; } }
Und noch eine Frage hintendrein:
Bedeutet --pos_x das gleiche wie pos_x-1? Dass es nicht das gleiche wie pos_x-- ist, ist klarGenauer: Wenn ich pos_x-2 ausdrücken will, und möchte, dass von dem integer wert schon bevor der Ausdruck ausgewertet wird, 2 abgezogen wurde - funktioniert das?
Viele Grüße und vielen Dank bereits im voraus!
Chris
-
chris_abyi schrieb:
Bedeutet --pos_x das gleiche wie pos_x-1?
Nein! Der "Wert" ist zwar derselbe, aber erste Ausdruck verändert pos_x, der zweite nicht, d.h. der Wert von pos_x ist hinterher unterschiedlich. Das könnte eine Fehlerursache sein. Eine andere könnte sein, dass dir vermutlich nicht klar ist, dass && und || ihren rechten Operanden in Abhängigkeit vom Ergebnis des linken nicht mehr auswerten. Wenn z.B bei diesem Teilausdruck
set_pos_x==pos_x-2 && set_pos_y==--pos_y
der linke Teil false ergibt, wird der rechte gar nicht ausgewertet, also wird auch das -- nicht ausgeführt.
Wie kann man diesen Code besser ausdrücken bzw. vereinfachen (da einige Bugs auftreten):
Es bringt nichts, einen fehlerhaften Code zu vereinfachen. Da der Code offenbar nicht tut, was er soll, würde auch die vereinfachte Version nicht funktionieren. Du musst schon verraten, was der Code tun soll.
-
Dieser Thread wurde von Moderator/in GPC aus dem Forum Andere GUIs - Qt, GTK+, wxWidgets in das Forum Linux/Unix verschoben.
Im Zweifelsfall bitte auch folgende Hinweise beachten:
C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?Dieses Posting wurde automatisch erzeugt.
-
Also - am besten hole ich mal etwas weiter aus und erkläre worum es geht. Als kleine Einstiegsaufgabe habe ich mir mal das Ziel gesetzt, ein Schachspiel für 2 Spieler zu programmieren. Hierbei ist keine KI drin oder sonstiges - nur die Figuren mit ihren Regeln.
Und die Regeln sind genau das worum es geht: Hiermit will ich die Regeln des Pferds abprüfen, dies sind 8 an der Zahl:
Ich gehe wie folgt vor:
Wenn die gewählte neue position identisch ist mit der aktuellen position um 2 erhöht (bspw.), dann erkläre die Regel als gültig.-> set_pos_x==pos_x-2 && set_pos_y==--pos_y
soll also heißen: wenn die neue position x (set_pos_x) identisch ist mit der aktuellen position um 2 vermindert, d.h. wenn der Spieler im zweidimensionalen array den zweiten index um zwei vermindert, erkläre die regel für gültig. Den zweiten Teil muss ich wahrscheinlich nicht vollständig erklären: Es ist erforderlich dass beide Bedingungen (x und y) zutreffen. Die einzelnen Regeln wurden in meiner Syntax mit || unterschieden, die einzelnen Teilbedingungen mit &&.Mir ist nun auf jeden Fall klar, dass ich statt &&, & einsetzen muss, damit auch die zweite Teilbedingung gecheckt wird. Allerdings ist die Frage, wie man vielleicht die ganze Abfrage vereinfachen oder umschreiben könnte.
Mir wurde gesagt ich solle so viele if's wie möglich vermeiden. Bewerten kann ich das nicht. Weiterhin: Ich solle virtual functions und types nuzten.Viele Grüße
Chris
-
chris_abyi schrieb:
Hiermit will ich die Regeln des Pferds abprüfen, dies sind 8 an der Zahl:
Das erklärt einiges. Damit kann ich dir auch sagen, dass die Verwendung von -- und ++ hier falsch ist.
Ich würde das so vereinfachen:
int deltax = abs( set_pos_x - pos_x ); int deltay = abs( set_pos_y - pos_y ); return deltax != 0 && deltay != 0 && deltax + deltay == 3;
Keine ifs mehr
-
Also - erst einmal vielen Dank!
Nun habe ich aber noch nicht ganz verstanden, wie diese Sache laufen soll.
Wenn ich nun bspw für pos_x=6, für pos_y=7, für set_pos_x=4 und für set_pos_y=5 habe - d.h. eine Situation wie in dieser Regel:
set_pos_x==pos_x-2 && set_pos_y==--pos_ydann erhalte ich bei:
int deltax = abs( set_pos_x - pos_x ); //=4-6 -> 2
int deltay = abs( set_pos_y - pos_y ); //=5-7 -> 2return deltax != 0 && deltay != 0 && deltax + deltay == 3;
//würde true, true, false ergeben. Also trifft die Regel nicht zu. Außerdem könnte man auch andere Koordinaten eingeben, die nicht die Figur ergeben, wie Sie ein Pferd springen darf. (Sprung bspw. 2 nach links, 1 nach oben)+Grüße
ChrisNachtrag:
Allerdings könnte man ja hingehen und das Teil wie folgt abändern. War das so gemeint?
int deltax = abs(set_pos_x - pos_x);
int deltay = aby(set_pos_y - pos_y);
return deltax == 2 && deltay == 2 && deltax + deltay == 4;Dies würde zumindest für die obenstehende Regel gelten, oder denke ich da falsch? Man könnte nun ja return-anweisungen für jede bewegungsmöglichkeit (8) angeben.
-
int deltax = abs( set_pos_x - pos_x ); int deltay = abs( set_pos_y - pos_y ); return deltax != 0 && deltay != 0 && deltax + deltay == 3;
der code sieht doch richtig aus:
deltax und deltay sind immer positiv und geben die gesprungene entfernung in x bzw y richtung an.
die letzte abfrage prüft ob sie zusammen 3 ergibt (muss sie ja: entweder zwei zur seite, einen nach vorne/hinten oder einen zur seite und zwei nach vorn/hinten)... und dafür darf deltax und deltay halt nur 1 oder 2 sein, nicht 0, und zusammen 3logisch .
-
... das schaut wirklich logisch aus und ist es auch - funktioniert. Irgendwie war ich vorhind wohl nur zu sehr von dem ganzen if-krams für jede einzelnen Fall geblendet..
vielen Dank!
Grüße
Chris
-
Wo prüfst du eigentlich die Positionen deiner Figuren auf Gültigkeit? Also, ob das Zielfeld innerhalb des Spielfeldes liegt und nicht von einer eigenen Figur besetzt ist?
Das würde ich da gleich mit erledigen.