mirror of
https://github.com/MADTeacher/go_basics.git
synced 2025-11-23 21:34:47 +02:00
114 lines
2.0 KiB
Go
114 lines
2.0 KiB
Go
package board
|
|
|
|
import (
|
|
"fmt"
|
|
)
|
|
|
|
const (
|
|
BoardDefaultSize int = 3
|
|
BoardMinSize int = 3
|
|
BoardMaxSize int = 9
|
|
)
|
|
|
|
type Board struct {
|
|
Board [][]BoardField `json:"board"`
|
|
Size int `json:"size"`
|
|
}
|
|
|
|
func NewBoard(size int) *Board {
|
|
board := make([][]BoardField, size)
|
|
for i := range board {
|
|
board[i] = make([]BoardField, size)
|
|
}
|
|
return &Board{Board: board, Size: size}
|
|
}
|
|
|
|
// Отображение игрового поля
|
|
func (b *Board) PrintBoard() {
|
|
fmt.Print(" ")
|
|
for i := range b.Size {
|
|
fmt.Printf("%d ", i+1)
|
|
}
|
|
fmt.Println()
|
|
for i := range b.Size {
|
|
fmt.Printf("%d ", i+1)
|
|
for j := range b.Size {
|
|
switch b.Board[i][j] {
|
|
case Empty:
|
|
fmt.Print(". ")
|
|
case Cross:
|
|
fmt.Print("X ")
|
|
case Nought:
|
|
fmt.Print("O ")
|
|
}
|
|
}
|
|
fmt.Println()
|
|
}
|
|
}
|
|
|
|
// Проверка возможности и выполнения хода
|
|
func (b *Board) makeMove(x, y int) bool {
|
|
return b.Board[x][y] == Empty
|
|
}
|
|
|
|
func (b *Board) SetSymbol(x, y int, player BoardField) bool {
|
|
if b.makeMove(x, y) {
|
|
b.Board[x][y] = player
|
|
return true
|
|
}
|
|
return false
|
|
}
|
|
|
|
// Проверка выигрыша
|
|
func (b *Board) CheckWin(player BoardField) bool {
|
|
// Проверка строк и столбцов
|
|
for i := range b.Size {
|
|
rowWin, colWin := true, true
|
|
for j := range b.Size {
|
|
if b.Board[i][j] != player {
|
|
rowWin = false
|
|
}
|
|
if b.Board[j][i] != player {
|
|
colWin = false
|
|
}
|
|
}
|
|
if rowWin || colWin {
|
|
return true
|
|
}
|
|
}
|
|
|
|
// Главная диагональ
|
|
mainDiag := true
|
|
for i := range b.Size {
|
|
if b.Board[i][i] != player {
|
|
mainDiag = false
|
|
break
|
|
}
|
|
}
|
|
if mainDiag {
|
|
return true
|
|
}
|
|
|
|
// Побочная диагональ
|
|
antiDiag := true
|
|
for i := range b.Size {
|
|
if b.Board[i][b.Size-i-1] != player {
|
|
antiDiag = false
|
|
break
|
|
}
|
|
}
|
|
return antiDiag
|
|
}
|
|
|
|
// Проверка на ничью
|
|
func (b *Board) CheckDraw() bool {
|
|
for i := range b.Size {
|
|
for j := range b.Size {
|
|
if b.Board[i][j] == Empty {
|
|
return false
|
|
}
|
|
}
|
|
}
|
|
return true
|
|
}
|