Дано: неупорядоченный грид.
Получить: грид, все ячейки которого настроены одинаково (дугой слева-сверху) — за наименьшее количество кликов.
Дано: упорядоченный грид.
Найти: "серебряный" клик, приводящий к наибольшему количеству очков.
Дано: упорядоченный грид.
Найти: преобразовать его в "золотой" грид (возможно, с какой-то регулярной структурой), максимизирующий "серебряный" клик.
Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save.
Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.
Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его поведении и играбельности.
Опять же, open-source программа окажется очень кстати, чтобы проверить на практике.
)
К>Внимание, этюд!
К>Дано: неупорядоченный грид. К>Получить: грид, все ячейки которого настроены одинаково (дугой слева-сверху) — за наименьшее количество кликов.
К>Дано: упорядоченный грид. К>Найти: "серебряный" клик, приводящий к наибольшему количеству очков.
К>Дано: упорядоченный грид. К>Найти: преобразовать его в "золотой" грид (возможно, с какой-то регулярной структурой), максимизирующий "серебряный" клик.
К>Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save. К>Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.
К>Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его поведении и играбельности. К>Опять же, open-source программа окажется очень кстати, чтобы проверить на практике.
Условие яваскрипта сильное.. Отладить не могу.. Был бы язык программирования, а то есть приколы совместимости.. Но скоро будет
Re[2]: Grid game
От:
Аноним
Дата:
21.04.05 16:16
Оценка:
А>Условие яваскрипта сильное.. Отладить не могу.. Был бы язык программирования, а то есть приколы совместимости.. Но скоро будет
Всем здравствуйте! Это опять я. Собственно, обещанная реализация на ЯваСкрипт. Текстовая! Маленькая. Эстеты могут рисовать картинки...
Регистрироваться лень... Поэтому так.
<html>
<head>
<title>Grid game</title>
<meta content="text/html; charset=koi8-r" http-equiv="Content-Type" />
<meta author="Michael Raskin" />
<meta generator="GVIM" />
</head>
<script language="JavaScript" charset="koi8-r" >
<!--
//---------------------------------Script from here
var d,de; //document and main element used to work in
var nbsp=String.fromCharCode(160);
var directions=[[1,1],[-1,1],[-1,-1],[1,-1]];
var size=16;
var directionAttribName="name";
var state0=[[]];
var marked=[[]];
var oldmark=[[]];
var score;
function insText(node,str)
{
node.appendChild(d.createTextNode(str));
}
function makeA(href,cap)
{
var a=d.createElement("a");
a.setAttribute("href",href);
insText(a,cap);
return a;
}
function tagEl(node,name)
{
node.appendChild(d.createElement(name));
}
function putText(str)
{
insText(de,str);
}
function putTag(name)
{
tagEl(de,name);
}
function fullTag(name,node,text,attribs)
{
var my=d.createElement(name);
if (text!=null) my.appendChild(d.createTextNode(text));
var i;
if (attribs!=null)
for(i=0;i<attribs.length;i++)
{
if (attribs[i]!=null)if(attribs[i].length>1)
my.setAttribute(attribs[i][0],attribs[i][1]);
}
if(node!=null) node.appendChild(my); else
return my;
}
function hasWay(dir,sgn,isY)
{
return (directions[dir][isY]==sgn);
}
function nextDir(dir)
{
var n=dir+1;
while (n<0) n+=4;
while (n>3) n-=4;
return n;
}
function prevDir(dir)
{
var n=dir-1;
while (n<0) n+=4;
while (n>3) n-=4;
return n;
}
function dir2text(dir)
{
var s;
if (directions[dir][1]==1) s="v"; else s="^";
if (directions[dir][0]==-1) s="<"+s; else s=s+">";
return s;
}
function xy2id(x,y)
{
return "grid_"+x.toString()+"_"+y.toString();
}
function writeAnyGrid(states,mark,prevMark)
{
var i,j;
var st;
for(j=0;j<size;j++)
{
for(i=0;i<size;i++)
{
if (mark[i][j]){
st=["style","color: red"];
de.replaceChild(fullTag("a",null,dir2text(states[i][j]),
[[directionAttribName,states[i][j].toString()],
["id",xy2id(i,j)],
["href","javascript:click("+i.toString()+","+j.toString()+");"],st]),
d.getElementById(xy2id(i,j)));
} else if (prevMark[i][j]){
st=["style","color: green"];
de.replaceChild(fullTag("a",null,dir2text(states[i][j]),
[[directionAttribName,states[i][j].toString()],
["id",xy2id(i,j)],
["href","javascript:click("+i.toString()+","+j.toString()+");"],st]),
d.getElementById(xy2id(i,j)));
}
}
}
}
function scanGrid(state)
{
var i,j;
for(i=0;i<size;i++) state[i]=[];
for(i=0;i<size;i++)
for(j=0;j<size;j++)
state[i][j]=
Number(d.getElementById(xy2id(i,j)).getAttribute(directionAttribName));
}
function rotateAll(state,mark)
{
var i,j;
for(i=0;i<size;i++)for(j=0;j<size;j++)
{
state[i][j]+=mark[i][j];
while(state[i][j]<0)state[i][j]+=4;
while(state[i][j]>3)state[i][j]-=4;
}
}
function writeZeroGrid()
{
init();
clear();
var i,j;
for(j=0;j<size;j++)
{
for(i=0;i<size;i++)
{
fullTag("a",de,dir2text(0),[[directionAttribName,"0"],
["id",xy2id(i,j)],
["href","javascript:click("+i.toString()+","+j.toString()+");"]]);
putText(nbsp);
}
putTag("br");
}
}
function click(x,y)
{
init();
makeSize();
var i,j;
for(i=0;i<size;i++)for(j=0;j<size;j++)
{
marked[i][j]=0;
oldmark[i][j]=0;
}
marked[x][y]=1;
scanGrid(state0);
score=1;
iterate();
}
function checkConnect(x,y,dir)
{
//uses oldmark array!!!
var c=0;
if ((x>0) && (hasWay(dir,-1,0)))
{
if (hasWay(state0[x-1][y],1,0) && oldmark[x-1][y])
c++;
}
if ((x<size-1) && (hasWay(dir,1,0)))
{
if (hasWay(state0[x+1][y],-1,0) && oldmark[x+1][y])
c++;
}
if ((y>0) && (hasWay(dir,-1,1)))
{
if (hasWay(state0[x][y-1],1,1) && oldmark[x][y-1])
c++;
}
if ((y<size-1) && (hasWay(dir,1,1)))
{
if (hasWay(state0[x][y+1],-1,1) && oldmark[x][y+1])
c++;
}
score+=c;
return c;
}
function fillMarks()
{
var i,j,flag=0,c;
for (i=0;i<size;i++)for(j=0;j<size;j++)
{
c=checkConnect(i,j,state0[i][j]);
if(c)flag=1;
marked[i][j]=c;
}
return flag;
}
function iterate()
{
var i,j;
var scoreboard=d.getElementById("score");
var nsb=scoreboard.cloneNode(0);
scoreboard.parentNode.replaceChild(nsb,scoreboard);
scoreboard=nsb;
scoreboard.setAttribute("id","score");
insText(scoreboard,score);
rotateAll(state0,marked);
writeAnyGrid(state0,marked,oldmark);
for(i=0;i<size;i++)for(j=0;j<size;j++)
oldmark[i][j]=marked[i][j];
if(fillMarks()) setTimeout(iterate,300);
else writeAnyGrid(state0,marked,oldmark);
}
function makeSize()
{
var i;
for(i=0;i<size;i++)
{
state0[i]=[];
marked[i]=[];
oldmark[i]=[];
}
}
function clear()
{
de.parentNode.replaceChild(de.cloneNode(0),de);
de=d.getElementById("main");
}
function init()
{
d=document;
de=d.getElementById("main");
}
//---------------------------------Script up to here
//-->
</script>
<body bgcolor="FFFFE0" onload="writeZeroGrid(); " >
<div id="main">
</div>
<div id="score">
</div>
</body>
</html>
Теперь можно клонировать позицию — завести новое окно с ней же. Данная возможность позволила быстро добиться 6132 очка: развернуть каждую четверть квадрата к своему углу. Щёлкнуть по 4м углам. сделать ещё 1 строчку параллельную повёрнутой. Довернуть угол. Ждать...
Почему-то ни в какую не хотел работать Ваш скрипт. Совершенно не секу в этом, но методом тыка таки полбзуясь сообщениями об ошибках в IE таки запинал и оценил. Весьма удобно, может даже пойду дальше и вставлю картинки, заодно может знания какие приобрету.
Здравствуйте, komaz, Вы писали:
K>Почему-то ни в какую не хотел работать Ваш скрипт. Совершенно не секу в этом, но методом тыка таки полбзуясь сообщениями об ошибках в IE таки запинал и оценил. Весьма удобно, может даже пойду дальше и вставлю картинки, заодно может знания какие приобрету.
Здравствуйте, raskin, Вы писали:
R>Теперь можно клонировать позицию — завести новое окно с ней же. Данная возможность позволила быстро добиться 6132 очка: развернуть каждую четверть квадрата к своему углу. Щёлкнуть по 4м углам. сделать ещё 1 строчку параллельную повёрнутой. Довернуть угол. Ждать...
Сделать ещё одну строчку параллельную повёрнутой? Поподробнее чуть, пожалуйста
LCR>Сделать ещё одну строчку параллельную повёрнутой? Поподробнее чуть, пожалуйста
Вот картинки — на Ваш вопрос и мой текущий рекорд. Обе возможные (получаемы из любого состояния ходами). —
Выделены, естетственно ходы. Поле снято из моей версии на ЯваСкрипте: http://rsdn.ru/File/40778/grid.zip (без одной дырки)
)
К>Внимание, этюд!
К>Дано: упорядоченный грид. К>Найти: преобразовать его в "золотой" грид (возможно, с какой-то регулярной структурой), максимизирующий K>"серебряный" клик.
Заявка та же — 7377 очков(см. ниже)
К>Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save. К>Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.
http://rsdn.ru/File/40778/grid.zip
Первая версия, которая, наконец, удовлетворяет всем требованиям. Есть сохранение/загрузка строки
(ну, и клон окна с запоминанием позиции). Менять строку категорически нежелательно (кроме как в конец добавить
";<число>,<число>" — эта клетка (0,0 — 15,15) будет выделена.) Пример (тот самый золотой ход):
В архиве есть этот файл. Выделите всё и вставьте.
К>Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его
поведении и играбельности. Ну, можно сделать игру на торе (И это сделано!). Вопрос — наиболее просто
доказываемая зацикливаемая конфигурация, все ли циклятся.
Любители менять размеры поля — милости просим! В коде есть константа — размер. Можете заменить на текстовое поле.
К>Опять же, open-source программа окажется очень кстати, чтобы проверить на практике.
Здравствуйте, Аноним, Вы писали:
А>Всем здравствуйте! Это опять я. Собственно, обещанная реализация на ЯваСкрипт. Текстовая! Маленькая. Эстеты могут рисовать картинки...
А>Регистрироваться лень... Поэтому так.
Пустая желтая страница. (пишет внизу Ошибка на странице). А чего должно быть? Как пофиксить?
)
К>Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save. К>Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.
К>Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его поведении и играбельности. К>Опять же, open-source программа окажется очень кстати, чтобы проверить на практике
отвечаю новой нитью, чтобы делить сообщения об ошибках.
Wake all the forest — после no chain reaction начинает цепную реакцию изо всех стыов сразу.
Остальное понятно.
Кстати, новая серия задач — для маленьких досок. Для 2х2 максимум для возможной позиции равен 9: