Before you write a single block of code plan out exactly what you want to do because appending features later on usually breaks working functionality and creates bugs.
When you can't find your way look at aStar like the 3 wise men by using other's work as a reference or template for research into how things are done.
The general way to get a program like this done, would be to break up each operation into smaller bite sized tasks.
- Randomly set start and end at the edge of a rect
- Partially fill the rect with randomly placed obstacles
- Use A* to navigate a path from start to end
- Create rules for how the maze is to be built
- Fill the rect with obstacles using the rules and avoiding the path returned by A*
There will not be a tutorial on how to do everything and so you need to adopt a workflow to save on time for every project you start.