Головна сторінка Випадкова сторінка КАТЕГОРІЇ: АвтомобіліБіологіяБудівництвоВідпочинок і туризмГеографіяДім і садЕкологіяЕкономікаЕлектронікаІноземні мовиІнформатикаІншеІсторіяКультураЛітератураМатематикаМедицинаМеталлургіяМеханікаОсвітаОхорона праціПедагогікаПолітикаПравоПсихологіяРелігіяСоціологіяСпортФізикаФілософіяФінансиХімія |
Тема 3. Система контролю та оцінювання знань, умінь і навичок студентівДата добавления: 2015-09-15; просмотров: 668
После запуска программы , переменнаой gameState (Массив размерностью 9) блока Turnприсваивается значение 13 (см. ниже) Кнопка №9 окрашивается в красный цвет (ход игрока 1) Программа переходит в состояние ожидания нажатия любой кнопки игрового поля После нажатия любой кнопки происходит событие EXT_PRESS После того как игрок (человек ) сделал ход , управление передаётся функции choose_move() 1. Функцияchoose_move() Выходная переменная - move имеет тип int8 (8-ми разрядное целое) , передающее своё значение в одноимённую входную переменную move функции make_move_if_available() С помощью этой функции (choose_move() ) программа выбирает свой дальнейший ход ,в функциюmake_move_if_available() передаётся значение переменной move make_move_if_available(move) Рассмотри подробнее эту ключевую функцию Функция choose_move() состоит из 3 ступеней 1 Итерация - "Попытка выиграть этим ходом" С помощью формулы : { move = 12 - gameState[1] - gameState[3] } пытается определить выигрышный ход для себя, для этого находит недостающее до 12 число в диапазоне [0-8] и если оно не занято (пустая клетка)- это означает что игрок (компьютер) *12 - это контрольная сумма ( т.е сумма значений нажатых кнопок необходимых для победы ) **Так как ход ещё не выполнен , а только готовится и смещение ходов ещё не произошло, используются не gameState[0] , gameState[2] (обозначающие состояния ходов текущего игрока ) а gameState[1] , gameState[3] свои ходы , сделанные ранее) Рассмотрим соответствующую ситуацию на примере. Допустим у компьютера сложилась следующая ситуация , до победы ему не хватает заполнить одну клетку - левую нижнюю Вот состояние его ходов : gameState[1]=5; gameState[3]=4 (до смещения) По формуле { move = 12 - gameState[1] - gameState[3] } определяется выигрышный ход move Move = 12 - 5 - 4 = 3 , он равен 3 Далее отправляется на проверку в функцию Make_move_if_available(3) , в данном примере функция вернула значение "истина". Компьютер совершает победный ход. Иначе если данный ход сделать было не возможно - скажем, эта клетка была уже заполнена противником Переходим к ступени 2 2 Итерация - "Не дать сопернику победить" Тут всё наоборот если нет возможности победить , с этого хода - компьютер пытается не дать победить игроку - для этого он вычисляет не хватающее число до контрольной суммы (12) С помощью формулы { move = 12 - gameState[0] - gameState[2] } ищет недостающее число в диапозоне [0-8] если оно свободно то делает ход Рассмотрим пример: Предположим у игрока следующая ситуация : gameState[0]=4 ; gameState[2]=1, для победы ему необходимо заполнить левый верхний квадрат (эта кнопка со значением = 7 , именно этого и недостаёт до 12-ти) Что делает компьютер чтобы предотвратить это : он сам вычисляет с помощью простенькой формулы это значение и заполняет его : move = 12 - gameState[0] - gameState[2], находит чему равен move move = 12 - 4 - 1 =7, это значение и передаётся в функцию make_move_if_available(7) , а затем уже эта функция решает возможен этот ход или нет , в данном примере это возможно сделать. Если эта клетка занята , или противник не находится в ситуации когда для победы ему нужно заполнить всего одну клетку то переходим к ступени 3 3 Итерация - если дошло до этой ступени, значит ход не критический ( нет опасности выиграть или проиграть ) Тут происходит генерирование линейной псевдо-случайной последовательности ( хода ) [0-8], 2. Функция make_move_if_available()
В этой функции происходит проверка условия по Входной переменной Move передаваемая из функцииchoose_move() и опрос состояния кнопки button_#.enabled если условие выполняется хотя бы в одном из узлов - происходит : 1) Вызов функции shift_game_state(move) Затем выполняется выход из функции и функция возвращает 1 (присваивается переменной Yes) иначе функция возвращает 0 3. Функция shift_game_state() Далее управление передаётся функции shift_game_state(move) Эта функция модифицирует традиционную игру "крестики-нолики". Смысл заключается в том что каждый игрок может оперировать только 3-я крестиками или ноликами . Если каждый из игроков уже заполнил по 3 клетки то происходи смещение , то есть ход gameState[5] приобретает новое значение равное gameState[4] , а новый ход (gameState[0]) приобретает значение вновь нажатой кнопки : { Элементы массива [6-8] в процессе игры не участвуют , полученное ими значение (13) при запуске , в ходе игры не изменяется , видимо, разработчики сделали массив gameState размерностью 9 чтобы можно было легко перейти к классической игре "Крестики-нолики" Блоки Button_0 - Button_8 - имеют одинаковую структуру. Константа thisButton имеет значение, соответствующее номеру кнопки. Каждая кнопка имеет 3 состояния : 1) Enabled - Доступна При запуске программы все из 9-ти кнопок переходят в состояние Enabled , цвет кнопок чёрный При нажатии на кнопку button_# проверяется чей ход - Red или Green и исходя из этого окрашивает клетку в соответствующий цвет. Если после нажатия игра заканчивается, все кнопки переходят в состояниеDisabled и цвет проигравшей стороны темнеет (GREEN=>DIM_GREEN… - константы) Если кнопка находилась в состоянии Active и at(7,TURN) (тоесть 6 кнопок уже находятся в состоянии Active) то эта кнопка переходит в состояние Enabled и окрашивается в чёрный цвет. Функция is_a_winner(). В случае если игра окончена переменой Yes (тип Boolean) присваивается значение 1 иначе 0. Функция вызывается после каждого хода игроков и если Yes = 1 вызывается событием Game_Over , игра заканчивается - все кнопки игрового поля переходят в состояние DISABLED GameState - это глобальная переменная (Числовой массив - размерностью 9) в пределах всего блока Turn Он являет собой состояние игры. Функция предназначена для проверки заполнены ли 3 последовательных диагональных , вертикальных или горизонтальных клетки. **Заметим то что только одна функция служит для проверки выигрыша и игрока 1 и игрока 2 - для функции совершенно не важно чей сейчас ход ей достаточно знать состояния текущего хода , тесть значения следующих индексов массива gameState : [0] [2] [4] Как так ? Это становится возможным благодаря смещению ходов описанный выше , проще говоря gameState[0],[2],[4] это состояние ходов текущего игрока , который в данный момент выполнил ход и ожидает результата , а gameState[1],[3],[5] это ходы предыдущего игрока Кнопки расположены в следующем порядке , как показано на рисунке - каждая кнопка имеет свою константу ThisButton равная её номеру , сразу бросается в глаза , почему клавиши расположены в таком ,казалось бы не правильном порядке , ответ очевиден - если подсчитать сумму любой последовательность 3 клеток (выигрышную последовательность) она равна 12 - именно это и является необходимым условием победы yes =((gameState[0] + gameState[2] + gameState[4]) == 12); Что бы экспериментально доказать это я провёл серию экспериментов , для этого я ввёл дополнительную глобальную переменную (Массив размерностью 9) передающую значения локальной переменной gameState в Simulink модель , и отобразил её с помощью блока Display , который отображал состояния всех индексов массива Действительно , сумма GameState[0]+GameState[2]+GameState[4]=3+8+1=12 GameState[1]+GameState[3]+GameState[5]=4+5+6=15 Как говорилось выше при старте симуляции переменной gameState(кажному индексу) было присвоено значение 13 (оно могло быть и любой другой , главное больше 12) My working day in the Engine-Room. I am a motorman. Я моторист. My working day on the ship is long and hard. Мой рабочий день долгий и тяжелый. I get up at 07.00 in the morning. Я просыпаюсь в 7 утра. 1 go to the crew's mess room to have breakfast Я иду в кают-компанию завтракать. After breakfast I work in the Engine-Room. После завтрака я работаю в МО. If necessary I lubricate the deck equipment with lub oil. Если необходимо я смазываю палубные механизмы. But my main job is to assist with maintenance of all machinery. Но моя основная работа – помогать в поддержании (обслуживании) всех механизмов. I am responsible to the Second Engineer for general cleaning in the engine-room. Я подчиняюсь Второму механику и несу ответственность за общую чистоту в МО. Mу duties as a mоtorman are following: Мои обязанности как моториста следующие: I must: Я должен: 1) repair leaks in the piping - устранять утечки в трубопроводах. 2) do corrective actions -быстро выполнить действия по устранению неисправностей. 3) repair the trouble - устранять неисправность. 4) take oil meters reading - снимать показания счётчика, 5) check bearings for overheating - проверить подшипники на перегрев. 6) check operating temperature and pressure - проверить рабочую температуру и давление. 7) check running machinery for abnormal noise - проверить рабочие механизмы на наличие постороннего шума, 8) check bearings for proper lubrication - проверить подшипники на правильность смазки. 9) take over a watch - принимать вахту. 10) obtain relevant information from the off going engineer - получать правильную информацию от сменяющегося механика, 11) notify the Chief Engineer of any trouble in the engine room - ставить старшего механика в известность обо всех неполадках в МО. 12) renew the defective parts -заменить неисправные части. 13) maintain cleanliness in the E.R. - поддерживать чистоту в машинном отделении. 14) comply with the orders of the watch-engineer -действовать в соответствии с распоряжениями вахтенного механика. What tools did you work with? С какими инструментами вы работали? I worked with following tools: Я работал со следующими инструментами:
At 11.30 I clean my working place and put all my tools in order and go to have dinner (lunch). After dinner (lunch) I keep watch in the Engine-Room. After watch I go to rest in my cabin. I go to bed at 10 o'clock.
Полезные глаголы:
|