-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapp.go
114 lines (100 loc) · 3.13 KB
/
app.go
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
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"io/ioutil"
)
// サイズを表す構造体
type Size struct {
Rows int // 行数
Cols int // 列数
}
// マップデータ構造体
type MapData struct {
Name string // マップ名
Time int // 残りタイム
Size Size // 行数と列数
Data [][]int // 2次元配列のデータ
Cool Coordinate // キャラクター1の座標
Hot Coordinate // キャラクター2の座標
}
// 座標を保持する構造体
type Coordinate struct {
X, Y int
}
// App 構造体 (アプリケーションロジックをまとめる)
type App struct{}
// NewApp App構造体のインスタンスを返す
func NewApp() *App {
return &App{}
}
// ファイルを読み込んでMapData構造体を生成する関数
func (a *App) GetMapData(filePath string) (*MapData, error) {
file, err := os.Open(filePath)
if err != nil {
return nil, fmt.Errorf("ファイルを開けません: %w", err)
}
defer file.Close()
var mapData MapData
scanner := bufio.NewScanner(file)
for scanner.Scan() {
line := scanner.Text()
if strings.HasPrefix(line, "N:") {
mapData.Name = strings.TrimPrefix(line, "N:")
} else if strings.HasPrefix(line, "T:") {
mapData.Time, _ = strconv.Atoi(strings.TrimPrefix(line, "T:"))
} else if strings.HasPrefix(line, "S:") {
sizeData := strings.TrimPrefix(line, "S:")
sizes := strings.Split(sizeData, ",")
mapData.Size.Cols, _ = strconv.Atoi(sizes[0])
mapData.Size.Rows, _ = strconv.Atoi(sizes[1])
//mapData.Data = make([][]int, mapData.Size.Rows)
//for i := range mapData.Data {
//mapData.Data[i] = make([]int, mapData.Size.Cols)
//}
} else if strings.HasPrefix(line, "D:") {
dataLine := strings.TrimPrefix(line, "D:")
values := strings.Split(dataLine, ",")
row := []int{}
for _, val := range values {
num, err := strconv.Atoi(val)
if err != nil {
return nil, fmt.Errorf("数値変換に失敗: %w", err)
}
row = append(row, num)
}
mapData.Data = append(mapData.Data, row)
} else if strings.HasPrefix(line, "C:") {
coordData := strings.TrimPrefix(line, "C:")
coords := strings.Split(coordData, ",")
mapData.Cool.X, _ = strconv.Atoi(coords[0])
mapData.Cool.Y, _ = strconv.Atoi(coords[1])
} else if strings.HasPrefix(line, "H:") {
coordData := strings.TrimPrefix(line, "H:")
coords := strings.Split(coordData, ",")
mapData.Hot.X, _ = strconv.Atoi(coords[0])
mapData.Hot.Y, _ = strconv.Atoi(coords[1])
}
}
if err := scanner.Err(); err != nil {
return nil, fmt.Errorf("スキャン中にエラーが発生しました: %w", err)
}
return &mapData, nil
}
func (a *App) GetMapList(directory string) ([]string, error) {
files, err := ioutil.ReadDir(directory)
if err != nil {
return nil, fmt.Errorf("ディレクトリの読み込みに失敗しました: %w", err)
}
// マップファイル一覧を格納
var mapFiles []string
for _, file := range files {
if !file.IsDir() && strings.HasSuffix(file.Name(), ".map") {
mapFiles = append(mapFiles, file.Name())
}
}
return mapFiles, nil
}