C++ If Statement optimaler implementieren



  • Hallo,
    ich fange gerade mit C++ an und wollte fragen, ob jemand eine bessere Variante für folgenden Code hat. Es geht mir in erster Linie um Lesbarkeit, aber er sollte auch nicht zu schlecht geschrieben sein.

    auto snakeDirection = GameSnake->GetDirection();
    	bool statements[8]
    	{
    		snakeDirection != Snake::Direction::Right,
    		GetKey(olc::Key::A).bPressed ||
    		GetKey(olc::Key::LEFT).bPressed,
    		snakeDirection != Snake::Direction::Left,
    		GetKey(olc::Key::D).bPressed ||
    		GetKey(olc::Key::RIGHT).bPressed,
    		snakeDirection != Snake::Direction::Down,
    		GetKey(olc::Key::W).bPressed ||
    		GetKey(olc::Key::UP).bPressed,
    		snakeDirection != Snake::Direction::Up,
    		GetKey(olc::Key::S).bPressed ||
    		GetKey(olc::Key::DOWN).bPressed,
    	};
    	if (statements[0] && statements[1])
    		GameSnake->SetDirection(Snake::Direction::Left);
    	else if (statements[2] && statements[3])
    		GameSnake->SetDirection(Snake::Direction::Right);
    	else if (statements[4] && statements[5])
    		GameSnake->SetDirection(Snake::Direction::Up);
    	else if (statements[6] && statements[7])
    		GameSnake->SetDirection(Snake::Direction::Down);
    

    Was mir einfallen würde, wäre ein Swtich statement, dort kann man aber kein "this" benutzen. Habt ihr eine verbesserte Schreibweise? Evtl auch mit C++ eigenen Tools?

    Wie man sieht gehts um Input Validierung, bzw. Verarbeitung



  • @Gamestarplayer41 sagte in C++ If Statement optimaler implementieren:

    dort kann man aber kein "this" benutzen

    Warum nicht?
    Und wozu brauchst du diese statements? Schreib die Abfragen da, wo du sie brauchst, das wäre auf jeden Fall lesbarer.

    p.s. Ich hatte erst gar nicht gesehen, was in den if´s passiert, aber so muss ich an eine "state machine" denken, das wäre auch ein möglicher Ansatz.



  • @Mechanics das Problem das direkt in die ifs zu schreiben find ich, dass es dann unübersichtlich wird find ich



  • @Gamestarplayer41 sagte in C++ If Statement optimaler implementieren:

    dass es dann unübersichtlich wird find ich

    Da bist du sehr wahrscheinlich der Einzige.



  • Nicht wirklich weniger Code, aber IMO übersichtlicher:

    struct KeyMapEntry {
    	olc::Key key1;
    	olc::Key key2;
    	Snake::Direction direction;
    	Snake::Direction oppositeDirection;
    };
    
    static constexpr KeyMapEntry keyMap[] = {
    	{ olc::Key::A, olc::Key::LEFT, Snake::Direction::Left, Snake::Direction::Right },
    	{ olc::Key::D, olc::Key::RIGHT, Snake::Direction::Right, Snake::Direction::Left },
    	{ olc::Key::W, olc::Key::UP, Snake::Direction::Up, Snake::Direction::Down },
    	{ olc::Key::S, olc::Key::DOWN, Snake::Direction::Down, Snake::Direction::Up },
    	};
    
    auto currentDirection = GameSnake->GetDirection();
    
    for (auto const& entry : keyMap) {
    	bool const keyPressed = GetKey(entry.key1).bPressed || GetKey(entry.key2).bPressed;
    	if (keyPressed && currentDirection != entry.oppositeDirection) {
    		GameSnake->SetDirection(entry.direction);
    		currentDirection = entry.direction; // nur relevant falls es später noch verwendet wird
    		break;
    	}
    }
    


  • @hustbaer Danke, das macht das ganze wirklich sehr viel übersichtlicher 😃


Log in to reply