/* Method is responsible for runtime checks: - Collision detection - Food eaten - Drawing Return(true) -> GameOver Return(false)-> Keep running */ bool GameController::performGameRuntimeChecks(CInputManager &inputManager, unsigned long &score, CollisionDetector &collisionDetector, DrawEngine drawEngine, int key, Snake &snake, vector<Cell> &foodList, FoodProvider &foodProvider, Cell lastCell) { //If collision detected if(collisionDetector.collisionDetected(snake)) { char message[] = "GAME OVER! <Press any key>"; drawEngine.showMessage(message); inputManager.GetNextKeyWait(&key); return true; } //Food eaten else if(collisionDetector.foodEaten(snake, foodList)) { //Setting new score score += snake.getCells().size()*2; //Draw score drawEngine.updateScore(score); //Add cell snake.addCell(); //Recieving new foodList vector<Cell> &list = foodProvider.provideFood(snake, drawEngine.getWindownWidth(), drawEngine.getMenuBorderHeight()); foodList = list; } //Draw snake drawEngine.drawSnake(snake, lastCell); //Draw food drawEngine.drawFood(foodList); return false; }
/* Detects if snake hits a wall or itself */ bool CollisionDetector::collisionDetected(Snake snake) { Cell header = snake.getHeader(); int x = header.getX(); int y = header.getY(); //Iteration snakes cells, detecting self hit for(int i = 1; i < snake.getCells().size(); i++) { Cell currCell = snake.getCells().at(i); if(currCell.getX() == x && currCell.getY() == y) return true; } if(x >= width || y >= height || x < 0 || y < 0) return true; return false; }