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.")
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|