@@ -3,6 +3,12 @@ import "./PathFinding.css";
33import Node from "./Node" ;
44import { dijkstra , getNodesInShortestPathOrder } from '../pathfindingAlgos'
55
6+ const start_row = 3 ;
7+ const start_col = 5 ;
8+
9+ const finish_row = 10 ;
10+ const finish_col = 45 ;
11+
612export default class PathFindingVisualiser extends React . Component {
713 constructor ( props ) {
814 super ( props ) ;
@@ -21,8 +27,17 @@ export default class PathFindingVisualiser extends React.Component {
2127 for ( let col = 0 ; col < 50 ; col ++ ) {
2228
2329
24- const currNode = { col, row, isStart : row === 11 && col === 5 , isFinish : row === 10 && col === 45 , distance : Infinity ,
25- isVisited : false , isWall : false , previousNode : null } ;
30+ const currNode = {
31+ col,
32+ row,
33+ isStart : row === start_row && col === start_col ,
34+ isFinish : row === finish_row && col === finish_col ,
35+ distance : Infinity ,
36+ isVisited : false ,
37+ isWall : false ,
38+ previousNode : null ,
39+ visitedDuringMaze : false
40+ } ;
2641
2742 currRow . push ( currNode ) ;
2843
@@ -56,7 +71,6 @@ export default class PathFindingVisualiser extends React.Component {
5671
5772 }
5873
59-
6074 animateShortestPath ( shortestOrder ) {
6175 for ( let i = 0 ; i < shortestOrder . length ; i ++ ) {
6276 setTimeout ( ( ) => {
@@ -67,10 +81,11 @@ export default class PathFindingVisualiser extends React.Component {
6781 }
6882
6983 visualiseDijkstra ( ) {
84+
7085 const grid = this . state . nodes ;
7186
72- const startNode = grid [ 10 ] [ 5 ] ;
73- const destNode = grid [ 10 ] [ 45 ] ;
87+ const startNode = grid [ start_row ] [ start_col ] ;
88+ const destNode = grid [ finish_row ] [ finish_col ] ;
7489
7590 const visitedNodes = dijkstra ( grid , startNode , destNode ) ;
7691
@@ -80,27 +95,113 @@ export default class PathFindingVisualiser extends React.Component {
8095
8196 }
8297
83- handleMouseDown ( row , col ) {
84- console . log ( "down" ) ;
85- const newGrid = getNewGridWithWallToggled ( this . state . nodes , row , col ) ;
98+ handleMouseDown ( row , col , wallStatus ) {
99+ const newGrid = getNewGridWithWallToggled ( this . state . nodes , row , col , wallStatus ) ;
86100 this . setState ( { nodes : newGrid , mouseIsPressed : true } ) ;
87101
88102 }
89103
90- handleMouseEnter ( row , col ) {
91- console . log ( "enter" ) ;
92- if ( ! this . state . mouseIsPressed ) {
104+ handleMouseEnter ( row , col , wallStatus ) {
105+ if ( ! this . state . mouseIsPressed ) {
93106 return ;
94107 }
95- const newGrid = getNewGridWithWallToggled ( this . state . grid , row , col ) ;
96- this . setState ( { grid : newGrid } ) ;
108+ const newGrid = getNewGridWithWallToggled ( this . state . grid , row , col , wallStatus ) ;
109+ this . setState ( { nodes : newGrid } ) ;
97110 }
98111
99112 handleMouseUp ( ) {
100- console . log ( "up" ) ;
101113 this . setState ( { mouseIsPressed : false } ) ;
102114 }
103115
116+ resetWalls ( ) {
117+ const newGrid = this . state . nodes . slice ( ) ;
118+ for ( let i = 0 ; i < 15 ; i ++ ) {
119+ for ( let j = 0 ; j < 50 ; j ++ ) {
120+
121+ const currNode = newGrid [ i ] [ j ]
122+ newGrid [ i ] [ j ] = {
123+ ...currNode ,
124+ isWall : false ,
125+ visitedDuringMaze : false ,
126+ previousNode : null
127+ } ;
128+ }
129+ }
130+
131+ this . setState ( { nodes : newGrid } ) ;
132+ }
133+
134+
135+ generateMaze ( ) {
136+
137+ this . resetWalls ( ) ;
138+
139+ const grid = this . state . nodes . slice ( ) ;
140+
141+ const startNode = grid [ start_row ] [ start_col ] ;
142+ const destNode = grid [ finish_row ] [ finish_col ] ;
143+
144+ dijkstra ( grid , startNode , destNode ) ;
145+
146+ const nodesToAnimate = getNodesInShortestPathOrder ( destNode ) ;
147+
148+ for ( let i = 0 ; i < nodesToAnimate . length ; i ++ ) {
149+
150+ let r = getRndInteger ( 0 , 1 ) ;
151+
152+ if ( r === 1 ) {
153+ let d = getRndInteger ( 0 , 3 ) ;
154+ let row = nodesToAnimate [ i ] . row ;
155+ let col = nodesToAnimate [ i ] . col ;
156+
157+ let r2 ;
158+ let c2 ;
159+
160+ if ( d === 0 ) {
161+ r2 = getRndInteger ( 0 , row ) ;
162+ c2 = getRndInteger ( col , 49 ) ;
163+ } else if ( d === 1 ) {
164+ r2 = getRndInteger ( 0 , row ) ;
165+ c2 = getRndInteger ( 0 , col ) ;
166+ } else if ( d === 2 ) {
167+ r2 = getRndInteger ( row , 14 ) ;
168+ c2 = getRndInteger ( col , 49 ) ;
169+ } else {
170+ r2 = getRndInteger ( row , 14 ) ;
171+ c2 = getRndInteger ( 0 , col ) ;
172+ }
173+
174+ console . log ( [ r2 , c2 ] ) ;
175+
176+ dijkstra ( grid , grid [ row ] [ col ] , grid [ r2 ] [ c2 ] ) ;
177+
178+ const visitedNodes2 = getNodesInShortestPathOrder ( grid [ r2 ] [ c2 ] ) ;
179+
180+ for ( let j = 0 ; j < visitedNodes2 . length ; j ++ ) {
181+ grid [ visitedNodes2 [ j ] . row ] [ visitedNodes2 [ j ] . col ] . isWall = true ;
182+ }
183+
184+ }
185+
186+ grid [ nodesToAnimate [ i ] . row ] [ nodesToAnimate [ i ] . col ] . isWall = true ;
187+ }
188+
189+
190+
191+ for ( let i = 0 ; i < 15 ; i ++ ) {
192+ for ( let j = 0 ; j < 50 ; j ++ ) {
193+
194+ const currNode = grid [ i ] [ j ]
195+ grid [ i ] [ j ] = {
196+ ...currNode ,
197+ isWall : ! currNode . isWall ,
198+ previousNode : null
199+ } ;
200+ }
201+ }
202+ this . setState ( { nodes : grid } ) ;
203+ }
204+
104205 render ( ) {
105206
106207 const nodes2 = this . state . nodes ;
@@ -120,9 +221,9 @@ export default class PathFindingVisualiser extends React.Component {
120221 isStart = { node . isStart }
121222 isFinish = { node . isFinish }
122223 isWall = { node . isWall }
123- mouseIsPressed = { mClicked }
124- onMouseDown = { ( row , col ) => this . handleMouseDown ( row , col ) }
125- onMouseEnter = { ( row , col ) => this . handleMouseEnter ( row , col ) }
224+ mouseIsPressed = { mClicked }
225+ onMouseDown = { ( row , col ) => this . handleMouseDown ( row , col , ! node . isWall ) }
226+ onMouseEnter = { ( row , col ) => this . handleMouseEnter ( row , col , ! node . isWall ) }
126227 onMouseUp = { ( ) => this . handleMouseUp ( ) }
127228
128229 > </ Node > ) }
@@ -132,19 +233,26 @@ export default class PathFindingVisualiser extends React.Component {
132233 } )
133234 }
134235 < button onClick = { ( ) => this . visualiseDijkstra ( ) } > Visualise Dijkstra's</ button >
236+ < button onClick = { ( ) => this . generateMaze ( ) } > Create Maze</ button >
237+ < button onClick = { ( ) => this . resetWalls ( ) } > Reset Walls</ button >
135238 </ div >
136239 ) ;
137240 }
138241
139242}
140243
141244
142- const getNewGridWithWallToggled = ( grid , row , col ) => {
245+ const getNewGridWithWallToggled = ( grid , row , col , wallStatus ) => {
143246 const newGrid = grid . slice ( ) ;
144247 const node = newGrid [ row ] [ col ] ;
145248 newGrid [ row ] [ col ] = {
146249 ...node ,
147- isWall : ! node . isWall ,
250+ isWall : wallStatus ,
148251 } ;
149252 return newGrid ;
150- } ;
253+ } ;
254+
255+
256+ function getRndInteger ( min , max ) {
257+ return Math . floor ( Math . random ( ) * ( max - min + 1 ) ) + min ;
258+ }
0 commit comments