Grid game
От: Кодт Россия  
Дата: 10.04.05 18:31
Оценка:
Спасибо just_dmitry и Alex Alexandrov (http://www.rsdn.ru/Forum/?mid=1117419
Автор: Alex Alexandrov
Дата: 10.04.05
)

Внимание, этюд!

Дано: неупорядоченный грид.
Получить: грид, все ячейки которого настроены одинаково (дугой слева-сверху) — за наименьшее количество кликов.

Дано: упорядоченный грид.
Найти: "серебряный" клик, приводящий к наибольшему количеству очков.

Дано: упорядоченный грид.
Найти: преобразовать его в "золотой" грид (возможно, с какой-то регулярной структурой), максимизирующий "серебряный" клик.

Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save.
Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.

Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его поведении и играбельности.
Опять же, open-source программа окажется очень кстати, чтобы проверить на практике.
Перекуём баги на фичи!
Re: Grid game
От: Аноним  
Дата: 21.04.05 08:33
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Спасибо just_dmitry и Alex Alexandrov (http://www.rsdn.ru/Forum/?mid=1117419
Автор: Alex Alexandrov
Дата: 10.04.05
)


К>Внимание, этюд!


К>Дано: неупорядоченный грид.

К>Получить: грид, все ячейки которого настроены одинаково (дугой слева-сверху) — за наименьшее количество кликов.

К>Дано: упорядоченный грид.

К>Найти: "серебряный" клик, приводящий к наибольшему количеству очков.

К>Дано: упорядоченный грид.

К>Найти: преобразовать его в "золотой" грид (возможно, с какой-то регулярной структурой), максимизирующий "серебряный" клик.

К>Для отладки этих задачек было бы очень неплохо завести грид с 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>
Re[3]: Grid game + clone(=save)
От: raskin Россия  
Дата: 23.04.05 18:46
Оценка:
Теперь можно клонировать позицию — завести новое окно с ней же. Данная возможность позволила быстро добиться 6132 очка: развернуть каждую четверть квадрата к своему углу. Щёлкнуть по 4м углам. сделать ещё 1 строчку параллельную повёрнутой. Довернуть угол. Ждать...
Re[3]: Grid game
От: komaz Россия  
Дата: 23.04.05 22:47
Оценка:
Почему-то ни в какую не хотел работать Ваш скрипт. Совершенно не секу в этом, но методом тыка таки полбзуясь сообщениями об ошибках в IE таки запинал и оценил. Весьма удобно, может даже пойду дальше и вставлю картинки, заодно может знания какие приобрету.
Re[4]: Grid game
От: raskin Россия  
Дата: 24.04.05 08:44
Оценка:
Здравствуйте, komaz, Вы писали:

K>Почему-то ни в какую не хотел работать Ваш скрипт. Совершенно не секу в этом, но методом тыка таки полбзуясь сообщениями об ошибках в IE таки запинал и оценил. Весьма удобно, может даже пойду дальше и вставлю картинки, заодно может знания какие приобрету.


Картинки+клон: http://rsdn.ru:80/File/40778/grid.zip
В ИЕ — скажите, что не так, потом чтоб не править каждый раз...
Re[5]: Grid game
От: raskin Россия  
Дата: 24.04.05 10:24
Оценка:
Здравствуйте, raskin, Вы писали:

7295 очков. Позиция типа такой:

^> v>
<^ <v
, щелчок по клетке (3,3) от нуля в левом-верхнем углу
Re[6]: Grid game
От: raskin Россия  
Дата: 24.04.05 10:37
Оценка:
Здравствуйте, raskin, Вы писали:

R>Здравствуйте, raskin, Вы писали:


R>7295 [7377] очков. Позиция типа такой:


R>
R>^> v>
R><^ <v
R>
, щелчок по клетке (3,3) [(4,4)] от нуля в левом-верхнем углу


Я тормоз!
Re[4]: Grid game + clone(=save)
От: LCR Россия lj://_lcr_
Дата: 24.04.05 13:44
Оценка:
Здравствуйте, raskin, Вы писали:

R>Теперь можно клонировать позицию — завести новое окно с ней же. Данная возможность позволила быстро добиться 6132 очка: развернуть каждую четверть квадрата к своему углу. Щёлкнуть по 4м углам. сделать ещё 1 строчку параллельную повёрнутой. Довернуть угол. Ждать...


Сделать ещё одну строчку параллельную повёрнутой? Поподробнее чуть, пожалуйста
quicksort =: (($:@(<#[),(=#[),$:@(>#[)) ({~ ?@#)) ^: (1<#)
Re[5]: Grid game + clone(=save)
От: raskin Россия  
Дата: 24.04.05 14:39
Оценка: 4 (1)
LCR>Сделать ещё одну строчку параллельную повёрнутой? Поподробнее чуть, пожалуйста

Вот картинки — на Ваш вопрос и мой текущий рекорд. Обе возможные (получаемы из любого состояния ходами).

Выделены, естетственно ходы. Поле снято из моей версии на ЯваСкрипте: http://rsdn.ru/File/40778/grid.zip (без одной дырки)
Re[5]: Grid game
От: komaz Россия  
Дата: 24.04.05 21:37
Оценка:
в последней версии все прекрасно работает
Re: Grid game
От: raskin Россия  
Дата: 29.04.05 12:16
Оценка:
Здравствуйте, Кодт, Вы писали:

К>Спасибо just_dmitry и Alex Alexandrov (http://www.rsdn.ru/Forum/?mid=1117419
Автор: Alex Alexandrov
Дата: 10.04.05
)


К>Внимание, этюд!


К>Дано: упорядоченный грид.

К>Найти: преобразовать его в "золотой" грид (возможно, с какой-то регулярной структурой), максимизирующий
K>"серебряный" клик.

Заявка та же — 7377 очков(см. ниже)

К>Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save.

К>Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.

http://rsdn.ru/File/40778/grid.zip
Первая версия, которая, наконец, удовлетворяет всем требованиям. Есть сохранение/загрузка строки
(ну, и клон окна с запоминанием позиции). Менять строку категорически нежелательно (кроме как в конец добавить
";<число>,<число>" — эта клетка (0,0 — 15,15) будет выделена.) Пример (тот самый золотой ход):
16;3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,3 3 3 3 3 3 3 3 2 2 2 2 2 2 2 2 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,0 0 0 0 0 0 0 0 1 1 1 1 1 1 1 1 ,;4,4

В архиве есть этот файл. Выделите всё и вставьте.

К>Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его

поведении и играбельности. Ну, можно сделать игру на торе (И это сделано!). Вопрос — наиболее просто
доказываемая зацикливаемая конфигурация, все ли циклятся.

Любители менять размеры поля — милости просим! В коде есть константа — размер. Можете заменить на текстовое поле.

К>Опять же, open-source программа окажется очень кстати, чтобы проверить на практике.
Re[3]: Grid game
От: gok Россия  
Дата: 04.05.05 00:50
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Всем здравствуйте! Это опять я. Собственно, обещанная реализация на ЯваСкрипт. Текстовая! Маленькая. Эстеты могут рисовать картинки...


А>Регистрироваться лень... Поэтому так.


Пустая желтая страница. (пишет внизу Ошибка на странице). А чего должно быть? Как пофиксить?
gok
Re[4]: Grid game
От: raskin Россия  
Дата: 04.05.05 13:05
Оценка:
Здравствуйте, gok, Вы писали:

gok>Пустая желтая страница. (пишет внизу Ошибка на странице). А чего должно быть? Как пофиксить?


Да, уже говорили.. Не нашёл ошибку. Но ниже вроде работает.
Re[5]: Grid game
От: gok Россия  
Дата: 04.05.05 17:11
Оценка:
Здравствуйте, raskin, Вы писали:
R>Да, уже говорили.. Не нашёл ошибку. Но ниже вроде работает.

Ага, зиппованный вариант работает!
Пасибки!
gok
Re: Grid game - очередная версия
От: raskin Россия  
Дата: 05.05.05 09:11
Оценка: 15 (1)
Здравствуйте, Кодт, Вы писали:

К>Спасибо just_dmitry и Alex Alexandrov (http://www.rsdn.ru/Forum/?mid=1117419
Автор: Alex Alexandrov
Дата: 10.04.05
)


К>Для отладки этих задачек было бы очень неплохо завести грид с undo или хотя бы save.

К>Поэтому этюд для программистов: сделать такое (на флешке или яваскрипте) и поделиться с публикой.

К>Наконец, этюд для архитекторов: найти, что в этом гриде может варьироваться — и как это отразится на его поведении и играбельности.

К>Опять же, open-source программа окажется очень кстати, чтобы проверить на практике

отвечаю новой нитью, чтобы делить сообщения об ошибках.

http://rsdn.ru:80/File/40778/grid.zip — очередная версия
http://rsdn.ru:80/File/40778/grid.htm — пока есть место полежит... она же, но без загрузки на диск

Wake all the forest — после no chain reaction начинает цепную реакцию изо всех стыов сразу.
Остальное понятно.
Кстати, новая серия задач — для маленьких досок. Для 2х2 максимум для возможной позиции равен 9:
2;3 2 ,0 1

Доказательство простое, а можно и перебрать...

Раскин
Re[2]: Grid game - очередная версия
От: raskin Россия  
Дата: 07.05.05 18:50
Оценка:
Здравствуйте, raskin, Вы писали:

R>Кстати, новая серия задач — для маленьких досок. Для 2х2 максимум для возможной позиции равен 9:

R>
R>2;3 2 ,0 1  
R>


Кандидат для 3х3:

3;3 3 2 ,0 0 1 ,0 0 1 ,;2,1

(35 очков)
Кто больше? Что на 4х4?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.