Вторая по счету игра на сайте называется Skynet — The Chasm. В игре мы будем управлять мотоциклистом, который изо всех сил пытается попасть на другую сторону пропасти и остановиться на конечной платформе.
Ни о чем не подозревающий мотоциклист
Инициализация
В начале нам сообщают всевозможные данные о будущем пути: расстояние от мотоциклиста до пропасти (int R), длину пропасти (int G), длину платформы для приземления (int L).
Игровой цикл
Бесконечно (до конца игры) повторяемый игровой цикл состоит из любого количества кода, который читает входной поток и выводит команду в выходной поток.
Вход
Каждый новый ход (т.е. после каждого следующего выполненного действия в самом цикле while) нам сообщают скорость мотоциклиста (int S) и его позицию на дороге (int X).
Выход
В выходной поток необходимо вывести одну строку. Тут разработчики представляют нам 4 варианта:
- ускоряться (SPEED);
- тормозить (SLOW);
- ехать вперед без ускорения (WAIT);
- прыгать (JUMP).
Перевод строки на новую обязателен.
Тест 1
В начале нам представлен базовый код программы.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33
|
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; /** * Auto-generated code below aims at helping you parse * the standard input according to the problem statement. **/ int main() { int R; // the length of the road before the gap. cin >> R; cin.ignore(); int G; // the length of the gap. cin >> G; cin.ignore(); int L; // the length of the landing platform. cin >> L; cin.ignore(); // game loop while (1) { int S; // the motorbike's speed. cin >> S; cin.ignore(); int X; // the position on the road of the motorbike. cin >> X; cin.ignore(); // Write an action using cout. DON'T FORGET THE "<< endl" // To debug: cerr << "Debug messages..." << endl; cout << "SPEED" << endl; // A single line containing one of 4 keywords: SPEED, SLOW, JUMP, WAIT. } } |
Запуская первый тест наш несчастный мотогонщик, постоянно ускоряясь, уже в который раз падает в пропасть. Но мы, всячески пытаемся его выручить и, наконец, пишем спасательный код.
Спасательный код
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36
|
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { int R; // the length of the road before the gap. cin >> R; cin.ignore(); int G; // the length of the gap. cin >> G; cin.ignore(); int L; // the length of the landing platform. cin >> L; cin.ignore(); // game loop while (1) { int S; // the motorbike's speed. cin >> S; cin.ignore(); int X; // the position on the road of the motorbike. cin >> X; cin.ignore(); if (X < R - G ) //Checking thе position of the bike. { cout << "SPEED" << endl; } if (X == R - 1) //The bike must jump if the distance before the gap is 1 step { cout << "JUMP" << endl; } if ((X > R - G ) && ( X < R + G + L )) // Lastly, we have to accelerate { cout << "SLOW" << endl; } } } |
Мы, с чувством выполненного долга, наблюдаем как мотоциклист, с улыбкой на лице, наконец перепрыгивает первую пропасть, а затем и вторую и третью. Понимая, что мотоциклист должен прыгнуть в момент, когда пропасть будет перед ним (т.е. за 1 шаг до нее), приказываем ему ускоряться до того момента (пока расстояние до пропасти не станет равным 1 (X == R — 1)). То есть пока положение мотоциклиста Х меньше, чем расстояние до пропасти R минус длинна пропасти G (X < R — G) мотоциклист будет ускоряться. После прыжка нам нужно затормозить, то есть если положение мотоциклиста X будет уже за пропастью (X > R — G), но меньше чем конец самой дороги (X < R + G + L), он будет тормозить.
Подходя к 4 тесту сталкиваемся с новой проблемой. Длинна платформы для приземления очень мала и наш бессмертный каскадер вылетает за окончание дороги. Что же делать?
Еще более спасательный код
И тут вступает в игру переменная, которую до этого момента нам не приходилось использовать в программе, а именно, скорость мотоциклиста S.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43
|
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { int R; // the length of the road before the gap. cin >> R; cin.ignore(); int G; // the length of the gap. cin >> G; cin.ignore(); int L; // the length of the landing platform. cin >> L; cin.ignore(); // game loop while (1) { int S; // the motorbike's speed. cin >> S; cin.ignore(); int X; // the position on the road of the motorbike. cin >> X; cin.ignore(); if (X < R - G ) //Checking thе position of the bike. { if (S==G+1) //Speed should be bigger, than gap length on 1 point to slow down at small landing platform. { cout << "WAIT" << endl; } else { cout << "SPEED" << endl; } } if (X == R - 1) //The bike must jump if the distance before the gap is 1 step { cout << "JUMP" << endl; } if ((X > R - G ) && ( X < R + G + L )) // Lastly, we have to accelerate { cout << "SLOW" << endl; } } } |
После тысячи непройденых тестов начинаешь понимать, что ты что то упустил. Вот тут то и вступает в игру всеми любимый «любимый» magic number равный, в данном случае, единице. И вправду, для того, чтобы перелететь пропасть нам потребуется скорость всего лишь на 1 больше, чем длинна этой пропасти. То есть если скорость будет равна длине пропасти + 1, то мы будем ехать с этой постоянной скоростью, в противном случае будем ускоряться. С этим замечанием программа позволяет с легкостью останавливаться на конечной платформе любой длинны.
Кажется, что мы предусмотрели все варианты развития событий, но не тут то было. Разработчики устанавливают новую, увлекательную задачу. Что будет, если начальная скорость будет не равна 0, спрашивают они? И мы пускаемся в глубокие размышления.
Код дающий, в прямом смысле, крылья
Из которых тут же выходим с новой идеей. Нам всего лишь надо тормозить до тех пор, пока скорость не станет достаточной для прыжка.
На С++:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50
|
#include <iostream> #include <string> #include <vector> #include <algorithm> using namespace std; int main() { int R; // the length of the road before the gap. cin >> R; cin.ignore(); int G; // the length of the gap. cin >> G; cin.ignore(); int L; // the length of the landing platform. cin >> L; cin.ignore(); // game loop while (1) { int S; // the motorbike's speed. cin >> S; cin.ignore(); int X; // the position on the road of the motorbike. cin >> X; cin.ignore(); if (X < R - G ) //Checking thе position of the bike. { if (S > G + 1) // Slowing, until suitable speed. { cout << "SLOW" << endl; } else { if (S==G+1) //Speed should be bigger, than gap length on 1 point to slow down at small landing platform. { cout << "WAIT" << endl; } else { cout << "SPEED" << endl; } } } if (X == R - 1) //The bike must jump if the distance before the gap is 1 step { cout << "JUMP" << endl; } if ((X > R - G ) && ( X < R + G + L )) // Lastly, we have to accelerate { cout << "SLOW" << endl; } } } |
На Java:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
|
import java.util.*; import java.io.*; import java.math.*; class Player { public static void main(String args[]) { Scanner in = new Scanner(System.in); int road = in.nextInt(); // the length of the road before the gap. int gap = in.nextInt(); // the length of the gap. int platform = in.nextInt(); // the length of the landing platform. // game loop while (true) { int speed = in.nextInt(); // the motorbike's speed. int coordX = in.nextInt(); // the position on the road of the motorbike. if (coordX < road - gap ) //Checking thе position of the bike. { if (speed > gap + 1) // Slowing, until suitable speed. { System.out.println("SLOW"); } else { if (speed == gap + 1) //Speed should be bigger, than gap length on 1 point to slow down at small landing platform. { System.out.println("WAIT"); } else { System.out.println( "SPEED"); } } } if (coordX == road - 1) //The bike must jump if the distance before the gap is 1 step { System.out.println("JUMP"); } if ((coordX > road - gap ) && ( coordX < road + gap + platform )) // Lastly, we have to accelerate { System.out.println("SLOW"); } } } } |
В конце-концов мы получаем рабочий «крылатый» вариант программы. Все довольны, в том числе и мотоциклист, которому больше не придется падать в пропасть и выбираться из нее.
Related Images:
Понравилось это:
Нравится Загрузка...
Похожее
Отлично получилось, молодец!
Только нужно метки написать и игровой цикл тут несколько другой. Сначала идёт инициализация, где читаются данные о дороге (расстояния до пропасти, пропасть, за пропастью). А потом, уже в игровом цикле — скорость и координату.
Спасибо, как раз занимался редактированием, все исправил.
«Инициализация» должна быть описана до раздела «Игровой цикл». Сейчас она описана как часть игрового цикла.
Посмотрите на свой код. Там это уже написано. Сначала читаем что-то, а потом цикл.
Понял, переделал.
Отлично
А почему снова поставили на проверку?
Была добавлена Java-версия программы в спойлере с названием «Код дающий, в прямом смысле, крылья»