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.

Rate this post: 1 Star2 Stars3 Stars4 Stars5 Stars (7 votes, average: 4.57 out of 5)
Loading ... Loading ...
If you found this post useful, please consider a small donation.
» 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.

2 Responses to “Sudoku creator/solver with AS3”

  1. dVyper on December 28th, 2008 3:29 pm

    Popular again? I never knew it had lost popularity…

  2. Philip Seyfi on March 15th, 2009 10:32 pm

    Nice class… what license is it distributed under?

Leave a Reply




Posts