Дальнейшие улучшения
Дальнейшие улучшения
Но игру все еще можно улучшить. В следующем списке указаны дополнительные возможности, которые необходимо реализовать.
? Режим «attract», включающийся, когда пользователь не играет.
? Потеря жизни, если сыр ударился о нижнюю границу экрана.
? При уничтожении всех томатов они должны появиться чуть ниже, и скорость игры должна возрасти.
? Добавление в игру случайных элементов.
В программу надо ввести булеву переменную gameLive, которая имеет значение True, когда пользователь ведет игру. Если значение переменной равно False, то сыр будет двигаться по экрану, но никаких игровых действий производиться не будет.
Для этого потребуется изменить метод, выполняющийся при старте игры. Новая версия приведена в листинге 11.44.
Листинг 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.
Листинг 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++;
}
}
Метод перемещает томаты все ниже и ниже. Когда они почти достигнут края экрана, то будут снова перемещены в верхнюю часть экрана.
Тестирование
Игра практически готова. Теперь нужно протестировать ее. Чтобы не играть самому несколько часов, надо поручить эту работу компьютеру. Достаточно лишь изменить метод updatePosition, как показано в листинге 11.49.
Листинг 11.49 Тестирование программы в автоматическом режиме
/// <summary>
/// Тестирование программы. Батон автоматически отслеживает
/// движение сыра
/// </summary>
private bool testingGame = true;
if (testingGame) {
breadRectangle.X = cheeseRectangle.X;
breadRectangle.Y = ClientSize.Height - breadRectangle.Height;
}
Булева переменная testingGame может принять значение True. В этом случае позиция батона всегда будет соответствовать позиции сыра. В этом состоянии игра будет действовать сама, без участия пользователя и без потери жизней. Можно откинуться на спинку кресла и отдыхать.
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
Добавление CSS-анимаций для улучшения взаимодействия с формой
Добавление CSS-анимаций для улучшения взаимодействия с формой Можно пойти еще дальше со свойством box-shadow: что если тень также будет анимированной – например, пульсирующей, показывая, что ожидается ввод. Давайте кратко погрузимся в мир CSS-анимаций, чтобы создать такой
Улучшения
Улучшения Теперь, когда вы выяснили, что общего между этими двумя ОС, давайте посмотрим, каковы преимущества QNX/Neutrino перед QNX4:• большее число поддерживаемых стандартов POSIX;• лучше встраивается;• ядро лучше конфигурируется для других аппаратных платформ;• поддержка
4.4. Дальнейшие шаги по совершенствованию правил безопасности
4.4. Дальнейшие шаги по совершенствованию правил безопасности Шаг 1. Производительность межсетевых экранов. Проверить, позволяет ли пропускная способность внешних межсетевых экранов обрабатывать весь объем трафика. Для увеличения пропускной способности можно
Улучшения соотношения цена-производительность в серии AS/400е
Улучшения соотношения цена-производительность в серии AS/400е Последняя тема этой главы — разработки аппаратных средств, предпринимаемые нами для дальнейшего улучшения соотношения цена — производительность (Ц — П) моделей серии AS/400е. За последние несколько лет наши
8.13.16 Улучшения в OSPF
8.13.16 Улучшения в OSPF Протокол OSPF был значительно улучшен. Например, для снижения стоимости выгодно отключать коммутируемые линии и виртуальные цепи, когда по ним не пересылается трафик. Теперь в протоколе для таких линий формируются периодические сообщения Hello, что
3.4.4.4.Улучшения?
3.4.4.4.Улучшения? Если вы читали документацию по WinInet, вы заметили что, там есть функция FindFile, так что вы можете сделать обзор удаленных файлов. И базируясь на этой информации, вы можете написать своего web робота, который может загрузить часть a web сайта (например, те файлы,
3.5. Улучшения?
3.5. Улучшения? Если вы читали документацию по WinInet, вы заметили что, там есть функция FindFile, так что вы можете сделать обзор удаленных файлов. И базируясь на этой информации, вы можете написать своего web робота, который может загрузить часть web сайта (например, те файлы, которые
R.16.3.3 Повторный просмотр и дальнейшие подстановки
R.16.3.3 Повторный просмотр и дальнейшие подстановки После того, как в строке замены произошла подстановка всех параметров макровызова, получившаяся строка просматривается повторно для обнаружения дополнительных макроопределений. Если в процессе повторных просмотров
Дальнейшие рассуждения
Дальнейшие рассуждения Прежде чем реализовать все это на языке Си, нам нужно еще решить, что будем делать с проверкой ошибок ? Должны ли мы превратить эту часть программы в функцию? Сначала мы решим, что делать, если пользователь вводит ошибочные данные, скажем
Глава VIII Некоторые приемы улучшения изображений
Глава VIII Некоторые приемы улучшения изображений • Наиболее распространенные дефекты изображения, введенного с видео • Ретушь изображения В большинстве случаев кадр, полученный даже с использованием хорошего оборудования захвата, все равно имеет некоторые искажения.
8 способов отменить «улучшения» сервисов Google Олег Нечай
8 способов отменить «улучшения» сервисов Google Олег Нечай Опубликовано 28 ноября 2013 Компания Google постоянно совершенствует свои многочисленные сервисы: Gmail образца 2013 года совершенно не похож на Gmail из 2008-го, а современные карты Google Maps имеют мало
Деанонимизация Рунету не грозит, или Какие правила использовать для улучшения вашей анонимности? Максим Букин
Деанонимизация Рунету не грозит, или Какие правила использовать для улучшения вашей анонимности? Максим Букин Опубликовано 18 февраля 2013Даже десяток принятых в РФ законов, посвящённых тому, чтобы устанавливать личность того или иного пользователя в Сети, не приведут к