1
0
mirror of https://github.com/MADTeacher/go_basics.git synced 2025-11-23 21:34:47 +02:00
Files
go_basics/part_6/tic_tac_toe_v5/main.go

209 lines
6.8 KiB
Go
Raw Normal View History

2025-06-17 15:48:17 +03:00
package main
import (
"bufio"
"fmt"
"os"
"strconv"
"strings"
"tic-tac-toe/database"
"tic-tac-toe/game"
)
2025-06-18 00:49:37 +03:00
// Загрузка сохраненной игры
2025-06-17 15:48:17 +03:00
func loadGame(reader *bufio.Reader, repository database.IRepository) {
loadedGame := &game.Game{}
for {
fmt.Print("Input your nickname: ")
nickName, _ := reader.ReadString('\n')
nickName = strings.TrimSpace(nickName)
2025-06-18 00:49:37 +03:00
// Получаем все снапшоты игрока
2025-06-17 15:48:17 +03:00
snapshote, err := repository.GetSnapshots(nickName)
if err != nil {
fmt.Println("Error loading game: ", err)
continue
}
// Выводим все снапшоты игрока
fmt.Println("\n═══════════════════ SAVED GAMES ════════════════════")
fmt.Println("┌────────┬────────────────┬─────────┬─────────┬────────────┐")
fmt.Println("│ ID │ Name │ Figure │ Mode │ Difficulty │")
fmt.Println("├────────┼────────────────┼─────────┼─────────┼────────────┤")
if len(*snapshote) == 0 {
fmt.Println("│ │ No saved games found │")
fmt.Println("└────────┴───────────────────────────────────────────────────┘")
} else {
for ID, snapshot := range *snapshote {
// Конвертируем режим игры (0=PvP, 1=PvC) в читаемый текст
gameMode := "PvP"
if snapshot.Mode == 1 {
gameMode = "PvC"
}
// Конвертируем сложность (0=Easy, 1=Medium, 2=Hard) в читаемый текст
difficulty := "-"
if snapshot.Mode == 1 { // Только для режима PvC
switch snapshot.Difficulty {
case 0:
difficulty = "Easy"
case 1:
difficulty = "Medium"
case 2:
difficulty = "Hard"
}
}
// Форматированный вывод с выравниванием колонок
figure := "X"
if snapshot.PlayerFigure == 1 {
figure = "O"
}
name := snapshot.SnapshotName
if name == "" {
name = "Game " + strconv.Itoa(ID)
}
fmt.Printf("│ %-4d │ %-14s │ %-4s │ %-5s │ %-7s │\n",
ID, name, figure, gameMode, difficulty)
}
fmt.Println("└────────┴────────────────┴─────────┴─────────┴────────────┘")
}
2025-06-18 00:49:37 +03:00
// Запрашиваем номер снапшота
2025-06-17 15:48:17 +03:00
snapID := -1
for {
fmt.Print("Enter snapshot number: ")
num, _ := reader.ReadString('\n')
num = strings.TrimSpace(num)
if snapID, _ = strconv.Atoi(num); snapID < 0 || snapID >= len(*snapshote) {
fmt.Println("Invalid snapshot number. Please try again.")
continue
}
break
}
// Восстанавливаем все необходимые поля игры
loadedGame.RestoreFromSnapshot(
&(*snapshote)[snapID], reader,
repository,
)
break
}
// Запускаем игру
loadedGame.Play()
}
2025-06-18 00:49:37 +03:00
// Показать все завершенную игру
func showFinishedGames(
reader *bufio.Reader, repository database.IRepository,
) {
2025-06-17 15:48:17 +03:00
fmt.Print("Enter nickname: ")
nickName, _ := reader.ReadString('\n')
nickName = strings.TrimSpace(nickName)
2025-06-18 00:49:37 +03:00
// Получаем все завершенные игры
2025-06-17 15:48:17 +03:00
finishedGames, err := repository.GetFinishedGames(nickName)
if err != nil {
fmt.Println("Error loading finished games: ", err)
return
}
fmt.Println("\n═══════════════════ FINISHED GAMES ════════════════════")
fmt.Println("┌────────┬─────────┬────────────┬────────────────┐")
fmt.Println("│ ID │ Figure │ Winner │ Date │")
fmt.Println("├────────┼─────────┼────────────┼────────────────┤")
if len(*finishedGames) == 0 {
fmt.Println("│ │ No finished games found │")
fmt.Println("└────────┴───────────────────────────────────────────────┘")
} else {
for ID, game := range *finishedGames {
// Форматированный вывод с выравниванием колонок
figure := "X"
if game.PlayerFigure == 1 {
figure = "O"
}
// Форматируем дату
dateStr := game.Time.Format("02.01 15:04")
fmt.Printf("│ %-4d │ %-4s │ %-8s │ %-13s │\n",
ID,
figure,
game.WinnerName,
dateStr)
}
fmt.Println("└────────┴─────────┴────────────┴────────────────┘")
}
2025-06-18 00:49:37 +03:00
// Запрашиваем номер игры
2025-06-17 15:48:17 +03:00
snapID := -1
for {
fmt.Print("Enter snapshot number: ")
num, _ := reader.ReadString('\n')
num = strings.TrimSpace(num)
if snapID, _ = strconv.Atoi(num); snapID < 0 || snapID >= len(*finishedGames) {
fmt.Println("Invalid snapshot number. Please try again.")
continue
}
break
}
2025-06-18 00:49:37 +03:00
// Выводим выбранную игру
2025-06-17 15:48:17 +03:00
chosenGame := (*finishedGames)[snapID]
chosenGame.Board.PrintBoard()
fmt.Println()
fmt.Println("Winner: ", chosenGame.WinnerName)
fmt.Println("Date: ", chosenGame.Time.Format("02.01.2006 15:04"))
fmt.Println()
}
func main() {
reader := bufio.NewReader(os.Stdin)
repository, err := database.NewSQLiteRepository()
if err != nil {
fmt.Println("Error creating game storage: ", err)
return
}
for {
fmt.Println("Welcome to Tic-Tac-Toe!")
fmt.Println("1 - Load game")
fmt.Println("2 - New game")
fmt.Println("3 - Show all finished games")
fmt.Println("q - Exit")
fmt.Print("Your choice: ")
input, _ := reader.ReadString('\n')
input = strings.TrimSpace(input)
switch input {
case "1": // Загрузка сохраненной игры
loadGame(reader, repository)
case "2": // Создаем новую игру с помощью диалога настройки
newGame := game.SetupGame(reader,
repository)
// Запускаем игру
newGame.Play()
case "3": // Показать все завершенные игры
showFinishedGames(reader, repository)
case "q":
fmt.Println("Goodbye!")
return
default:
fmt.Println("Invalid choice. Please try again.")
}
}
}