//for IE support only, shit! if (!Array.prototype.indexOf) { Array.prototype.indexOf=function(value, start) { var i; if (!start) start = 0; for(i=start; i'; html_str += '
'; jqobj.append(html_str); } //create 81 cells for (i=0; i'; html_str += '
' if (g_show_hint)//"true" in replay/add page html_str += '
123456789
'; else html_str += '
'; html_str += ''; jqobj.append(html_str); var obj = document.getElementById("cell" + i); obj["locked"] = locked; obj["digit"] = g_values[i]; obj["index"] = i; } var wrap = $("#canvas-wrap"); html_str = ""; for (i=0; i<9; i++){ var val = i*CELLWH+shift[i];//offset var c = "ABCDEFGHI".charAt(i); html_str += '
'+(i+1)+'
'; html_str += '
'+(i+1)+'
'; html_str += '
'+c+'
'; html_str += '
'+c+'
'; } wrap.append(html_str); } function display_selection(event, obj) { if (g_locked) return; if (obj.locked || $("#selection-panel").css("display") != "none") { $("#selection-panel").hide(); return; } if (event.button & 2) { mark_toggle(obj); return; } var html_str = ""; for (var i=0; i<10; i++) { html_str += '
' + i + '
'; } $("#selection-panel").html(html_str); $("#sel0").text("X"); $("#selection-panel").css("left", parseInt($(obj).css("left"), 10)); $("#selection-panel").css("top", parseInt($(obj).css("top"), 10)+5); $("#selection-panel").show(); if (event.button & 2) $("#selection-panel").addClass("guess"); else $("#selection-panel").removeClass("guess"); } function mark_toggle(cell_obj) { $(cell_obj).toggleClass("marked"); } function mark_cell(cell_obj, markiftrue) { if (markiftrue) $(cell_obj).addClass("marked"); else $(cell_obj).removeClass("marked"); } function toggle_guess(obj, digit){ var guess_obj = $("#guess"+obj.index); if (digit == 0){ guess_obj.text(''); return; } var ds = digit.toString(); var guesses = guess_obj.text().split(''); if (guesses.indexOf(ds) >= 0) guesses.splice(guesses.indexOf(ds), 1); else{ guesses.push(digit); guesses = guesses.sort(); } guess_obj.text(guesses.join('')); } function set_digit(event, obj_id, digit) { if (g_locked) { alert("点击“重新开始”或刷新此页面以重玩本布局"); return; //do nothing if the block is locked } var obj = document.getElementById(obj_id); if ($("#selection-panel").hasClass("guess") || event.button&2){ toggle_guess(obj, digit); $("#selection-panel").hide(); return; } obj.digit = digit; g_values[obj.index] = digit; for (var i=0; i<=9; i++) $(obj).removeClass("cell" + i); $(obj).addClass("cell" + digit); $("#selection-panel").hide(); g_steps.push(obj.index); g_steps.push(obj.digit); check_for_conflict(); update_highlighter(); } g_index_map = [ [ 1, 2, 3, 4, 5, 6, 7, 8, 9,10,11,18,19,20,27,36,45,72,54,63], [ 0, 2, 3, 4, 5, 6, 7, 8,73,10,11,18,19, 9,28,37,64,46,55,20], [ 0, 1, 3, 4, 5, 6, 7, 8, 9,74,11,18,19,20,29,38,47,56,10,65], [ 0, 1, 2, 4, 5, 6, 7, 8,75,12,66,14,13,21,22,23,30,39,48,57], [ 0, 1, 2, 3, 5, 6, 7, 8,12,76,13,14,67,21,22,23,31,40,49,58], [ 0, 1, 2, 3, 4, 6, 7, 8,12,77,14,13,21,22,23,68,32,41,50,59], [ 0, 1, 2, 3, 4, 5, 7, 8,78,15,16,17,24,25,26,69,33,42,51,60], [ 0, 1, 2, 3, 4, 5, 6, 8,79,16,17,24,25,26,15,34,70,43,52,61], [ 0, 1, 2, 3, 4, 5, 6, 7,15,80,17,24,25,26,16,35,71,44,53,62], [ 0, 1, 2,72,10,11,12,13,14,15,16,17,18,19,20,27,36,45,54,63], [64, 1, 2, 0, 9,11,12,13,14,15,16,17,18,19,20,28,37,46,73,55], [ 0,65, 2, 1, 9,10,12,13,14,15,16,17,18,19,20,29,38,47,56,74], [66, 3, 4, 5, 9,10,11,13,14,15,16,17,75,21,22,23,30,39,48,57], [67, 4, 5, 9,10,11,12,14,15,16,17, 3,21,22,23,31,40,76,49,58], [ 3,68, 5, 9,10,11,12,77,13,16,17,21,22,23, 4,15,32,41,50,59], [69, 6, 7, 8, 9,10,11,12,13,14,16,17,78,24,25,26,33,42,51,60], [70, 7, 8, 9,10,11,12,13,14,15,17,24,25,26,79,34, 6,43,52,61], [ 6,71, 8, 9,10,11,12,13,14,15,80,24,25,26,16,35, 7,44,53,62], [ 0, 1, 2,72, 9,10,11,19,20,21,22,23,24,25,26,27,36,45,54,63], [64, 1, 2, 0,73,10,11,18,20,21,22,23,24,25,26,28,37,46,55, 9], [ 0,65, 2, 1, 9,74,11,18,19,21,22,23,24,25,26,29,38,47,56,10], [66, 3, 4, 5,75,12,13,14,18,19,20,22,23,24,25,26,30,39,48,57], [67, 4, 5,12,76,13,14,18,19,20,21,23,24,25,26,31, 3,40,49,58], [ 3,68, 5,12,77,14,13,18,19,20,21,22,24,25,26,32,41,50,59, 4], [69, 6, 7, 8,78,15,16,17,18,19,20,21,22,23,25,26,33,42,51,60], [70, 7, 8,79,16,17,18,19,20,21,22,23,24,26,15,34, 6,43,52,61], [ 6,71, 8,15,80,17,18,19,20,21,22,23,24,25,16,35, 7,44,53,62], [ 0,72, 9,18,28,29,30,31,32,33,34,35,36,37,38,45,46,47,54,63], [64, 1,73,10,19,27,29,30,31,32,33,34,35,36,37,38,45,46,47,55], [65, 2,74,11,20,27,28,30,31,32,33,34,35,36,37,38,45,46,47,56], [66, 3,75,12,21,27,28,29,31,32,33,34,35,39,40,41,48,49,50,57], [67, 4,76,13,22,27,28,29,30,32,33,34,35,39,40,41,48,49,50,58], [68, 5,77,14,23,27,28,29,30,31,33,34,35,39,40,41,48,49,50,59], [69, 6,78,15,24,27,28,29,30,31,32,34,35,42,43,44,51,52,53,60], [70, 7,79,16,25,27,28,29,30,31,32,33,35,42,43,44,51,52,53,61], [71, 8,80,17,26,27,28,29,30,31,32,33,34,42,43,44,51,52,53,62], [ 0,72, 9,18,27,28,29,37,38,39,40,41,42,43,44,45,46,47,54,63], [64, 1,73,10,19,27,28,29,36,38,39,40,41,42,43,44,45,46,47,55], [65, 2,74,11,20,27,28,29,36,37,39,40,41,42,43,44,45,46,47,56], [66, 3,75,12,21,30,31,32,36,37,38,40,41,42,43,44,48,49,50,57], [67, 4,76,13,22,30,31,32,36,37,38,39,41,42,43,44,48,49,50,58], [68, 5,77,14,23,30,31,32,36,37,38,39,40,42,43,44,48,49,50,59], [69, 6,78,15,24,33,34,35,36,37,38,39,40,41,43,44,51,52,53,60], [70, 7,79,16,25,33,34,35,36,37,38,39,40,41,42,44,51,52,53,61], [71, 8,80,17,26,33,34,35,36,37,38,39,40,41,42,43,51,52,53,62], [ 0,72, 9,18,27,28,29,36,37,38,46,47,48,49,50,51,52,53,54,63], [64, 1,73,10,19,27,28,29,36,37,38,45,47,48,49,50,51,52,53,55], [65, 2,74,11,20,27,28,29,36,37,38,45,46,48,49,50,51,52,53,56], [66, 3,75,12,21,30,31,32,39,40,41,45,46,47,49,50,51,52,53,57], [67, 4,76,13,22,30,31,32,39,40,41,45,46,47,48,50,51,52,53,58], [68, 5,77,14,23,30,31,32,39,40,41,45,46,47,48,49,51,52,53,59], [69, 6,78,15,24,33,34,35,42,43,44,45,46,47,48,49,50,52,53,60], [70, 7,79,16,25,33,34,35,42,43,44,45,46,47,48,49,50,51,53,61], [71, 8,80,17,26,33,34,35,42,43,44,45,46,47,48,49,50,51,52,62], [ 0,64,65,72, 9,74,18,73,27,36,45,55,56,57,58,59,60,61,62,63], [64, 1,65,72,73,10,19,28,37,46,74,54,56,57,58,59,60,61,62,63], [64,65, 2,72,73,74,11,20,29,38,47,54,55,57,58,59,60,61,62,63], [66, 3,68,76,75,12,77,67,21,30,39,48,54,55,56,58,59,60,61,62], [66,67, 4,75,76,13,77,22,68,31,40,49,54,55,56,57,59,60,61,62], [66,67,68, 5,75,76,77,14,23,32,41,50,54,55,56,57,58,60,61,62], [69, 6,71,78,15,80,24,79,33,70,42,51,54,55,56,57,58,59,61,62], [69,70, 7,78,79,16,25,71,80,34,43,52,54,55,56,57,58,59,60,62], [69,70,71, 8,78,79,80,17,26,35,44,53,54,55,56,57,58,59,60,61], [64,65,66,67,68,69,70,71,72, 9,74,55,18,27, 0,36,45,54,73,56], [65,66,67,68,69,70,71,72,73,10,19,28, 1,37,46,54,55,56,74,63], [64,66,67,68,69,70,71,72,73,74,11, 2,20,29,38,47,54,55,56,63], [64,65,67,68,69,70,71,76,75,12,77, 3,21,30,39,48,57,58,59,63], [64,65,66,68,69,70,71,75,76,13,77,22, 4,31,40,49,57,58,59,63], [64,65,66,67,69,70,71,75,76,77,14,23, 5,32,41,50,57,58,59,63], [64,65,66,67,68,70,71,78,15,80,24,79,33, 6,42,51,60,61,62,63], [64,65,66,67,68,69,71,78,79,16,43,25,80,34, 7,52,60,61,62,63], [64,65,66,67,68,69,70, 8,78,79,80,17,26,35,44,53,60,61,62,63], [ 0,64,65,73,74,75,76,77,78,79,80,18,27,36,45,54, 9,56,55,63], [64, 1,65,72,74,75,76,77,78,79,80,19,28,37,46,54,55,56,10,63], [64,65, 2,75,72,73,11,76,77,78,79,80,20,29,38,47,54,55,56,63], [66, 3,68,72,73,74,12,77,78,79,80,67,21,30,39,48,76,57,58,59], [66,67, 4,72,73,74,75,77,78,79,80,22,68,31,40,49,57,58,59,13], [66,67,68, 5,72,73,74,75,76,78,79,80,14,23,32,41,50,57,58,59], [69, 6,71,72,73,74,75,76,77,79,80,24,15,33,70,42,51,60,61,62], [69,70, 7,72,73,74,75,76,77,78,16,25,71,80,34,43,52,60,61,62], [69,70,71,72,73,74,75,76,77,78,79,17,26,35,44, 8,53,60,61,62]]; function get_chunks() { return [ [ 0, 1, 2, 3, 4, 5, 6, 7, 8], //rows [ 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], [ 0, 9, 18, 27, 36, 45, 54, 63, 72], //cols [ 1, 10, 19, 28, 37, 46, 55, 64, 73], [ 2, 11, 20, 29, 38, 47, 56, 65, 74], [ 3, 12, 21, 30, 39, 48, 57, 66, 75], [ 4, 13, 22, 31, 40, 49, 58, 67, 76], [ 5, 14, 23, 32, 41, 50, 59, 68, 77], [ 6, 15, 24, 33, 42, 51, 60, 69, 78], [ 7, 16, 25, 34, 43, 52, 61, 70, 79], [ 8, 17, 26, 35, 44, 53, 62, 71, 80], [ 0, 1, 2, 9, 10, 11, 18, 19, 20], //blocks [ 3, 4, 5, 12, 13, 14, 21, 22, 23], [ 6, 7, 8, 15, 16, 17, 24, 25, 26], [27, 28, 29, 36, 37, 38, 45, 46, 47], [30, 31, 32, 39, 40, 41, 48, 49, 50], [33, 34, 35, 42, 43, 44, 51, 52, 53], [54, 55, 56, 63, 64, 65, 72, 73, 74], [57, 58, 59, 66, 67, 68, 75, 76, 77], [60, 61, 62, 69, 70, 71, 78, 79, 80] ]; } //returns conflict length, if == 0, then no conflicts function check_for_conflict() { //remove previous conflict first for (i=0; i>= 1; } $("#cand" + i).text(str); } } function update_layout_with_new_steps() { //check if steps var values = g_init_values.clone(); var i = 0; for (i=0; i= g_replay_steps.length)); $("#steps_prev").attr('disabled', (index+2 <= 0)); } function set_steps_and_result(gate_result, steps) { g_replay_steps = steps.clone(); var html = ''; for (var i=0; i'; html += (i/2+1) + '步 : #' + cellid2str(steps[i]) + '=' + steps[i+1] + ''; } $("#steps").html(html); $("#steps").val(steps.length - 2); set_replay_index(steps.length - 2); $("#steps_next").click(function(){ var new_index = parseInt($("#steps").val(), 10) + 2; $("#steps").val(new_index); set_replay_index(new_index); }); $("#steps_prev").click(function(){ var new_index = parseInt($("#steps").val(), 10) - 2; $("#steps").val(new_index); set_replay_index(new_index); }); $("#steps").change(function(){ set_replay_index(parseInt($("#steps").val(), 10)); }); } //---------------init------------------------------- function init() { var d = new Date(); g_time_tag = d.getTime(); g_steps_back = []; //g_steps = []; //g_init_values = []; g_locked = false; var gatenumobj = document.getElementById("select_gate_number"); if (gatenumobj) { //快速选关 $(gatenumobj).keydown(function(eve){ var target_id = parseInt($(gatenumobj).val(), 10); if (eve.target != this) return; if (eve.keyCode == 13) window.location.href = '/youxi/sudoku/' + target_id + "/"; }); $("#select_gate_button").click(function(eve){ var target_id = parseInt($(gatenumobj).val(), 10); window.location.href = '/youxi/sudoku/' + target_id + "/"; }); } //set the sound manager swf file position //NOTE the trailing slash is REQUIRED! soundManager.url = '/static/flash/'; soundManager.debugMode = false; soundManager.flashVersion = 9; var sounds = [ "hover", "move", "nomove", "reset", "restore", "save", "msg", "win" ]; soundManager.onload = function() { for (var i=0; i= '1' && ch <= '9') { layout += ch; } } if (layout.length != 81) { alert("必须是81个数,现在是" + layout.length + "个!"); return; } //let's refresh the cells $("#canvas").attr('tag', layout); var values = []; for (i=0; i 71) { alert("有" + fixed_count + "个确定数,题目太简单了吧!"); return; } //let's do calculation $("#calcgate").attr("disabled", "true"); $.ajax({ type: "POST", url: "/youxi/sudoku/add/", data: {'layout':layout}, success: function(msg){ $("#calcgate").removeAttr("disabled"); if (msg.length <= 0) { alert("自动求解失败,请仔细检查布局是否合理或联系管理员"); return; } if (msg.charAt(0) != "{") { alert(msg); return; } eval("var result=" + msg); if (result.solution_count == 2) { alert("自动求解成功,有两个解,不是有效的数独布局!"); $("#solution2").show(); } else { alert("自动求解成功,该布局难度指数:" + result.level + "!\n如果您觉得该布局不错,欢迎提交!"); $("#submitgate").show(); $("#solution2").hide(); } $("#solutions").show(); $("#solution1").text("解1:" + result.solution1); $("#solution2").text("解2:" + result.solution2); soundManager.play("move"); set_steps_and_result(result.solution1, result.steps1); }, error: function(msg){ $("#calcgate").removeAttr("disabled"); } }); } function layout_changed() { $("#calcgate").hide(); $("#solutions").hide(); $("#submitgate").hide(); $("#tick").hide(); } function submit_gate() { var layout = $("#canvas").attr('tag'); $("#submitgate").attr("disabled", "true"); $.ajax({ type: "POST", url: "/youxi/sudoku/add/", data: {'layout':layout, 'action':'add'}, success: function(msg){ $("#submitgate").removeAttr("disabled"); if (msg.length <= 0) { alert("提交布局失败,请仔细检查布局是否合理或联系管理员"); return; } alert(msg); soundManager.play("move"); }, error: function(msg){ $("#submitgate").removeAttr("disabled"); } }); } function init_add_page() { g_locked = true; $("#updatelayout").click(update_layout); $("#calcgate").click(calc_gate); $("#submitgate").click(submit_gate); $("#layoutbox").keydown(layout_changed); $("#layoutbox").change(layout_changed); update_cell_candidates(); disable_right_menu_on_cells(); }