Gomoku
| Gomoku | |
| Скриншот
| |
| Тип | Логическая игра |
| Разработчик | Утянский Александр |
| Группа | ИВТ-х47 |
| Написана на | ActionScript 3.0 |
| ОС | Любая |
| Текущая версия | 1.00 — 22 ноября 2009 |
| Лицензия | Freeware |
| Скачать | Играть online |
Gomoku - это модификация игры "Пять в ряд" для трех участников: одного человека и двух компьютерных игроков. Данная игра разрабатывалась в рамках курсового проекта по дисциплине Информатика.
Содержание |
Правила игры
Игроки по очереди расставляют свои знаки ("х", "о" и "#") в клетках бесконечного поля. Первым ходит крестик (человек), затем нолик (компьютер) и решетка (компьютер). Побеждает тот, кто сможет первым построить непрерывный ряд из пяти или более своих знаков (по горизонтали, вертикали или диагонали).
Логика компьютерного игрока
Каждой клетке поля компьютер присваивает очки в зависимости от того, какую пользу может принести эта клетка (либо создание угрозы, либо предотвращение угрозы противника). Сперва считаются очки <math>O_1</math> и <math>O_2</math> - оценка выгоды, получаемой первым противником и вторым соответственно. Затем считаются очки <math>C</math> - оценка выгоды, получаемой компьютером.
Окончательная формула оценки выглядит следующим образом:
<math>P=2{\cdot}C+O_1+O_2</math>
Компьютер ставит свой знак в клетку, набравшую максимальное количество очков.
Виды угроз
Чтобы выиграть, необходимо создать "тройную угрозу", например, пересечение открытой четверки и четверки или пересечение трех четверок.
Реализация на ActionScript 3.0
Скроллинг игрового поля
Для реализации скроллинга игрового поля была использована библиотека Tweener. Библиотека содержит класс Tweener.
Чтобы добавить в AS3-приложение анимацию, достаточно вызвать на этом классе статический метод addTween с соответствующими параметрами.
Создаём контейнер отображаемых объектов - объект класса Sprite под названием SpriteMain, создаём объект класса Sprite под названием spriteField, играющий роль игрового поля:
var spriteMain:Sprite = new Sprite(); var spriteField:Sprite = new Sprite(); const win_w:int = 460; // ширина контейнера const win_h:int = 460; // высота контейнера spriteMain.graphics.lineStyle(1); spriteMain.graphics.drawRect(0,0,win_w,win_h); addChild(spriteField); addChild(spriteMain);
По краям контейнера отображаемых объектов создаём 4 объекта класса MovieClip. Ниже представлен код, создающий MovieClip в верхней области контейнера:
var mc:MovieClip; const borderSize = 20; mc = new MovieClip(); mc.id=1; mc.graphics.beginFill(0,0); mc.graphics.drawRect(0,0,win_w,borderSize); spriteMain.addChild(mc); mc.addEventListener(MouseEvent.MOUSE_OVER, over); mc.addEventListener(MouseEvent.MOUSE_OUT, out);
При наведении курсора на MovieClip активировался Twinner, перемещающий игровое поле. Пример кода, демонстрирующий движение игрового поля вниз до координаты y=20 (borderSize) при наведении курсора в верхнюю область контейнера отображаемых объектов:
private function over(evt:Event):void{
var id:Number = evt.target.id;
switch(id) {
case 1:
if(spriteField.y < borderSize)
Tweener.addTween(spriteField, {y:borderSize, time:0.5, transition:"linear"});
break;
}
}
Tweener деактивируется при выходе курсора мыши за границы любого из объектов MovieClip:
private function out(evt:Event):void{
Tweener.removeAllTweens();
}
Работа с изображениями
Внешние растровые изображения могут быть загружены на этапе компиляции с помощью тега метаданных [Embed]. Предполагается, что файл класса, встраивающего растровое изображение, и сам файл растрового изображения находятся в одной папке.
package {
import flash.display.*;
var bmpX:Bitmap = new picX();
var bmpO:Bitmap = new picO();
var bmpS:Bitmap = new picS();
public class BitmapEmbedder extends Sprite {
// встраиваем растровые изображения
[Embed(source="x.gif")]
private var picX:Class;
[Embed(source="o.gif")]
private var picO:Class;
[Embed(source="s.gif")]
private var picS:Class;
private function BitmapEmbedder():void {
// Создаем экземпляр встроенного растрового изображения
var bmpX:Bitmap = new picX();
var bmpO:Bitmap = new picO();
var bmpS:Bitmap = new picS();
}
}
}
К пиксельным данным встроенного растрового изображения можно обращаться через переменную экземпляра bitmapData класса Bitmap.
Метод Graphics.beginBitmapFill() обеспечивает возможность применять растровое изображение как заливку формы. В следующем примере встроенные растровые изображения крестика, нолика и решётки копируются в объект BitmapData и полученное изображение используется для заливки игрового поля.
var field:Array; // массив игрового поля
var m:int; // число строк роля
var n:int; // число столбцов поля
var field_w:int; // ширина игрового поля
var field_h:int; // высота игрового поля
var rect:Rectangle;
var dPoint:Point;
const cell_w:int = 20; // ширина клетки
const cell_h:int = 20; // высота клетки
private function draw_field():void {
var bitmap:BitmapData;
var kartina:BitmapData = new BitmapData(field_w,field_h,true,0xFFFFFF);
// расставляем крестики/нолики/решётки
for (var i:int=0;i<m;i++){
for (var j:int=0;j<n;j++){
switch (field[i][j]){
case 1:
bitmap = bmpX.bitmapData;
break;
case 2:
bitmap = bmpO.bitmapData;
break;
case 3:
bitmap = bmpS.bitmapData;
break;
}
if (field[i][j]!=0){
dPoint = new Point(j*cell_w,i*cell_h);
rect = new Rectangle(0,0,cell_w,cell_h);
kartina.copyPixels(bitmap,rect,dPoint);
}
}
}
// заливаем спрайт игрового поля
spriteField.graphics.lineStyle(1);
spriteField.graphics.beginBitmapFill(kartina,null,false);
spriteField.graphics.drawRect(0,0,field_w,field_h);
spriteField.graphics.endFill();
}
Ссылки
http://en.wikipedia.org/wiki/Five_in_a_Row_(game) - "5 в ряд" на en.wikipedia.org
http://code.google.com/p/tweener/ - скачать библиотеку Tweener