-
Notifications
You must be signed in to change notification settings - Fork 0
/
hanoi.js
152 lines (136 loc) · 4.81 KB
/
hanoi.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
var timer_interval = 0;
var Hanoi = function(el, cnt){
var columns_selector = '[data-type="column"]',
block_selector = '[data-type="block"]',
columns = el.find(columns_selector),
tower_h = el.find('[data-type="tower"]').height(),
victory_el = el.find('[data-type="victory"]'),
counter_el = el.find('[data-type="counter"]'),
share_el = el.find('[data-type="share"]'),
file_link_el = el.find('[data-type="file-link"]'),
counter = 0,
timer_el = el.find('[data-type="timer"]'),
timer = 0,
min_width = 20,
from = 0,
to = 0,
count = cnt;
var init = function(){
generate_blocks(3);
// обнулим счетчики, таймеры
counter_el.text(counter);
timer_el.text(timer);
clearInterval(timer_interval);
timer_interval = 0;
victory_el.hide();
columns.sortable({
connectWith: columns_selector,
items: '> [data-sortable]',
start: function( event, ui ){
// сохраним откуда тащим
from = ui.item.parent().data("num");
// запустим таймер игры, как только взяли первый блок
if (timer_interval === 0) timer_interval = setInterval(start_timer,1000);
},
beforeStop: function( event, ui ){
var blocks = ui.item.siblings().filter(block_selector);
// только если это верхний блок
if (ui.item.data('sortable') === false){
return false;
}
if (blocks.length > 0){
// prevent putting one block before existing
if (ui.item.prevAll(block_selector).length > 0){
return false;
}
// prevent putting one block on wider other
if(ui.item.nextAll(block_selector).data('width') < ui.item.data('width')){
return false;
}
}
},
stop: function( event, ui ){
// сохраним куда тащим
to = ui.item.parent().data("num");
// если было перемещение на другую башню
if (from !== to){
// обновим счетчик
counter_el.text(++counter);
// запишем в файл
save(counter,from,to,timer);
}
// проверим на победу, если в одной башне все собрались - умница
var blocks_count = ui.item.siblings().filter(block_selector).length;
if ( blocks_count === count-1 && to != 1 ){
clearInterval(timer_interval);
// columns.sortable('disable');
victory_el.show();
new Ya.share({
element: 'ya_share',
theme: 'counter',
elementStyle: {
'type': 'icon',
'linkIcon': true,
'quickServices': ['vkontakte', 'facebook', 'twitter', 'odnoklassniki', 'gplus']
},
link: window.location.href,
title: 'Онлайн игра Ханойские башни',
description: "Блоков: " + count + ", шагов: " + counter + "; секунд: " + timer,
image: window.location.href + "hanoi.png"
});
// запишем в файл победу!!
save(counter,0,0,timer);
}
}
});
};
// таймер игры
var start_timer = function(){
timer_el.text(++timer);
};
// сохраним в файл на сервере
var save = function(counter, from, to){
$.ajax({
url: 'hanoi.php',
type: 'post',
data: {'counter':counter, 'from': from, 'to': to, 'timer': timer},
success: function (data) {
data = $.parseJSON(data);
if (data.file){
file_link_el.attr("href",data.file);
}
}
});
// console.log(from+' -> '+to);
};
// генерируем нужное количество блоков
var generate_blocks = function(){
var delta = (100 - min_width) / (count - 1),
block_h = tower_h / count,
generated_blocks = "";
for(var i = min_width; i <= 101; i += delta){
generated_blocks += '<tr class="block-wrapper" data-type="block" data-width="'+i+'" data-sortable="false" style="height:'+block_h+'px;"><td style="width:inherit;"><div class="block" style="width: '+i+'%;height:'+block_h+'px;"> </div></td></tr>';
}
columns.html('<tr><td> </td></tr>');
// начинаем с певой башни
columns.first().append(generated_blocks);
renew_sortable();
};
// нельзя двигать нижние блоки, только те, которые сверху
var renew_sortable = function(){
columns.each(function(i){
$(this).find(block_selector).data('sortable', false);
$(this).find(block_selector).first().data('sortable', true);
});
};
// после каждого хода нужно обновить состояние блоков
columns.on("sortstop", function( event, ui ){
renew_sortable();
});
init();
};
$('#hanoi-start').on('click',function(){
var crcl_cnt = $('#inputblocks-Count').val();
hanoi = new Hanoi($('[data-type=Hanoi]'), crcl_cnt);
});
$('#hanoi-start').trigger('click');