Это задачка из книги «Как программировать на С++» Дейтелов. Подходит для тех, кто начинает учиться программированию и осваивает циклы и массивы.
В этой задаче воссоздается один из великих моментов в истории – классическая гонка черепахи и зайца. При разработке модели используется генерация случайных чисел.
Соперники начинают гонку в первой клетке из 70. Каждая клетка представляет собой позицию вдоль трассы гонки. Первый из соперников, достигший или миновавший клетку 70, вознаграждается ведром морковки и салата. Трасса идет по склону скользкой горы, так что соперникам случается падать на землю.
Имеются часы, отбивающие такт раз в секунду. С каждым тактом программа должна устанавливать позицию участников согласно следующим правилам:
Для отслеживания позиций животных нужно использовать переменные. Стартуют участники с позиции 1 (как уже было сказано). Если животное скользит влево и должно оказаться перед позицией 1, то движение начинается снова с первой позиции.
Позиции животных обозначаются символами (на консоли) или картинками (если используется графическая среда).
Если позиции совпадают, то черепаха кусает зайца, это надо обозначить.
Позицию рассчитываем с помощью счетчика случайных чисел, выбираем число из диапазона 1-10 (0-9), затем определяем перемещение и прибавляем его к текущей позиции.
Дальше мой вариант решения этой задачи. Вообще-то она из раздела «Указатели и строки», но ни того, ни другого я не использую. Делаю в консоли, можно переделать в любой другой среде разработки.
Часов, то есть таймера, тоже не использую, вместо него бесконечный цикл. Но можно и таймер, и при достижении финиша этот таймер нужно останавливать.
Для хранения позиций животных применяем массив, в котором хранятся переменные – 0 (пустая позиция, пробел), 1 (общая для черепахи и зайца, если они столкнулись, символ «Х»), 2 (черепаха, символ «Т»), 3 (заяц, символ «Н»), 4 (после столкновения выводим до конца строки «!»).
В отдельном массиве храним варианты символов для каждой позиции. Можно бы было сделать изначально массив символов из 70 элементов, можете сами пробовать.
Для хранения вариантов перемещения также используем массивы, для каждого животного свой.
На каждой итерации цикла определяем новые позиции, смотрим, не победил ли кто. Если победил, то выводим сообщение и выходим из цикла.
Если гонка продолжается, то выводим строку позиций, обнуляем массив позиций и переходим к следующему этапу.
Я тут немного модифицировал задачку, другие надписи, отсчет с 0, а не с 1. Но это не так важно.
Текст программы:
Столкновение:
Победила черепаха:
Победил заяц:
В этой задаче воссоздается один из великих моментов в истории – классическая гонка черепахи и зайца. При разработке модели используется генерация случайных чисел.
Соперники начинают гонку в первой клетке из 70. Каждая клетка представляет собой позицию вдоль трассы гонки. Первый из соперников, достигший или миновавший клетку 70, вознаграждается ведром морковки и салата. Трасса идет по склону скользкой горы, так что соперникам случается падать на землю.
Имеются часы, отбивающие такт раз в секунду. С каждым тактом программа должна устанавливать позицию участников согласно следующим правилам:
Для отслеживания позиций животных нужно использовать переменные. Стартуют участники с позиции 1 (как уже было сказано). Если животное скользит влево и должно оказаться перед позицией 1, то движение начинается снова с первой позиции.
Позиции животных обозначаются символами (на консоли) или картинками (если используется графическая среда).
Если позиции совпадают, то черепаха кусает зайца, это надо обозначить.
Позицию рассчитываем с помощью счетчика случайных чисел, выбираем число из диапазона 1-10 (0-9), затем определяем перемещение и прибавляем его к текущей позиции.
Дальше мой вариант решения этой задачи. Вообще-то она из раздела «Указатели и строки», но ни того, ни другого я не использую. Делаю в консоли, можно переделать в любой другой среде разработки.
Часов, то есть таймера, тоже не использую, вместо него бесконечный цикл. Но можно и таймер, и при достижении финиша этот таймер нужно останавливать.
Для хранения позиций животных применяем массив, в котором хранятся переменные – 0 (пустая позиция, пробел), 1 (общая для черепахи и зайца, если они столкнулись, символ «Х»), 2 (черепаха, символ «Т»), 3 (заяц, символ «Н»), 4 (после столкновения выводим до конца строки «!»).
В отдельном массиве храним варианты символов для каждой позиции. Можно бы было сделать изначально массив символов из 70 элементов, можете сами пробовать.
Для хранения вариантов перемещения также используем массивы, для каждого животного свой.
На каждой итерации цикла определяем новые позиции, смотрим, не победил ли кто. Если победил, то выводим сообщение и выходим из цикла.
Если гонка продолжается, то выводим строку позиций, обнуляем массив позиций и переходим к следующему этапу.
Я тут немного модифицировал задачку, другие надписи, отсчет с 0, а не с 1. Но это не так важно.
Текст программы:
//crossing.cpp - гонка черепахи зайцаРезультаты:
#include <iostream>
#include <ctime>
using namespace std;
int main()
{
cout<<"The Gong! And they went!\n";
//текущие координаты черепахи и зайцв
int coordTurtle = 0, coordHare = 0;
int i;
//длина дистанции - массива позиций
const int lenTrack = 70;
//размер массива вариантов перемещений
const int moving = 10;
//массив позиций
int track[lenTrack] = {0};
//варианты перемещений черепахи
int movingTurtle[moving] = {3, 3, 3, 3, 3, -6, -6, 1, 1, 1};
//варианты перемещений зайца
int movingHare[moving] = {0, 0, 9, 9, -12, 1, 1, 1, -2, -2};
//массив символов для вывода позиций зайца, черепехи и столкновений
char messages[5] = {' ', 'X', 'T', 'H', '!'};
//инициализация счетчика случайных чисел
srand(time(NULL));
//цикл бесконечный, выход через break
while(1)
{
//координата черепахи
coordTurtle += movingTurtle[rand()%10];
//если меньше 0, то координата равна нулю
if (coordTurtle < 0) coordTurtle = 0;
//координата зайца
coordHare += movingHare[rand()%10];
//если меньше 0, то координата равна 0
if (coordHare < 0) coordHare = 0;
//ничья, если оба пересекли финишную линию одновременно, выход из цикла
if((coordTurtle>=lenTrack-1) &&(coordHare>=lenTrack-1))
{
cout<<"Won the friendship!\n";
break;
}
//победа черепахи, выход из цикла
if(coordTurtle>=lenTrack-1)
{
cout<<"Won the Turtle!\n";
break;
}
//победа зайца, выход из цикла
if(coordHare>=lenTrack-1)
{
cout<<"Won the Hare!\n";
break;
}
//заполняем массив позиций
//координаты участников равны - столкновение
if(coordTurtle==coordHare)
{
track[coordTurtle] = 1;
for(i = coordTurtle + 1; i<lenTrack; i++)
track[i] = 4;
}
else
{
track[coordTurtle]=2;
track[coordHare]=3;
}
//выводим строку с позициями участников
for (i = 0; i < lenTrack; i++)
cout<<messages[track[i]];
//следующий этап гонки
cout<<"\nThe next stage!\n";
//обнуляем массив позиций
for (i = 0; i < lenTrack; i++)
track[i] = 0;
cin.get();
}
cout<<"The race is over!\n";
cin.get();
return 0;
}
Столкновение:
Победила черепаха:
Победил заяц:
