-
Notifications
You must be signed in to change notification settings - Fork 52
/
Copy pathmaze_creator.js
95 lines (86 loc) · 2.67 KB
/
maze_creator.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
// This is a test program to create so much objects. (Cells = V8Variant)
// ( HEIGHT = 20, WIDTH = 30 )
var win32ole = require('win32ole');
win32ole.print('maze_creator\n');
console.log(win32ole.version());
var path = require('path');
var cwd = path.join(win32ole.MODULEDIRNAME, '..');
var fs = require('fs');
var tmpdir = path.join(cwd, 'test/tmp');
if(!fs.existsSync(tmpdir)) fs.mkdirSync(tmpdir);
var mazefile = path.join(tmpdir, 'maze_sample.xls');
// These parameters must be same as maze_solver.js
// colors 1: K 2: W 3: R 4: G 5: B 6: Y 7: M 8: C
var HEIGHT = 20, WIDTH = 30, OFFSET_ROW = 2, OFFSET_COL = 2;
var MAX_ROW = OFFSET_ROW + HEIGHT - 1, MAX_COL = OFFSET_COL + WIDTH - 1;
var sheet = null;
var mat = function(r, c){
return sheet.Cells(OFFSET_ROW + r, OFFSET_COL + c);
};
var isPassed = function(r, c){
try{
return mat(r, c).Interior.ColorIndex != 6 // Y
}catch(e){
return true;
}
};
var isDeadend = function(r, c){
for(var d = 0; d < 4; ++d){
var dr = d == 3 ? 1 : d == 2 ? -1 : 0;
var dc = d == 1 ? 1 : d == 0 ? -1 : 0;
if(!isPassed(r + dr, c + dc)) return false;
}
return true;
};
var drawWall = function(r, c, dlist){
var e = mat(r, c);
for(var d = 0; d < 4; ++d)
if(dlist[d] == 0) e.Borders(1 + d).Weight = 2;
};
var dig = function(r, c, direc, count){
var dlist = [0, 0, 0, 0];
if(direc >= 0) dlist[[1, 0, 3, 2][direc]] = 1;
mat(r, c).Interior.ColorIndex = 4; // G
if(--count == 0) return drawWall(r, c, dlist);
while(true){
if(isDeadend(r, c)) return drawWall(r, c, dlist);
var d = Math.floor(Math.random() * 4);
var dr = d == 3 ? 1 : d == 2 ? -1 : 0;
var dc = d == 1 ? 1 : d == 0 ? -1 : 0;
if(!isPassed(r + dr, c + dc)){
dlist[d] = 1;
dig(r + dr, c + dc, d, count);
}
}
};
var maze_excel_ole = function(filename){
var xl = win32ole.client.Dispatch('Excel.Application');
xl.Visible = true;
var book = xl.Workbooks.Add();
// This code uses variable sheet as global
sheet = book.Worksheets(1);
try{
sheet.Name = 'maze';
sheet.Cells(1, 2).Value = 'maze';
var rg = sheet.Range(
sheet.Cells(OFFSET_ROW, OFFSET_COL), sheet.Cells(MAX_ROW, MAX_COL));
rg.RowHeight = 5.18;
rg.ColumnWidth = 0.58;
rg.Interior.ColorIndex = 6; // Yellow
// Math.random() seed is automatically set
dig(HEIGHT - 1, WIDTH - 1, -1, WIDTH * HEIGHT);
console.log('saving to: "' + filename + '" ...');
var result = book.SaveAs(filename);
console.log(result);
}catch(e){
console.log('(exception cached)\n' + e);
}
xl.ScreenUpdating = true;
xl.Workbooks.Close();
xl.Quit();
};
try{
maze_excel_ole(mazefile);
}catch(e){
console.log('*** exception cached ***\n' + e);
}