-
Notifications
You must be signed in to change notification settings - Fork 4
Expand file tree
/
Copy pathgenWorld.ts
More file actions
125 lines (103 loc) · 3.44 KB
/
genWorld.ts
File metadata and controls
125 lines (103 loc) · 3.44 KB
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
import readline = require("readline");
export class WorldNode{
public val: number;
public isWall: boolean;
public up: WorldNode | null = null;
public down: WorldNode | null = null;
public left: WorldNode | null = null;
public right: WorldNode | null = null;
constructor(num:number){
this.val = num;
}
}
export function genWorld(){
return new Promise<WorldNode[][]>((resolve, reject)=>{
queryUser("How many rows would you like?").then((response)=>{
let totalRows = parseInt(response);
queryUser("How many columns would you like?").then((colRes)=>{
let totalColumns = parseInt(colRes);
let rowArr: WorldNode[][] = [];
for(let i = 0; i<totalRows; i++){
let row: WorldNode[] = [];
rowArr.push(row);
for(let k = 0; k<totalColumns; k++){ //1 //2
let newNode = new WorldNode((k+1)+(i*totalColumns));
if(rowArr[i-1]){
newNode.up = rowArr[i-1][k];
rowArr[i-1][k].down = newNode;
}
if(k>=1){
newNode.left = rowArr[i][k-1];
rowArr[i][k-1].right = newNode;
}
row.push(newNode);
}
}
console.log("Here's your world:");
logWorld(rowArr);
chooseWalls(rowArr).then(()=>{
resolve(rowArr);
});
})
})
})
}
function getRandomInt(min:number, max:number) {
return Math.floor(Math.random() * (max - min + 1)) + min;
}
function logWorld(world:WorldNode[][]){
for(let i = 0; i<world.length; i++){
let loggedStr = "";
for(let k = 0; k<world[i].length-1; k++){
if(world[i][k].isWall){
loggedStr += `|${world[i][k].val}|--`;
}else{
loggedStr += `{${world[i][k].val}}--`;
}
}
if(world[i][world[i].length-1].isWall){
loggedStr += `|${world[i][world[i].length-1].val}|`;
}else{
loggedStr += `{${world[i][world[i].length-1].val}}`;
}
console.log(loggedStr);
}
}
export function queryUser(question:string){
return new Promise<string>((resolve, reject)=>{
const rl = readline.createInterface({
input: process.stdin,
output: process.stdout
});
rl.question(question+"\n", (answer) => {
resolve(answer);
rl.close();
});
})
}
function chooseWalls(world:WorldNode[][]){
return new Promise<any>((resolve, reject)=>{
function ask(){
queryUser("Where would you like to place a wall? (number or 'done' for no more walls)").then((answer)=>{
if(answer=='done'){
resolve();
}else{
placeWalls(parseInt(answer), world);
ask();
}
})
}
ask();
})
}
function placeWalls(place:number, world: WorldNode[][]){
for(let i = 0; i < world.length; i++){
for(let j = 0; j<world[i].length; j++){
if(world[i][j].val == place){
world[i][j].isWall = true;
logWorld(world);
return;
}
}
}
}