□ Режим «attract», включающийся, когда пользователь не играет.
□ Потеря жизни, если сыр ударился о нижнюю границу экрана.
□ При уничтожении всех томатов они должны появиться чуть ниже, и скорость игры должна возрасти.
□ Добавление в игру случайных элементов.
В программу надо ввести булеву переменную gameLive
, которая имеет значение True
, когда пользователь ведет игру. Если значение переменной равно False
, то сыр будет двигаться по экрану, но никаких игровых действий производиться не будет.
Для этого потребуется изменить метод, выполняющийся при старте игры. Новая версия приведена в листинге 11.44.
Листинг 11.44
///
/// True, если игра запущена на экране.
///
private bool gameLive = false;
///
/// Число оставшихся жизней.
///
private int livesLeft;
///
/// Число жизней, доступных для игрока.
///
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.
Листинг 11.45
if ((cheeseRectangle.Y + cheeseImage.Height) >= this.Height) {
// сыр достиг нижней границы экрана
loseLife();
goingDown = false;
}
Метод loseLife
подсчитывает количество оставшихся жизней и заканчивает игру, если все жизни были израсходованы. Также метод может показывать лучший достигнутый счет игры. Его код приведен в листинге 11.46.
Листинг 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;
}
}
Этот код не выполняется, если игра не запущена. При вызове метод уменьшает количество жизней и подсчитывает оставшееся число. Пока есть жизни, игра продолжается. В противном случае обновляется счет и игра выключается.
Последний метод в нашей игре отвечает за перерисовку томатов, когда они все уничтожены. Чтобы отследить эту ситуацию, в метод Form1_Paint
добавлен очень простой код, который приведен в листинге 11.47.
Листинг 11.47
bool gotTomato = false;
for (int i = 0; i < tomatoes.Length; i++) {
if (tomatoes[i].visible) {
gotTomato = true;
g.DrawImage(tomatoImage, tomatoes[i].rectangle.X, tomatoes[i].rectangle.Y);
}
}
if (!gotTomato) {
newLevel();
}
Если пользователь выбил все томаты, то вызывается метод newLevel
. Метод просто перерисовывает томаты и увеличивает скорость, как показано в листинге 11.48.
Листинг 11.48
private void newLevel() {
if (!gameLive) {
return;
}
// Рисуем помидоры чуть ниже
tomatoDrawHeight += tomatoSpacing;
if (tomatoDrawHeight >
(ClientSize.Height - (breadRectangle.Height+tomatoImage.Height))) {
// Рисуем помидоры снова в верхней части экрана
tomatoDrawHeight = tomatoLevelStartHeight;
}
placeTomatoes(); // Увеличиваем скорость
if (xSpeed < maxSpeed) {
xSpeed++;
ySpeed++;
}
}
Метод перемещает томаты все ниже и ниже. Когда они почти достигнут края экрана, то будут снова перемещены в верхнюю часть экрана.
Читать дальше