Resolve resetting practice game on game over

This commit is contained in:
Trevor Slocum 2019-10-28 16:42:55 -07:00
parent f853512332
commit 7fe65c1183
3 changed files with 75 additions and 44 deletions

View file

@ -425,47 +425,63 @@ func (g *Game) handleDistributeMatrixes() {
}
}
if !g.gameOver && !g.Local && remainingPlayers <= 1 {
requiredPlayers := 2
if g.Local {
requiredPlayers = 0
}
if !g.gameOver && remainingPlayers <= requiredPlayers {
g.setGameOverL(true)
winner := "Tie!"
var otherPlayers string
for i := range g.Players {
if i == remainingPlayer {
winner = g.Players[remainingPlayer].Name
continue
}
if otherPlayers != "" {
otherPlayers += ", "
}
if g.Local {
g.WriteMessage("Game over")
otherPlayers += g.Players[i].Name
}
go func() {
time.Sleep(3 * time.Second)
g.WriteAllL(&GameCommandGameOver{Winner: winner})
g.WriteMessage("Game over - winner: " + winner)
g.WriteMessage("Garbage sent/received:")
for _, p := range g.Players {
g.WriteMessage(p.Name + " - " + strconv.Itoa(p.totalGarbageSent) + "/" + strconv.Itoa(p.totalGarbageReceived))
}
if len(g.Players) < 2 {
g.WriteMessage("Game will start when there are at least two players")
}
go func() {
for {
time.Sleep(7 * time.Second)
if g.Terminated {
return
} else if len(g.Players) > 1 {
g.Reset()
g.Start(0)
return
g.Reset()
g.Start(0)
}()
} else {
winner := "Tie!"
var otherPlayers string
for i := range g.Players {
if i == remainingPlayer {
winner = g.Players[remainingPlayer].Name
continue
}
if otherPlayers != "" {
otherPlayers += ", "
}
otherPlayers += g.Players[i].Name
}
}()
g.WriteAllL(&GameCommandGameOver{Winner: winner})
g.WriteMessage("Game over - winner: " + winner)
g.WriteMessage("Garbage sent/received:")
for _, p := range g.Players {
g.WriteMessage(p.Name + " - " + strconv.Itoa(p.totalGarbageSent) + "/" + strconv.Itoa(p.totalGarbageReceived))
}
if len(g.Players) < 2 {
g.WriteMessage("Game will start when there are at least two players")
}
go func() {
for {
time.Sleep(7 * time.Second)
if g.Terminated {
return
} else if len(g.Players) > 1 {
g.Reset()
g.Start(0)
return
}
}
}()
}
}
matrixes = make(map[int]*mino.Matrix)

View file

@ -273,10 +273,10 @@ func (m *Matrix) ClearFilled() int {
func (m *Matrix) clearFilled() int {
cleared := 0
for y := 0; y < m.H+m.B; y++ {
for y := 0; y < (m.H+m.B)-1; y++ {
for {
if m.LineFilled(y) {
for my := y + 1; my < m.H+m.B; my++ {
for my := y + 1; my < (m.H+m.B)-1; my++ {
for mx := 0; mx < m.W; mx++ {
m.M[I(mx, my-1, m.W)] = m.M[I(mx, my, m.W)]
}
@ -321,10 +321,14 @@ func (m *Matrix) ReceiveGarbage() {
}
func (m *Matrix) addGarbage(lines int) bool {
for my := m.H + m.B; my >= 0; my-- {
for my := (m.H + m.B) - 1; my >= 0; my-- {
for mx := 0; mx < m.W; mx++ {
if my >= m.H+m.B-lines && m.M[I(mx, my, m.W)] != BlockNone {
return false
if my >= (m.H+m.B-1)-lines {
if m.M[I(mx, my, m.W)] != BlockNone {
return false
}
continue
}
m.M[I(mx, my+lines, m.W)] = m.M[I(mx, my, m.W)]
@ -456,11 +460,12 @@ func (m *Matrix) DrawPiecesL() {
}
func (m *Matrix) Block(x int, y int) Block {
index := I(x, y, m.W)
if index < 0 || index > m.W*(m.H+m.B) {
if x < 0 || x >= m.W || y < 0 || y >= m.H+m.B {
return BlockGarbage
}
index := I(x, y, m.W)
// Return overlay block first
b := m.O[index]
if b != BlockNone {
@ -576,7 +581,7 @@ func (m *Matrix) SpawnLocation(p *Piece) Point {
w, _ := p.Size()
x := (m.W / 2) - (w / 2)
for y := m.H; y < m.H+m.B; y++ {
for y := m.H; y < (m.H+m.B)-1; y++ {
if m.canAddAt(p, Point{x, y}) {
return Point{x, y}
}
@ -633,7 +638,7 @@ func (m *Matrix) finishLandingPiece() {
LANDPIECE:
for y := m.P.Y; y >= 0; y-- {
if y == 0 || !m.canAddAt(m.P, Point{m.P.X, y - 1}) {
for dropY := y - 1; dropY < m.H+m.B; dropY++ {
for dropY := y - 1; dropY < (m.H+m.B)-1; dropY++ {
if !m.canAddAt(m.P, Point{m.P.X, dropY}) {
continue
}

View file

@ -74,4 +74,14 @@ func TestMatrix(t *testing.T) {
t.Errorf("failed to Move piece on iteration %d", i)
}
}
ok = m.addGarbage(1)
if !ok {
t.Error("failed to add 1 line of garbage")
}
ok = m.addGarbage(3)
if !ok {
t.Error("failed to add 3 line of garbage")
}
}