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>

Компьютер ставит свой знак в клетку, набравшую максимальное количество очков.

Виды угроз

Название Описание Изображение Очки
Пятерка Непрерывный ряд из пяти одинаковых знаков Gomoku угроза1.png 1000
Открытая четверка Непрерывный ряд из четырех одинаковых знаков, который может быть одним ходом достроен до пятерки с любой из сторон Gomoku угроза2.png 400
Четверка Ряд из четырех одинаковых знаков, который может быть одним ходом достроен до пятерки Gomoku угроза3.png 15
Четверка с интервалом Ряд из четырех одинаковых знаков, имеющий разрыв в одну пустую клетку Gomoku угроза4.png 8
Открытая тройка Ряд из трех одинаковых знаков, который может быть одним ходом достроен до открытой четверки Gomoku угроза5.png 30
Тройка Ряд из трех одинаковых знаков, который может быть одним ходом достроен до четверки Gomoku угроза6.png 2
Тройка с интервалом Ряд из трех одинаковых знаков, имеющий разрыв в одну пустую клетку Gomoku угроза7.png 15
Открытая двойка Ряд из двух одинаковых знаков, который может быть одним ходом достроен до открытой тройки Gomoku угроза8.png 4
Двойка Ряд из двух одинаковых знаков, который может быть одним ходом достроен до тройки Gomoku угроза9.png 1
Двойка с интервалом Ряд из двух одинаковых знаков, имеющий разрыв в одну пустую клетку Gomoku угроза10.png 2

Чтобы выиграть, необходимо создать "тройную угрозу", например, пересечение открытой четверки и четверки или пересечение трех четверок.

Реализация на 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

Личные инструменты