Дедукция

Дедукция

Исходный файл: Deduction.fla

Следующая игра полностью основана на логике. Один из наиболее популярных ее вариантов (для двух игроков) известен под названием "Mastermind" [17] .

Цель игры – угадать произвольную последовательность из пяти цветов. Игрок начинает с предположений. Затем компьютер отвечает, отгадано ли хоть что-то, то есть игрок получает информацию о количестве правильно расположенных цветов и количестве правильных цветов, оказавшихся не на своих местах. На основе этой информации игрок пробует угадать еще раз. Так продолжается определенное число попыток или до тех пор, пока игрок не угадает последовательность.

На рис. 14.3 показан фрагмент этой игры (см. ролик Deduction.fla, размещенный на Web-сайте). Область игры – выпиленное полено, а цвета представлены в виде камешков. Игрок может выбрать любой из пяти цветных камешков, чтобы заполнить пустое пространство, или не выбрать вообще. Компьютер отвечает следующим образом: отображает белый камешек для каждого правильного цвета, и черный камешек для каждого правильного цвета, помещенного не на свое место.

Рисунок 14.3. Игра на дедукцию позволяет построить последовательность из камешков, затем выводит результаты с помощью белых и черных камешков

Задача проекта

Цель ролика – создать простую игру под названием «Дедукция». Игроку предоставляется 10 шансов, чтобы угадать последовательность. После каждого варианта игроку выдается результат угадывания.

Подход

Игра начинается с создания произвольной последовательности из пяти цветов, которая хранится компьютером в тайне до конца игры.

При каждой попытке игроку предоставляется пять новых пустых мест, которые нужно заполнить. В дополнение к ним справа появляется кнопка Done (Готово). На рис. 14.4 показано, что видит игрок в начале игры.

Рисунок 14.4. Игра начинается с того, что отображаются пять свободных пустых мест и кнопка Done

Игрок может щелкнуть по любому пустому месту, чтобы изменить его цвет. Цвет изменяется в соответствии с шестью вариантами: пятью различными цветами и пустым местом.

После того как игрок указал цвета для пяти мест, он может щелкнуть по кнопке Done, чтобы получить результат. Появление белого камешка свидетельствует о правильно расположенном цвете, черного – о правильном цвете, помещенном не на свое место.

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

Рисунок 14.5. Так выглядит игровое поле после нескольких попыток пользователя

Подготовка ролика

В клипе «rock» содержится восемь кадров, первый из которых показывает пустое место. Кадры со второго по шестой отображают пять цветов, из которых должен выбрать пользователь. Седьмой и восьмой кадры отображают белые и черные камешки, имеющие метки «white» и «black» соответственно, чтобы код мог обращаться к ним.

Теперь осталось поместить на рабочее поле фон и указания. Камешки и кнопка Done создаются кодом. Для клипа "rock" установите имя ("rock") в панели Linkage Properties. Я также создал небольшую кнопку, чтобы можно было перейти внутрь клипа камешка. Кнопку "Done" создать очень просто, но так как нам нужно управлять ее положением, мы должны поместить ее внутри клипа и указать для него свойство "linkage".

Создание кода

Код игры целиком расположен в первом кадре основной временной шкалы, начинается он с установки целого набора переменных. Эти числа определяют положение различных элементов на рабочем поле при их создании. Вместо того чтобы распределять эти переменные по всему коду, я собрал их в начале программы – так их будет проще найти и изменить.

Последовательность решения задается с помощью пяти случайных чисел и хранится в массиве solution. В переменной row хранится номер попытки. Для начала игры вызывается функция createRow.

initGame();

stop();

function initGame() {

// Определяется расположение и расстояние между элементами.

topRowLoc = 60;

leftColLoc = 280;

roghtColLoc = 390;

horizSpace = 21;

vertSpace = 23;

solutionx = 336;

solutiony = 320;

// Создается произвольная последовательность решения.

solution = new Array();

for(i=0;i<5;i++) {

solution.push(int(Math.Random()*5));

}

// Инициализируются переменные.

rows = new Array();

row = 0;

// Устанавливается первый ряд.

createRow();

}

В начале каждой попытки функция createRow создает пять пустых мест и определяет их положение. Вдобавок устанавливается новый клип done, который располагается справа (рис. 14.4).

function createRow() {

// Создается новый ряд из пяти пустых мест.

for(i-0;i<5;i++) {

attachMovie("rock","rock"+row+"-"+i,row*10+i);

clip = _root["rock"+row+"-"+i];

clip._x = leftColLoc + i*horizSpace;

clip._y = topRowLoc + row*vertSpace;

clip.active = true;

}

// Создается кнопка Done.

attachMovie("done","done",1000);

_root.done._x = rightColLoc+20;

_root.done._y = topRowLoc + row*vertSpace;

}

Когда игрок щелкает по кнопке Done, вызывается функция doneGuess. Сначала пять кнопок в текущем ряду становятся неактивными. В функции createRow свойству active каждого клипа было присвоено значение true. Теперь же этому свойству присваивается значение false (1) . Код, прикрепленный к каждой кнопке, с помощью этого свойства определяет, можно ли щелкнуть по кнопке или нет.

В массиве temp содержатся номера каждого цвета последовательности (2). Например, если даны два первых цвета, один четвертый и два пятых, массив будет выглядеть следующим образом: [2,0,0,1,2].

Следующий цикл проверяет, сколько цветов точно совпадают с предопределенным расположением (3) . Если были найдены совпадения, числа в массиве temp уменьшаются. То есть теперь в этом массиве отображаются те цвета, совпадения с которыми еще надо найти.

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

Следующие два цикла создают белые и черные камешки, которые будут соответствовать числу правильно угаданных цветов и числу угаданных цветов, расположенных не на своем месте (5) .

Кнопка Done удаляется, так что теперь она не будет появляться в каждой строке (6) . Когда пользователю дается следующая попытка, создается новая кнопка Done.

В конце функции проверяется, совпадают ли все пять цветов или нет (7) . Если да, то ролик переходит к кадру «win». В противном случае код проверяет, была ли эта попытка десятой (последней), и если так, ролик перейдет к кадру «lose», иначе для следующей попытки вызывается функция createRow.

function doneGuess() {

numRightSpot = 0;

numRightColor = 0;

(1) ? // Пять кнопок становятся неактивными.

for (i=0;i<5;i++) {

_root["rock"+row+"-"+i].active = false;

}

(2) ? // Определяем, сколько имеется кнопок одного цвета.

temp = [0,0,0,0,0];

for (i=0;i<5;i++) {

temp[solution[i]]++;

}

(3) ? // Выясняем, сколько цветов правильно угадано.

for (i=0;i<5;i++) {

color = _root["rock"+row+"-"+i]._currentFrame – 2;

if (color == solution[i]) {

numRightSpot++;

temp[color]–;

}

}

(4) ? // Проверяем, сколько цветов угадано,

// но находится не на своих местах.

for (i=0;i<5;i++) {

color = _root["rock"+row+"-"+i]._currentFrame – 2;

if (color != solution[i]) {

if (temp[color] > 0) {

numRightColor++;

temp[color]–;

}

}

}

(5) ? // Создаем белые камешки.

level = row*10+5;

x = rightColLoc;

for(i=0;i<numRightSpot;i++) {

attachMovie("rock","white rock"+level,level);

clip = _root["white rock"+level];

clip.gotoAndStop("white");

clip._x = x;

clip._y = topRowLoc + row*vertSpace;

level++

x+=horizSpace;

}

// Создаем черные камешки.

for(i=0;i<numRightSpot;i++) {

attachMovie("rock","black rock"+level,level);

clip = _root["black rock"+level];

clip.gotoAndStop("black");

clip._x = x;

clip._y = topRowLoc + row*vertSpace;

level++;

x+=horizSpace;

}

(6) ? // Удаляем кнопку Done.

done.removeMovieClip();

(7) ? // Выясняем, выиграл ли игрок.

if (numRightSpot == 5) {

gotoAndPlay("win");

} else {

row++;

// Проверяем, проиграл ли игрок.

if (row >= 10) {

showSolution();

gotoAndPlay("lose");

} else {

createRow();

}

}

}

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

function showSolution() {

// Размещаем правильный вариант внизу экрана.

for(i=0;i<5;i++) {

attachMovie("rock","solution"+i,1001+i);

clip = _root[“solution”+i];

clip._x = solutionx + i*horizSpace;

clip._y = solutiony;

clip.foroAndStop(solution[i]+2);

}

}

На рис. 14.6 показан фрагмент ролика, когда игра уже проиграна. Функция showSolution поместила правильную последовательность (решение) внизу экрана.

Рисунок 14.6. Игра проиграна, код поместил правильную последовательность решения внизу экрана

Единственный оставшийся фрагмент кода – небольшой сценарий, прикрепленный к кнопке в каждом клипе «rock». Его задача состоит в том, чтобы переключать цвета один за другим и возвращаться к первому кадру (пустому месту), если пользователь щелкнул определенное число раз. Этот код также проверяет свойство active, чтобы убедиться, что ряд – текущий.

on (press) {

if (active) {

f = _currentFrame+1;

if (f > 6) f = 1;

gotoAndStop(f);

}

}

К сведению

Не забудьте присвоить последним двум кадрам клипа «rock» метки «white» и «black». Также обязательно поместите кнопку Done внутрь клипа «done», которому потом необходимо присвоить имя «done» в панели Linkage Properties. К сожалению, это необходимо, так как ActionScript не может динамически создавать кнопки сами по себе. Считайте, что клип «done» – это просто «обертка» для кнопки Done.

Другие возможности

Важно помнить о том, что если вы хотите изменить какие – либо элементы игры, надо соответственно подкорректировать константы, представленные в начале кода. Если вы не будете о этом забывать, с игрой можно делать практически что угодно.

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

Данный текст является ознакомительным фрагментом.