l think l complete the structre of project
This commit is contained in:
parent
e54ed42e3d
commit
c8bc135c86
215
maze/maze.go
215
maze/maze.go
|
@ -2,6 +2,7 @@ package maze
|
|||
|
||||
import (
|
||||
"bufio"
|
||||
"log"
|
||||
"strconv"
|
||||
"strings"
|
||||
)
|
||||
|
@ -9,130 +10,166 @@ import (
|
|||
type Maze struct {
|
||||
antCount int
|
||||
rooms []Room
|
||||
startRoom string
|
||||
endRoom string
|
||||
}
|
||||
|
||||
type Room struct {
|
||||
connections []Room
|
||||
distance int
|
||||
|
||||
name string
|
||||
occupancies int
|
||||
|
||||
isEnd bool
|
||||
}
|
||||
|
||||
// Load method to load the maze from input
|
||||
func Load(inputStream *bufio.Reader) *Maze {
|
||||
|
||||
maze := &Maze{}
|
||||
|
||||
// first line (ant count)
|
||||
// Read ant count
|
||||
line, err := inputStream.ReadString('\n')
|
||||
if (err != nil || len(line) == 0) {
|
||||
if err != nil || len(line) == 0 {
|
||||
return nil
|
||||
}
|
||||
maze.antCount, err = strconv.Atoi(strings.TrimSpace(line))
|
||||
if err != nil {
|
||||
return nil
|
||||
}
|
||||
|
||||
maze.antCount, err = strconv.Atoi(line[:len(line)-1])
|
||||
if (err != nil) {
|
||||
// Load rooms and connections
|
||||
for {
|
||||
line, err := inputStream.ReadString('\n')
|
||||
if err != nil || len(line) == 0 {
|
||||
break
|
||||
}
|
||||
line = strings.TrimSpace(line)
|
||||
|
||||
if strings.HasPrefix(line, "##start") {
|
||||
// Read next line to get start room name
|
||||
nextLine, err := inputStream.ReadString('\n')
|
||||
if err != nil {
|
||||
log.Println("Error reading next line after ##start:", err)
|
||||
return nil
|
||||
}
|
||||
parts := strings.Fields(nextLine)
|
||||
if len(parts) > 0 {
|
||||
maze.startRoom = parts[0]
|
||||
log.Println("Start room:", maze.startRoom)
|
||||
// Ensure the start room is loaded as a regular room
|
||||
if !maze.loadRooms(nextLine) {
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
log.Println("Unexpected format for next line after ##start")
|
||||
return nil
|
||||
}
|
||||
continue
|
||||
} else if strings.HasPrefix(line, "##end") {
|
||||
// Read next line to get end room name
|
||||
nextLine, err := inputStream.ReadString('\n')
|
||||
if err != nil {
|
||||
log.Println("Error reading next line after ##end:", err)
|
||||
return nil
|
||||
}
|
||||
parts := strings.Fields(nextLine)
|
||||
if len(parts) > 0 {
|
||||
maze.endRoom = parts[0]
|
||||
log.Println("End room:", maze.endRoom)
|
||||
// Ensure the end room is loaded as a regular room
|
||||
if !maze.loadRooms(nextLine) {
|
||||
return nil
|
||||
}
|
||||
} else {
|
||||
log.Println("Unexpected format for next line after ##end")
|
||||
return nil
|
||||
}
|
||||
continue
|
||||
}
|
||||
|
||||
// second line (##start)
|
||||
line, err = inputStream.ReadString('\n')
|
||||
if (err != nil || len(line) == 0 || line != "##start\n") {
|
||||
if strings.Contains(line, "-") {
|
||||
// Connection line
|
||||
log.Println("Mapping connection:", line)
|
||||
if !maze.mapFarm(line) {
|
||||
return nil
|
||||
}
|
||||
|
||||
if !maze.loadRooms(inputStream) {
|
||||
} else {
|
||||
// Room line
|
||||
log.Println("Loading room:", line)
|
||||
if !maze.loadRooms(line) {
|
||||
return nil
|
||||
}
|
||||
if !maze.mapFarm(inputStream) { // connect rooms and calculate distance
|
||||
return nil
|
||||
}
|
||||
}
|
||||
|
||||
return maze
|
||||
}
|
||||
|
||||
func (maze *Maze) Solve() {
|
||||
|
||||
|
||||
}
|
||||
|
||||
func (maze *Maze) loadRooms(inputStream *bufio.Reader) bool {
|
||||
|
||||
var line string
|
||||
var err error
|
||||
var roomName string
|
||||
|
||||
readName := func() {
|
||||
|
||||
roomName = ""
|
||||
|
||||
line, err = inputStream.ReadString('\n')
|
||||
if err != nil || len(line) == 0 {
|
||||
// print("can't read")
|
||||
return
|
||||
}
|
||||
|
||||
// print(line)
|
||||
|
||||
parts := strings.Split(line[:len(line)-1], " ")
|
||||
func (maze *Maze) loadRooms(line string) bool {
|
||||
// Parse room data
|
||||
parts := strings.Fields(line)
|
||||
if len(parts) != 3 {
|
||||
// println("parts error ", line[:len(line)-1], len(parts))
|
||||
return
|
||||
log.Println("Unexpected format for room line:", line)
|
||||
return false
|
||||
}
|
||||
|
||||
_, err1 := strconv.Atoi(parts[1])
|
||||
_, err2 := strconv.Atoi(parts[2])
|
||||
|
||||
// anti fun measure
|
||||
if err1 != nil || err2 != nil {
|
||||
// print(parts[1], err1 == nil, parts[2], err2 == nil)
|
||||
return
|
||||
}
|
||||
|
||||
roomName = parts[0]
|
||||
}
|
||||
|
||||
|
||||
// first Room
|
||||
readName()
|
||||
if roomName == "" {
|
||||
roomName := parts[0]
|
||||
_, err := strconv.Atoi(parts[1]) // x-coordinate
|
||||
if err != nil {
|
||||
log.Println("Error parsing x-coordinate:", err)
|
||||
return false
|
||||
}
|
||||
|
||||
room := Room{ name: roomName, occupancies: maze.antCount }
|
||||
_, err = strconv.Atoi(parts[2]) // y-coordinate
|
||||
if err != nil {
|
||||
log.Println("Error parsing y-coordinate:", err)
|
||||
return false
|
||||
}
|
||||
|
||||
// Create room
|
||||
room := Room{
|
||||
name: roomName,
|
||||
occupancies: 0,
|
||||
distance: 0,
|
||||
}
|
||||
|
||||
maze.rooms = append(maze.rooms, room)
|
||||
|
||||
// rest of the farm
|
||||
readName()
|
||||
for err == nil {
|
||||
if (line == "##end\n") {
|
||||
// print("end?")
|
||||
maze.rooms[len(maze.rooms)-1].isEnd = true
|
||||
return true
|
||||
|
||||
} else if (roomName == "") {
|
||||
// print("loop empty")
|
||||
return false
|
||||
}
|
||||
|
||||
room = Room{ name: roomName, occupancies: 0 }
|
||||
maze.rooms = append(maze.rooms, room)
|
||||
|
||||
readName()
|
||||
}
|
||||
|
||||
// print("bad exit")
|
||||
return false
|
||||
}
|
||||
|
||||
func (maze *Maze) mapFarm(inputStream *bufio.Reader) bool {
|
||||
|
||||
for _, v := range maze.rooms {
|
||||
println(v.name, v.occupancies, v.isEnd)
|
||||
}
|
||||
|
||||
|
||||
return true
|
||||
}
|
||||
|
||||
func (maze *Maze) mapFarm(line string) bool {
|
||||
// Parse connection data
|
||||
parts := strings.Split(line, "-")
|
||||
if len(parts) != 2 {
|
||||
log.Println("Unexpected format for connection line:", line)
|
||||
return false
|
||||
}
|
||||
room1Name := parts[0]
|
||||
room2Name := parts[1]
|
||||
|
||||
log.Printf("Mapping connection between rooms: %s and %s\n", room1Name, room2Name)
|
||||
|
||||
// Find room objects by name
|
||||
var room1, room2 *Room
|
||||
for i := range maze.rooms {
|
||||
if maze.rooms[i].name == room1Name {
|
||||
room1 = &maze.rooms[i]
|
||||
}
|
||||
if maze.rooms[i].name == room2Name {
|
||||
room2 = &maze.rooms[i]
|
||||
}
|
||||
}
|
||||
|
||||
// Handle if rooms are not found
|
||||
if room1 == nil || room2 == nil {
|
||||
log.Println("Room not found for connection:", line)
|
||||
return false
|
||||
}
|
||||
|
||||
// Establish connection between rooms
|
||||
room1.connections = append(room1.connections, *room2)
|
||||
room2.connections = append(room2.connections, *room1)
|
||||
return true
|
||||
}
|
||||
|
||||
func (maze *Maze) Solve() {
|
||||
log.Println("Solving the maze...")
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue