JS, Canvas. Игра "Точки. Захват территории"

Статус
Закрыто для дальнейших ответов.

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
на днях вспомнил такую хорошую игру под названием "Точки".
Может быть кто-то играл в нее в детстве. Решил реализовать ее на canvas.


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

http://jsfiddle.net/sUyRu/

Собственно проблема:

Когда несколько точек одного игрока(цвета) создают замыкающую фигуру
я не могу рассчитать путь и все точки которые входят внутрь этой фигуры для составления массива координат.
Внутри обьекта app.functions есть функция blockConstruct которая продемонстрирует создание фигуры в определенной области.

Дополнительная информация:

Каждый квадрат имеет размер 20х20 пикселей. Поэтому координата 2x2 == 40x40
Мне нужен не обязательно код, а логика по которой можно рассчитать дирректорию и область.

Вот код отдельно:

Код:
<canvas id='game_points' width='401' height='401'>
	 <a href='javascript:void(0);'></a>
</canvas>

Код:
			$(function(){
				var app = {};
			  
			  
				app.$canvas = $('#game_points');
				app.in_action = 0;
				app.mouse = app.players = app.data = app.size = {};
				  
					app.size.width = 400;
					app.size.height = 400;
				  
					app.data.playerStep = 'black';
					app.data.pointList = app.data.pointByPlayer = new Array();
				  
					app.data.pointByPlayer['black'] = app.data.pointByPlayer['red'] = new Array();
				  
					app.mouse.top = 0;
					app.mouse.left = 0;
				  
					app.players.black = {color:'#000000'};
					app.players.red = {color:'#ff0000'};
				  
				if (app.$canvas[0].getContext)
					app.ctx = app.$canvas[0].getContext('2d');
				else
					return false;
			  
				app.functions = {
					blockConstruct:function( coordX, coordY ){
						//TEST for TEST
						app.ctx.beginPath();
						app.ctx.moveTo(20,20);
						app.ctx.lineTo(40,20);
						app.ctx.lineTo(60,40);
						app.ctx.lineTo(40,60);
						app.ctx.lineTo(20,40);
						app.ctx.lineTo(20,20);
						app.ctx.closePath();
						app.ctx.stroke();
					},
					setPoint:function( coordX, coordY ){
				  
						coordX = Math.round( coordX / 20 ) * 20;
						coordY = Math.round( coordY / 20 ) * 20;
					  
						if( app.data.pointList[coordX+'.'+coordY] ) return false;
					  
						app.ctx.beginPath();
						app.ctx.arc( coordX, coordY, 5, 0, Math.PI*2, true );
						app.ctx.fillStyle = app.players[app.data.playerStep].color;
						app.ctx.closePath();
						app.ctx.fill();
					  
						app.data.pointByPlayer[app.data.playerStep][coordX+'.'+coordY] = app.data.pointList[coordX+'.'+coordY] = {
							playerName : app.data.playerStep,
							coordX : coordX,
							coordY : coordY,
							quadraX : coordX / 20,
							quadraY : coordY / 20
						}
					  
						if( app.data.playerStep == 'black' )
							app.data.playerStep = 'red';
						else
							app.data.playerStep= 'black';
					  
					}
				}
				//app.functions.blockConstruct(1,2);
				app.$canvas.mousemove(function(e){
					app.offset = app.$canvas.offset();
					app.mouse.top = parseInt(e.pageY-app.offset.top);
					app.mouse.left = parseInt(e.pageX-app.offset.left);
				});
				app.$canvas.click(function(e){
					if( app.in_action == 1 ) return false;
					app.in_action = 1;
			  
					app.functions.setPoint( app.mouse.left, app.mouse.top );
				  
					app.in_action = 0;
					return false;
				})
			});
Код:
body, html {height:100%;}
body {margin:0;height:100%;}
canvas#game_points {
    position:absolute;
    margin-left:-200px;
    left:50%;
    top:30px;
    background:transparent url('http://s018.radikal.ru/i507/1201/56/aeed04ee1b7d.png') repeat left top;
}
 

Aristotel

Well-Known Member
Регистрация
14.04.2011
Сообщения
213
Эта игра чем та напоминает го (знаю, это не го, пришлось погуглить).
я как та задумывался сделать что та подобное, посмотрел другие игры и все игры такого рода делаются на JAVA или на Flash, так что алгоритмов я не увидел.
но я себе представляю это таким способом:
при каждом ходе делается проверка на точку которую вы поставили. таким обзором будут проверены все точки. какую же проверку:
проверку на окружающие точки, то есть: вы поставили точку в (2,2), после чего проверить на наличие точки вокруг точки (2,2) того же цвета (в (1,1),(1,2),(1,3),(2,1)...(3,3). если нет точек то ничего не делать , если нашлась одна точка то перейти на нее и проверить все точки вокруг ее, и исключить ту точку с которой начался счет, если есть точки то перейти на следующую, и там проверить не находится ли она рядом с первой точкой , если да то уже появился малый треугольник, если нет то идти дальше пока не наступит момент когда вокруг не окажется ни одной точки или соединение с первой.

это конечно все очень поверхностно и в внутри алгоритма понадобится делать очень много проверок и я не уверен что все эти игры работают именно так.

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

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
Ясно, это единственный вариант который пришел на ум вначале мне, а потом вам.
Дело в том что это очень ресурсозатратный прием проверять множество точек на 1 ходе.

Думал есть еще варианты похитрее.
 

Aristotel

Well-Known Member
Регистрация
14.04.2011
Сообщения
213
Ясно, это единственный вариант который пришел на ум вначале мне, а потом вам.
Дело в том что это очень ресурсозатратный прием проверять множество точек на 1 ходе.

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

Не думали попробовать перейти на экшен скрипт с флешкой?
 

marker

Well-Known Member
Регистрация
23.10.2010
Сообщения
399
думал, для этого нужно нормально освоить его,
что в принципе очень трудно сделать самостоятельно без нормального справочника.
справочник adobe не раскрывает все возможности

дело в том что версии постоянно меняются и некоторые функции устаревают и удаляют, после чего сидишь над кодом и не втыкаешь почему у тебя не работает.
 

BaNru

Пацифизжу
Команда форума
Регистрация
13.11.2010
Сообщения
4 138
на днях вспомнил такую хорошую игру под названием "Точки". Может быть кто-то играл в нее в детстве. Решил реализовать ее на canvas.
Помню в школе в нее играли. Так же как и морской бой ))))

А у нас была фишка - закрашивать самому, и не подсказывать, это в интересах противника.
Вдруг не заметит. Типа фук в шашках.

Может стоит закрашивать ручками?
Еще вот ИИ не хватает или онлайна PvP ))))
 
Статус
Закрыто для дальнейших ответов.
Верх Низ