Программирование ходов компьютера

Гораздо более интересен вариант игры с компьютером, для которого выполняются следующие правила.

1. Кто будет делать первый ход определяется случайным образом (первый игрок ходит крестиками).

2. Алгоритм игры компьютера должен автоматически выбирать оптимальный для текущей ситуации ход.

Оценка и выбор хода осуществляется исходя из следующих соображений:

¨ Наивысшим приоритетом обладает ход, который может победно завершить игру. Она возникает, если в соответствующем рядке компьютером уже закрыты две клетки и есть свободная.

¨ Если нет хода, который приведет к немедленной победе, то нельзя допустить победу противника на следующем ходе. Второй по приоритету должна быть комбинация двух знаков противника и свободной клетки в одном рядке.

¨ Третье место должна занимать позиция, когда в рядке имеется один знак компьютера и две свободные клетки. Если противник не заметит, то через один ход получим ситуацию с наивысшим приоритетом.

¨ Четвертую позицию в приоритете необходимо отдать комбинации знак противника плюс две свободные клетки.

¨  Пятое место в иерархии ценности позиций необходимо отдать строке из пустых клеток.

¨ Последняя по ценности позиция соответствует сочетанию знака противника, знака компьютера и пустой клетки.

Когда наступает очередь хода компьютера, он должен проверить ценность позиции каждой пустой клетки. Для каждой клетки надо проверить от двух до четырех рядов. Итогом "мыслительной" деятельности компьютера является обнаружение клетки с наивысшим приоритетом.

Содержимое клетки, стоящей в строке row и столбце col определяется номером кадра клипа eval("c"+row+col+"_mc"). Если в клетке стоит символ компьютера, то ее можно оценить 100, если символ пользователя — 10, а пустую можно оценить единицей.

curClip=eval("с"+i+j+"_mc")

switch (curClip._currentframe){  

case comp_hod: cell=100; break;

case user_hod: cell=10; break;

default: cell=1; break; 

}

 Просматривая ряды и собирая сумму оценок клеток, компьютер всегда сможет оценить ситуацию. Если получится сумма 201, то это означает, что в ряду уже есть два символа компьютера и одна пустая клетка (ситуация с наивысшим приоритетом!).

Если сумма 111 — один символ компьютера, один символ пользователя и одна пустая клетка. Если 21 — два символа пользователя и одна пустая. Приоритет ряда с суммой 21 должен быть выше приоритета ряда с суммой 111. Поэтому надо определить по вычисленным суммам рейтинги рядов, например следующим образом

switch (sum){

case 201: return 1000;

//2 символа компьютера и пустая клетка

case 21: return 100;

//2 символа пользователя и пустая клетка

case 102: case 12: return 20;

//один символ компьютера и две пустые клетки

                                                

 //один символ пользователя и две пустые клетки

case 3: return 7; // пустой ряд

case 111: return 3;

// по одному символу компьютер, пользователь, пусто

case 30: return "user_victory"; 

// три символа пользователя ― он выиграл

}

Для клетки cij надо вычислить сумму по строке i и столбцу j. Если i = j, то клетка находится на главной диагонали и понадобится анализ суммы d1.

d1=c00+c11+c22

 Если i +j = 2, клетка находится на вспомогательной диагонали и надо добавить сумму d2.

d2=c02+c11+c20

Таким образом, для выбора хода компьютера надо:

1) Определить состояние рабочего поля — вычислить суммы по всем рядкам: строкам, столбцам и диагоналям. Написать функцию обсчета поля..

2) Написать функцию, которая для клетки вычисляет ее рейтинг, состоящий из суммы всех рядов, в которые она входит. При этом до сложения, надо повысить приоритет выигрышных состояний и понизить его для мало перспективных.

function ocenka(ves:Number) {

switch (ves) {

case 201: return 1000;

case 21: return 100;

case 102: return 50;

case 12: return 20;

case 3: return 7;

case 111: return 3;

case 30: return "user_victory";

 }

}

1) Проверить, может пользователь уже выиграл? Для этого оценить суммарный рейтинг клетки последнего хода пользователя.

2) Для каждой свободной клетки определить ее рейтинг и выбрать для хода клетку с наибольшим рейтингом. Если рейтинг окажется >=1000, то компьютер нашел победный ход!

Задание 8

Запрограммировать ходы компьютера.

Создать комментарии результата игры (”Вы выиграли”, “Вы проиграли”, “Ничья”.

Запретить делать ходы после определения результата игры.

Сделать задержку хода компьютера для имитации "обдумывания". Как запретить пользователю делать ход до окончания "обдумывания" хода компьютером?

Сделать кнопку для начала новой игры.

Контрольные вопросы к лабораторной работе №5

1. Генерация случайных чисел в заданном диапазоне.

2. Методы округления до целого числа.

3. Определение размеров рабочей области.

4. Функция eval().

5. Определение номера проигрываемого кадра.

6. Определение положения выбранной клетки

7. Программирование хода пользователя в игре.

8. Программирование хода компьютера в игре.

9. Разыгрывание первого хода.

10. Объяснить код задания.

Лабораторная работа №6

Тема:  Программное создание анимации. Событие onEnterFrame. Функция setInterval()

Отчет: Файлы с выполненными заданиями.

Событие EnterFrame

Вообще говоря, не существует события EnterFrame, но вызов метода с именем onEnterFrame отправляется всем клипам, его имеющим, при загрузке нового кадра. Точнее, вызову соответствует момент времени, когда смена кадров должна произойти. Поэтому метод — обработчик работает, даже если в фильме имеется только один кадр.

Частота вызовов функции-обработчика onEnterFrame определяется установленной в фильме частотой смены кадров. Если код в теле обработчика не успеет выполниться за отведенный промежуток времени, то новое событие onEnterFrame не произойдет до тех пор, пока он не будет завершен. Вызовы события onEnterFrame также не будут осуществляться, пока не выполнится та часть кода, которая должна быть проделана непосредственно при загрузке кадра.


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: