if (cheeseRectangle.IntersectsWith(tomatoes[i].rectangle)) {
// воспроизводим звук столкновения сыра с помидором
tomatoHitSound.Play();
}
Дальнейшие улучшения
Но игру все еще можно улучшить. В следующем списке указаны дополнительные возможности, которые необходимо реализовать.
□ Режим «attract», включающийся, когда пользователь не играет.
□ Потеря жизни, если сыр ударился о нижнюю границу экрана.
□ При уничтожении всех томатов они должны появиться чуть ниже, и скорость игры должна возрасти.
□ Добавление в игру случайных элементов.
В программу надо ввести булеву переменную gameLive
, которая имеет значение True
, когда пользователь ведет игру. Если значение переменной равно False
, то сыр будет двигаться по экрану, но никаких игровых действий производиться не будет.
Для этого потребуется изменить метод, выполняющийся при старте игры. Новая версия приведена в листинге 11.44.
/// <summary>
/// True, если игра запущена на экране.
/// </summary>
private bool gameLive = false;
/// <summary>
/// Число оставшихся жизней.
/// </summary>
private int livesLeft;
/// <summary>
/// Число жизней, доступных для игрока.
/// </summary>
private int startLives = 3;
private void startGame() {
// Устанавливаем число жизней, счет и сообщения
livesLeft = startLives;
scoreValue = 0;
messageString = 'Счет: 0 Жизнь: ' + livesLeft;
// Располагаем помидоры наверху экрана
tomatoDrawHeight = tomatoLevelStartHeight;
placeTomatoes();
// Поместим батон в центре экрана
breadRectangle.X = (this.ClientSize.Width - breadRectangle.Width) / 2;
breadRectangle.Y = this.ClientSize.Height / 2;
// Поместим сыр над батоном в центре экрана
cheeseRectangle.X = (this.ClientSize.Width - cheeseRectanglе.Width) / 2;
cheeseRectangle.Y = breadRectangle.Y — cheeseRectangle.Height;
// Установим начальную скорость
xSpeed = 1;
ySpeed = 1;
// Установим флаг, позволяющий начать игру
gameLive = true;
}
Этот код возвращает все объекты на исходные позиции и начинает новую игру. Батон располагается в середине экрана, а сыр чуть выше него. Этот метод связан с пунктом меню, позволяющим начать игру.
Теперь надо добавить код, который проверяет, не коснулся ли сыр нижней границы экрана. В этом случае вызывается метод loseLife
, который уменьшает количество жизней у игрока.
Соответствующий код приведен в листинге 11.45.
if ((cheeseRectangle.Y + cheeseImage.Height) >= this.Height) {
// сыр достиг нижней границы экрана
loseLife();
goingDown = false;
}
Метод loseLife
подсчитывает количество оставшихся жизней и заканчивает игру, если все жизни были израсходованы. Также метод может показывать лучший достигнутый счет игры. Его код приведен в листинге 11.46.
private void loseLife() {
if (!gameLive) {
return;
}
// Потеряли еще одну жизнь
livesLeft--;
if (livesLeft > 0) {
// обновим сообщение на экране
messageString = 'Счет: ' + scoreValue + ' Жизнь: ' + livesLeft;
} else {
// Останавливаем игру
gameLive = false;
// сравниваем с лучшим результатом
if (scoreValue > highScoreValue) {
highScoreValue = scoreValue;
}
// меняем сообщение на экране
messageString = 'Лучший результат: ' + highScoreValue;
}
}