Sudoku creator/solver with AS3
At the beginning of this month I published the Sudoku creator/solver with PHP.
Now, after a little hassle due to a strange way AS3 manages arrays (in my opinion), I am ready to post the AS3 version of the solver.
This is what you will get
Results may vary if you don’t have Lucida Console font installed in your system, anyway the complete solved sudoku is in the sudoku array, so feel free to modify the code in order to display the sudoku in a more eye catching way.
Here it is the script:
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 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 | package { import flash.display.Sprite; import flash.text.*; public class sudoku extends Sprite { public function sudoku() { var sudoku = new Array(0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0); solve(sudoku); } function return_row(cell) { return Math.floor(cell / 9); } function return_col(cell) { return cell % 9; } function return_block(cell) { return Math.floor(return_row(cell) / 3) * 3 + Math.floor(return_col(cell) / 3); } function is_possible_row(number,row,sudoku) { var possible = true; for (var i=0; i<=8; i++) { if (sudoku[row*9+i] == number) { possible = false; break; } } return possible; } function is_possible_col(number,col,sudoku) { var possible = true; for (var i=0; i<=8; i++) { if (sudoku[col+9*i] == number) { possible = false; break; } } return possible; } function is_possible_block(number,block,sudoku) { var possible = true; for (var i=0; i<=8; i++) { if (sudoku[Math.floor(block/3)*27+i%3+9*Math.floor(i/3)+3*(block%3)] == number) { possible = false; break; } } return possible; } function is_possible_number(cell,number,sudoku) { var row = return_row(cell); var col = return_col(cell); var block = return_block(cell); return is_possible_row(number,row,sudoku) && is_possible_col(number,col,sudoku) && is_possible_block(number,block,sudoku); } function is_correct_row(row,sudoku) { var right_sequence = new Array(1,2,3,4,5,6,7,8,9); var row_temp= new Array(); for (var i=0; i<=8; i++) { row_temp[i] = sudoku[row*9+i]; } row_temp.sort(); return row_temp.join() == right_sequence.join(); } function is_correct_col(col,sudoku) { var right_sequence = new Array(1,2,3,4,5,6,7,8,9); var col_temp= new Array(); for (var i=0; i<=8; i++) { col_temp[i] = sudoku[col+i*9]; } col_temp.sort(); return col_temp.join() == right_sequence.join(); } function is_correct_block(block,sudoku) { var right_sequence = new Array(1,2,3,4,5,6,7,8,9); var block_temp= new Array(); for (var i=0; i<=8; i++) { block_temp[i] = sudoku[Math.floor(block/3)*27+i%3+9*Math.floor(i/3)+3*(block%3)]; } block_temp.sort(); return block_temp.join() == right_sequence.join(); } function is_solved_sudoku(sudoku) { for (var i=0; i<=8; i++) { if (!is_correct_block(i,sudoku) || !is_correct_row(i,sudoku) || !is_correct_col(i,sudoku)) { return false; } } return true; } function determine_possible_values(cell,sudoku) { var possible = new Array(); for (var i=1; i<=9; i++) { if (is_possible_number(cell,i,sudoku)) { possible.unshift(i); } } return possible; } function determine_random_possible_value(possible,cell) { var random_picked = Math.floor(Math.random() * possible[cell].length); return possible[cell][random_picked]; } function scan_sudoku_for_unique(sudoku) { var possible = new Array(); for (var i=0; i<=80; i++) { if (sudoku[i] == 0) { possible[i] = new Array(); possible[i] = determine_possible_values(i,sudoku); if (possible[i].length==0) { return false; } } } return possible; } function remove_attempt(attempt_array,number) { var new_array = new Array(); for (var i=0; i<attempt_array.length; i++) { if (attempt_array[i] != number) { new_array.unshift(attempt_array[i]); } } return new_array; } function next_random(possible) { var mai = 9; var min_choices = 0; for (var i=0; i<=80; i++) { if (possible[i]!=undefined) { if ((possible[i].length<=mai) && (possible[i].length>0)) { mai = possible[i].length; min_choices = i; } } } return min_choices; } function show_sudoku(sudoku,i) { var sudokutext:TextField = new TextField(); var format:TextFormat = new TextFormat(); var solved = "\n\nSolved in "+i+" steps"; format.font = "Lucida Console"; sudokutext.width = 250; sudokutext.height = 250; sudokutext.defaultTextFormat = format; sudokutext.x = 25; sudokutext.y = 25; addChild(sudokutext); for (var i=0; i<=8; i++) { for (var j=0; j<=8; j++) { sudokutext.appendText(" "); sudokutext.appendText(sudoku[i*9+j]); sudokutext.appendText(" "); if (j!=8) { sudokutext.appendText("|"); } } if (i!=8) { sudokutext.appendText("\n---+---+---+---+---+---+---+---+---\n"); } } sudokutext.appendText(solved); } function solve(sudoku) { var saved = new Array(); var saved_sud = new Array(); var i=0; var next_move; var what_to_try; var attempt; while (!is_solved_sudoku(sudoku)) { i+=1; next_move = scan_sudoku_for_unique(sudoku); if (next_move == false) { next_move = saved.pop(); sudoku = saved_sud.pop(); } what_to_try = next_random(next_move); attempt = determine_random_possible_value(next_move,what_to_try); if (next_move[what_to_try].length>1) { next_move[what_to_try] = remove_attempt(next_move[what_to_try],attempt); saved.push(next_move.slice()); saved_sud.push(sudoku.slice()); } sudoku[what_to_try] = attempt; } show_sudoku(sudoku,i); } } } |
Download the source code and let’s make soduku popular once again.
» Flash Templates provided by Template Monster are pre-made web design products developed using Flash technology.
They can be easily customized to meet the unique requirements of your project.
They can be easily customized to meet the unique requirements of your project.
2 Responses to “Sudoku creator/solver with AS3”
Leave a Reply
- Citrus Engine released for free for learning
- My epic fail with ClickBank
- Get up to $100,000 for your next Flash game with Mochi GAME Developer Fund
- Create a dynamic content animated footer ad for your site in just 9 jQuery lines – 17 lines version
- Sell sitelocked version of your Flash games and even .fla sources to Free Online Games
- Protect your work from ActionScript code theft with SWF Protector
- Create a dynamic content animated footer ad for your site in just 9 jQuery lines
- Understanding Box2D’s one-way platforms, aka CLOUDS
- Triqui MochiAds Arcade plugin for WordPress upgraded to 1.2
- Box2D Flash game creation tutorial – part 2
- Create a Lightbox effect only with CSS - no javascript needed
- Flash game creation tutorial - part 1
- Create a Flash Racing Game Tutorial
- Flash game creation tutorial - part 2
- Make a Flash game like Flash Element Tower Defense - Part 2
- Flash game creation tutorial - part 3
- Triqui MochiAds Arcade plugin for WordPress official page
- Make a Flash game like Flash Element Tower Defense - Part 1
- Create a flash draw game like Line Rider or others - part 1
- Create a flash artillery game - step 1
- Flash game creation tutorial – part 5.2 (4.88/5)
- Create a flash artillery game – step 1 (4.79/5)
- Create a Flash Racing Game Tutorial (4.76/5)
- Create a survival horror game in Flash tutorial – part 1 (4.74/5)
- Create a flash artillery game – step 2 (4.74/5)
- Creation of a Flash arcade site using WordPress – step 2 (4.73/5)
- Flash game creation tutorial – part 1 (4.71/5)
- Flash game creation tutorial – part 2 (4.71/5)
- Create a flash draw game like Line Rider or others – part 1 (4.69/5)
- Creation of a platform game with Flash – step 2 (4.68/5)

(8 votes, average: 4.63 out of 5)



Popular again? I never knew it had lost popularity…
Nice class… what license is it distributed under?