export board, convert to lib
This commit is contained in:
parent
4653dfc614
commit
a501f1ec53
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
import "testing"
|
||||
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Code generated by "enumer -type=Colour"; DO NOT EDIT.
|
||||
|
||||
//
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"errors"
|
||||
|
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
50
game.go
50
game.go
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"errors"
|
||||
@ -31,24 +31,24 @@ const (
|
||||
|
||||
//Game represents general game state
|
||||
type Game struct {
|
||||
board *Board
|
||||
Board *Board
|
||||
state GameState
|
||||
}
|
||||
|
||||
//NewGame creates a new game and sets the state to lobby
|
||||
func NewGame() *Game {
|
||||
return &Game{
|
||||
board: NewBoard(8),
|
||||
Board: NewBoard(8),
|
||||
state: gameLobby,
|
||||
}
|
||||
}
|
||||
|
||||
func (g *Game) String() string {
|
||||
var board string
|
||||
for i := 0; i < g.board.size; i++ {
|
||||
for i := 0; i < g.Board.size; i++ {
|
||||
board = board + "|"
|
||||
for j := 0; j < g.board.size; j++ {
|
||||
board = board + g.board.board[i][j].String()
|
||||
for j := 0; j < g.Board.size; j++ {
|
||||
board = board + g.Board.board[i][j].String()
|
||||
}
|
||||
board = board + "|\n"
|
||||
}
|
||||
@ -61,20 +61,20 @@ func (g *Game) Parse(p Player, cmd *RawCommand) (*ParsedCommand, error) {
|
||||
if g.state != gameTurnRed && g.state != gameTurnBlue {
|
||||
return nil, errors.New("game has not started")
|
||||
}
|
||||
if !g.board.validatePoint(cmd.srcX, cmd.srcY) || !g.board.validatePoint(cmd.dstX, cmd.dstY) {
|
||||
if !g.Board.validatePoint(cmd.srcX, cmd.srcY) || !g.Board.validatePoint(cmd.dstX, cmd.dstY) {
|
||||
return nil, errors.New("invalid location in command")
|
||||
}
|
||||
if (p.Colour() == Red && g.state != gameTurnRed) || (p.Colour() == Blue && g.state != gameTurnBlue) {
|
||||
return nil, errors.New("not your turn")
|
||||
}
|
||||
start, err := g.board.GetPiece(cmd.srcX, cmd.srcY)
|
||||
start, err := g.Board.GetPiece(cmd.srcX, cmd.srcY)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
if cmd.act != "-" && cmd.act != "x" {
|
||||
return nil, errors.New("invalid command action")
|
||||
}
|
||||
end, err := g.board.GetPiece(cmd.dstX, cmd.dstY)
|
||||
end, err := g.Board.GetPiece(cmd.dstX, cmd.dstY)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -124,13 +124,13 @@ func (g *Game) SetupPiece(x, y int, p *Piece) (bool, error) {
|
||||
if p == nil {
|
||||
return false, errors.New("Tried to setup a nil piece")
|
||||
}
|
||||
if !g.board.validatePoint(x, y) {
|
||||
if !g.Board.validatePoint(x, y) {
|
||||
return false, errors.New("Invalid location")
|
||||
}
|
||||
if p.Owner != g.board.GetColor(x, y) {
|
||||
return false, fmt.Errorf("Can't setup piece on enemy board: %v != %v", p.Owner, g.board.GetColor(x, y))
|
||||
if p.Owner != g.Board.GetColor(x, y) {
|
||||
return false, fmt.Errorf("Can't setup piece on enemy board: %v != %v", p.Owner, g.Board.GetColor(x, y))
|
||||
}
|
||||
return g.board.Place(x, y, p)
|
||||
return g.Board.Place(x, y, p)
|
||||
}
|
||||
|
||||
//Start start the game
|
||||
@ -143,11 +143,11 @@ func (g *Game) Start() bool {
|
||||
}
|
||||
|
||||
func (g *Game) move(x, y, s, t int) (bool, error) {
|
||||
startPiece, err := g.board.GetPiece(x, y)
|
||||
startPiece, err := g.Board.GetPiece(x, y)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
endPiece, err := g.board.GetPiece(s, t)
|
||||
endPiece, err := g.Board.GetPiece(s, t)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -158,12 +158,12 @@ func (g *Game) move(x, y, s, t int) (bool, error) {
|
||||
return false, nil
|
||||
}
|
||||
//attempt to remove starting piece first
|
||||
err = g.board.Remove(x, y)
|
||||
err = g.Board.Remove(x, y)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
// then place piece in new location
|
||||
res, err := g.board.Place(s, t, startPiece)
|
||||
res, err := g.Board.Place(s, t, startPiece)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -171,11 +171,11 @@ func (g *Game) move(x, y, s, t int) (bool, error) {
|
||||
}
|
||||
|
||||
func (g *Game) strike(x, y, s, t int) (bool, error) {
|
||||
startPiece, err := g.board.GetPiece(x, y)
|
||||
startPiece, err := g.Board.GetPiece(x, y)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
endPiece, err := g.board.GetPiece(s, t)
|
||||
endPiece, err := g.Board.GetPiece(s, t)
|
||||
if err != nil {
|
||||
return false, err
|
||||
}
|
||||
@ -203,30 +203,30 @@ func (g *Game) strike(x, y, s, t int) (bool, error) {
|
||||
switch r {
|
||||
case -1:
|
||||
//startPiece lost
|
||||
err = g.board.Remove(x, y)
|
||||
err = g.Board.Remove(x, y)
|
||||
if err != nil {
|
||||
return true, err
|
||||
}
|
||||
case 0:
|
||||
//tie
|
||||
err = g.board.Remove(x, y)
|
||||
err2 := g.board.Remove(s, t)
|
||||
err = g.Board.Remove(x, y)
|
||||
err2 := g.Board.Remove(s, t)
|
||||
if err != nil || err2 != nil {
|
||||
return true, fmt.Errorf("Errors: %v %v", err, err2)
|
||||
}
|
||||
case 1:
|
||||
//endPiece lost
|
||||
err := g.board.Remove(s, t)
|
||||
err := g.Board.Remove(s, t)
|
||||
if err != nil {
|
||||
return true, err
|
||||
}
|
||||
//scouts replace the piece that was destroyed
|
||||
if startPiece.Rank == Scout {
|
||||
err = g.board.Remove(x, y)
|
||||
err = g.Board.Remove(x, y)
|
||||
if err != nil {
|
||||
return true, err
|
||||
}
|
||||
res, err := g.board.Place(s, t, startPiece)
|
||||
res, err := g.Board.Place(s, t, startPiece)
|
||||
if err != nil {
|
||||
return true, err
|
||||
}
|
||||
|
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"errors"
|
||||
@ -8,7 +8,7 @@ import (
|
||||
|
||||
func dummyMiniGame() (*Game, error) {
|
||||
g := &Game{
|
||||
board: NewBoard(4),
|
||||
Board: NewBoard(4),
|
||||
state: gameSetup,
|
||||
}
|
||||
//Setup terrain
|
||||
@ -19,7 +19,7 @@ func dummyMiniGame() (*Game, error) {
|
||||
{2, 2, 1},
|
||||
}
|
||||
for _, tt := range terrain {
|
||||
res, err := g.board.AddTerrain(tt.x, tt.y, tt.t)
|
||||
res, err := g.Board.AddTerrain(tt.x, tt.y, tt.t)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
|
206
input.go
206
input.go
@ -1,206 +0,0 @@
|
||||
package main
|
||||
|
||||
import (
|
||||
"github.com/hajimehoshi/ebiten/v2"
|
||||
"github.com/hajimehoshi/ebiten/v2/inpututil"
|
||||
)
|
||||
|
||||
// Dir represents a direction.
|
||||
type Dir int
|
||||
|
||||
// represents the valid directions
|
||||
const (
|
||||
DirUp Dir = iota
|
||||
DirRight
|
||||
DirDown
|
||||
DirLeft
|
||||
)
|
||||
|
||||
type mouseState int
|
||||
|
||||
const (
|
||||
mouseStateNone mouseState = iota
|
||||
mouseStatePressing
|
||||
mouseStateSettled
|
||||
)
|
||||
|
||||
type touchState int
|
||||
|
||||
const (
|
||||
touchStateNone touchState = iota
|
||||
touchStatePressing
|
||||
touchStateSettled
|
||||
touchStateInvalid
|
||||
)
|
||||
|
||||
// String returns a string representing the direction.
|
||||
func (d Dir) String() string {
|
||||
switch d {
|
||||
case DirUp:
|
||||
return "Up"
|
||||
case DirRight:
|
||||
return "Right"
|
||||
case DirDown:
|
||||
return "Down"
|
||||
case DirLeft:
|
||||
return "Left"
|
||||
}
|
||||
panic("not reach")
|
||||
}
|
||||
|
||||
// Vector returns a [-1, 1] value for each axis.
|
||||
func (d Dir) Vector() (x, y int) {
|
||||
switch d {
|
||||
case DirUp:
|
||||
return 0, -1
|
||||
case DirRight:
|
||||
return 1, 0
|
||||
case DirDown:
|
||||
return 0, 1
|
||||
case DirLeft:
|
||||
return -1, 0
|
||||
}
|
||||
panic("not reach")
|
||||
}
|
||||
|
||||
// Input represents the current key states.
|
||||
type Input struct {
|
||||
mouseState mouseState
|
||||
mouseInitPosX int
|
||||
mouseInitPosY int
|
||||
mouseDir Dir
|
||||
|
||||
touches []ebiten.TouchID
|
||||
touchState touchState
|
||||
touchID ebiten.TouchID
|
||||
touchInitPosX int
|
||||
touchInitPosY int
|
||||
touchLastPosX int
|
||||
touchLastPosY int
|
||||
touchDir Dir
|
||||
}
|
||||
|
||||
// NewInput generates a new Input object.
|
||||
func NewInput() *Input {
|
||||
return &Input{}
|
||||
}
|
||||
|
||||
func abs(x int) int {
|
||||
if x < 0 {
|
||||
return -x
|
||||
}
|
||||
return x
|
||||
}
|
||||
|
||||
func vecToDir(dx, dy int) (Dir, bool) {
|
||||
if abs(dx) < 4 && abs(dy) < 4 {
|
||||
return 0, false
|
||||
}
|
||||
if abs(dx) < abs(dy) {
|
||||
if dy < 0 {
|
||||
return DirUp, true
|
||||
}
|
||||
return DirDown, true
|
||||
}
|
||||
if dx < 0 {
|
||||
return DirLeft, true
|
||||
}
|
||||
return DirRight, true
|
||||
}
|
||||
|
||||
// Update updates the current input states.
|
||||
func (i *Input) Update() {
|
||||
switch i.mouseState {
|
||||
case mouseStateNone:
|
||||
if ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
|
||||
x, y := ebiten.CursorPosition()
|
||||
i.mouseInitPosX = x
|
||||
i.mouseInitPosY = y
|
||||
i.mouseState = mouseStatePressing
|
||||
}
|
||||
case mouseStatePressing:
|
||||
if !ebiten.IsMouseButtonPressed(ebiten.MouseButtonLeft) {
|
||||
x, y := ebiten.CursorPosition()
|
||||
dx := x - i.mouseInitPosX
|
||||
dy := y - i.mouseInitPosY
|
||||
d, ok := vecToDir(dx, dy)
|
||||
if !ok {
|
||||
i.mouseState = mouseStateNone
|
||||
break
|
||||
}
|
||||
i.mouseDir = d
|
||||
i.mouseState = mouseStateSettled
|
||||
}
|
||||
case mouseStateSettled:
|
||||
i.mouseState = mouseStateNone
|
||||
}
|
||||
|
||||
i.touches = ebiten.AppendTouchIDs(i.touches[:0])
|
||||
switch i.touchState {
|
||||
case touchStateNone:
|
||||
if len(i.touches) == 1 {
|
||||
i.touchID = i.touches[0]
|
||||
x, y := ebiten.TouchPosition(i.touches[0])
|
||||
i.touchInitPosX = x
|
||||
i.touchInitPosY = y
|
||||
i.touchLastPosX = x
|
||||
i.touchLastPosX = y
|
||||
i.touchState = touchStatePressing
|
||||
}
|
||||
case touchStatePressing:
|
||||
if len(i.touches) >= 2 {
|
||||
break
|
||||
}
|
||||
if len(i.touches) == 1 {
|
||||
if i.touches[0] != i.touchID {
|
||||
i.touchState = touchStateInvalid
|
||||
} else {
|
||||
x, y := ebiten.TouchPosition(i.touches[0])
|
||||
i.touchLastPosX = x
|
||||
i.touchLastPosY = y
|
||||
}
|
||||
break
|
||||
}
|
||||
if len(i.touches) == 0 {
|
||||
dx := i.touchLastPosX - i.touchInitPosX
|
||||
dy := i.touchLastPosY - i.touchInitPosY
|
||||
d, ok := vecToDir(dx, dy)
|
||||
if !ok {
|
||||
i.touchState = touchStateNone
|
||||
break
|
||||
}
|
||||
i.touchDir = d
|
||||
i.touchState = touchStateSettled
|
||||
}
|
||||
case touchStateSettled:
|
||||
i.touchState = touchStateNone
|
||||
case touchStateInvalid:
|
||||
if len(i.touches) == 0 {
|
||||
i.touchState = touchStateNone
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// Dir returns a currently pressed direction.
|
||||
// Dir returns false if no direction key is pressed.
|
||||
func (i *Input) Dir() (Dir, bool) {
|
||||
if inpututil.IsKeyJustPressed(ebiten.KeyArrowUp) {
|
||||
return DirUp, true
|
||||
}
|
||||
if inpututil.IsKeyJustPressed(ebiten.KeyArrowLeft) {
|
||||
return DirLeft, true
|
||||
}
|
||||
if inpututil.IsKeyJustPressed(ebiten.KeyArrowRight) {
|
||||
return DirRight, true
|
||||
}
|
||||
if inpututil.IsKeyJustPressed(ebiten.KeyArrowDown) {
|
||||
return DirDown, true
|
||||
}
|
||||
if i.mouseState == mouseStateSettled {
|
||||
return i.mouseDir, true
|
||||
}
|
||||
if i.touchState == touchStateSettled {
|
||||
return i.touchDir, true
|
||||
}
|
||||
return 0, false
|
||||
}
|
16
main.go
16
main.go
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"errors"
|
||||
@ -8,7 +8,7 @@ import (
|
||||
//DummyGame Creates a dummygame
|
||||
func DummyGame() (*Game, error) {
|
||||
g := &Game{
|
||||
board: NewBoard(4),
|
||||
Board: NewBoard(4),
|
||||
state: gameSetup,
|
||||
}
|
||||
//Setup terrain
|
||||
@ -19,7 +19,7 @@ func DummyGame() (*Game, error) {
|
||||
{2, 2, 1},
|
||||
}
|
||||
for _, tt := range terrain {
|
||||
res, err := g.board.AddTerrain(tt.x, tt.y, tt.t)
|
||||
res, err := g.Board.AddTerrain(tt.x, tt.y, tt.t)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
@ -81,7 +81,7 @@ func addpiece(game *Game, rank int, c Colour, x int, y int) {
|
||||
}
|
||||
|
||||
func addriver(game *Game, x int, y int) {
|
||||
res, err := game.board.AddTerrain(x, y, 1)
|
||||
res, err := game.Board.AddTerrain(x, y, 1)
|
||||
if err != nil {
|
||||
panic(err)
|
||||
}
|
||||
@ -91,12 +91,12 @@ func addriver(game *Game, x int, y int) {
|
||||
}
|
||||
|
||||
func printboardcolours(g *Game) {
|
||||
for i := range g.board.board {
|
||||
for j := range g.board.board[i] {
|
||||
for i := range g.Board.board {
|
||||
for j := range g.Board.board[i] {
|
||||
c := "X"
|
||||
if g.board.board[i][j].colour == Red {
|
||||
if g.Board.board[i][j].colour == Red {
|
||||
c = "R"
|
||||
} else if g.board.board[i][j].colour == Blue {
|
||||
} else if g.Board.board[i][j].colour == Blue {
|
||||
c = "B"
|
||||
}
|
||||
fmt.Printf("%v", c)
|
||||
|
2
piece.go
2
piece.go
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
//Rank represents the rank of a piece
|
||||
//go:generate enumer -type=Rank
|
||||
|
@ -1,4 +1,4 @@
|
||||
package main
|
||||
package freego
|
||||
|
||||
//Player represents a player of the game
|
||||
type Player interface {
|
||||
|
@ -1,7 +1,7 @@
|
||||
// Code generated by "enumer -type=Rank"; DO NOT EDIT.
|
||||
|
||||
//
|
||||
package main
|
||||
package freego
|
||||
|
||||
import (
|
||||
"fmt"
|
||||
|
Loading…
Reference in New Issue
Block a user