(Python)
Этап 1
На первом этапе вам достаточно написать главный игровой цикл, за который производятся только ходы игрока. Каждый ход игрока выполняется по следующим правилам:
Герой пытается попасть по дракону. Вероятность успеха - 75%
Если герой попал:
Урон = сила героя + оружие героя - защита дракона
У дракона отнимается здоровье, равное урону
Отображается сообщение о нанесённом уроне.
Если герой не попал:
Отображается сообщение о том, что герой не попал
В конце хода вывести сообщение об оставшемся здоровье дракона.
Вероятность можно определять с а, например:
if random.radnom() < 0.6: ... # 60%
if random.random() < 0.3: ... # 30%
и т.д.
Главный цикл должен повторять ходы героя до тех пор, пока у дракона не останется 0 хп.
Если у дракона больше нет жизненной энергии:
Показать сообщение, что герой победил
Выйти из цикла.
Указания:
Для вывода информации о драконе напишите отдельную функцию display_dragon_info(). На первом этапе достаточно выводить его здоровье.
Напишите функцию modify_health, которая принимает два аргумента:
Персонажа, у которого нужно изменить показатель здоровья
Количество жизненной энергии, на которое нужно изменить этот показатель. Внутри себя функция всегда прибавляет этот показатель. Таким образом, если нужно уменьшить показатель здоровья, то в функцию нужно передать отрицательное число.
Функция должна следить, чтобы показатель здоровья не стал меньше 0, даже если нанесённый урон больше оставшегося здоровья.
Функция отвечает только за изменение показателей здоровья персонажей и не должна выводить никаких сообщений.
В сообщениях о нанесённом уроне урон должен выводиться без знака минус.
Пример работы функции:
modify_health(dragon, -50) # нанести 50 ед урона дракону
При выводе сообщения:
"Дракон получил 50 ед. урона" # без знака минус
const
nDay:array[1..12] of integer=(31,28,31,30,31,30,31,31,30,31,30,31);
type
Date=record
Day,Month,Year:integer
end;
function DOW(Dat:Date):integer;
// день недели по дате. 0-Вс. 1-Пн, 7-Сб
var
a,y,m:integer;
begin
With Dat do begin
a:=(14 - month) div 12;
y:=Year-a;
m:=month+12*a-2;
DOW:=(7000+(day+y+y div 4-y div 100+y div 400+(31*m) div 12)) mod 7
end
end;
procedure DMY2Date(d,m,y:integer; var data:Date);
// Преобразует к дате заданные день, месяц и год
begin
data.Day:=d; data.Month:=m; data.Year:=y
end;
procedure LastDays(month,year:integer; var Wd,Fr:Date);
// даты последней среды (Wd) и пятницы (Fr) для месяца в году }
var
LastDay:Date;
n:integer;
begin
n:=nDay[month];
if (month=2) and (year mod 4 = 0) then Inc(n);
DMY2Date(n,month,year,LastDay);
n:=DOW(LastDay); // номер последнего дня недели
Wd.Month:=month; Wd.Year:=year;
if n<3 then Wd.Day:=LastDay.Day-(n+4)
else
if n=3 then Wd.Day:=LastDay.Day
else Wd.Day:=LastDay.Day+3-n;
Fr.Month:=month; Fr.Year:=year;
if n<5 then Fr.Day:=LastDay.Day-(n+2)
else
if n=3 then Fr.Day:=LastDay.Day
else Fr.Day:=LastDay.Day-1
end;
var
Wd,Fr:Date;
ff,mf:Text;
m:integer;
begin
Assign(ff,'father.txt'); Rewrite(ff);
Assign(mf,'mother.txt'); Rewrite(mf);
// Сентябрь-декабрь 2015 года
for m:=9 to 12 do begin
LastDays(m,2015,Wd,Fr);
if Odd(Wd.Day) then Writeln(mf,Wd.Day,'.',m,'.2015 - 1 класс')
else Writeln(ff,Wd.Day,'.',m,'.2015 - 1 класс');
if Odd(Fr.Day) then Writeln(mf,Fr.Day,'.',m,'.2015 - 5 класс')
else Writeln(ff,Fr.Day,'.',m,'.2015 - 5 класс')
end;
// Январь - май 2016 года
for m:=1 to 5 do begin
LastDays(m,2016,Wd,Fr);
if Odd(Wd.Day) then Writeln(mf,Wd.Day,'.',m,'.2016 - 1 класс')
else Writeln(ff,Wd.Day,'.',m,'.2016 - 1 класс');
if Odd(Fr.Day) then Writeln(mf,Fr.Day,'.',m,'.2016 - 5 класс')
else Writeln(ff,Fr.Day,'.',m,'.2016 - 5 класс')
end;
Close(ff); Close(mf)
end.
Содержимое выходных файлов:
father.txt
30.9.2015 - 1 класс
28.10.2015 - 1 класс
30.10.2015 - 5 класс
30.12.2015 - 1 класс
24.2.2016 - 1 класс
26.2.2016 - 5 класс
30.3.2016 - 1 класс
mother.txt
25.9.2015 - 5 класс
25.11.2015 - 1 класс
27.11.2015 - 5 класс
25.12.2015 - 5 класс
27.1.2016 - 1 класс
29.1.2016 - 5 класс
25.3.2016 - 5 класс
27.4.2016 - 1 класс
29.4.2016 - 5 класс
25.5.2016 - 1 класс
27.5.2016 - 5 класс
Завершающий урок цикла "Первые шаги" посвятим изучению гироскопического датчика. Данный датчик, как и ультразвуковой, присутствует только в образовательной версии набора Lego mindstorms EV3. Тем не менее, пользователям домашней версии конструктора советуем тоже обратить внимание на данный урок. Возможно, что прочитав о назначении и использовании этого датчика, вы пожелаете его приобрести в дополнение к своему набору.
10.1. Изучаем гироскопический датчик
Гироскопический датчик (Рис. 1) предназначен для измерения угла вращения робота или скорости вращения. Сверху на корпусе датчика нанесены две стрелки, обозначающие плоскость, в которой работает датчик. Поэтому важно правильно установить датчик на робота. Также для более точного измерения крепление гироскопического датчика должно исключать его подвижность относительно корпуса робота. Даже во время прямолинейного движения робота гироскопический датчик может накапливать погрешность измерения угла и скорости вращения, поэтому непосредственно перед измерением следует осуществить сброс в 0 текущего показания датчика. Вращение робота против часовой стрелки формирует отрицательные значения измерений, а вращение по часовой стрелке - положительные.
Гироскопический датчик
Рис. 1
Рассмотрим программный блок "Гироскопический датчик" (Рис. 2) Желтой палитры. Этот программный блок имеет три режима работы: "Измерение", "Сравнение" и "Сброс". В режиме "Измерение" можно измерить "Угол", "Скорость" или одновременно "Угол и скорость".
Программный блок "Гироскопический датчик"
Рис. 2
Давайте закрепим гироскопический датчик на нашем роботе (Рис. 3), подсоединим его кабелем к порту 4 модуля EV3 и рассмотрим примеры использования.