mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-11-10 04:57:26 +01:00
examples/2048: Bug fix: Should not add a new tile when no tiles are moved
This commit is contained in:
parent
399d29b1a0
commit
ef61e7a568
@ -81,7 +81,7 @@ func (b *Board) tileAt(x, y int) *Tile {
|
|||||||
return tileAt(b.tiles, x, y)
|
return tileAt(b.tiles, x, y)
|
||||||
}
|
}
|
||||||
|
|
||||||
func MoveTiles(tiles map[*Tile]struct{}, size int, dir Dir) map[*Tile]struct{} {
|
func MoveTiles(tiles map[*Tile]struct{}, size int, dir Dir) (map[*Tile]struct{}, bool) {
|
||||||
vx, vy := dir.Vector()
|
vx, vy := dir.Vector()
|
||||||
tx := []int{}
|
tx := []int{}
|
||||||
ty := []int{}
|
ty := []int{}
|
||||||
@ -98,6 +98,7 @@ func MoveTiles(tiles map[*Tile]struct{}, size int, dir Dir) map[*Tile]struct{} {
|
|||||||
|
|
||||||
nextTiles := map[*Tile]struct{}{}
|
nextTiles := map[*Tile]struct{}{}
|
||||||
merged := map[*Tile]bool{}
|
merged := map[*Tile]bool{}
|
||||||
|
moved := false
|
||||||
for _, j := range ty {
|
for _, j := range ty {
|
||||||
for _, i := range tx {
|
for _, i := range tx {
|
||||||
t := tileAt(tiles, i, j)
|
t := tileAt(tiles, i, j)
|
||||||
@ -116,6 +117,7 @@ func MoveTiles(tiles map[*Tile]struct{}, size int, dir Dir) map[*Tile]struct{} {
|
|||||||
if tt == nil {
|
if tt == nil {
|
||||||
ii = ni
|
ii = ni
|
||||||
jj = nj
|
jj = nj
|
||||||
|
moved = true
|
||||||
continue
|
continue
|
||||||
}
|
}
|
||||||
if t.value != tt.value {
|
if t.value != tt.value {
|
||||||
@ -124,6 +126,7 @@ func MoveTiles(tiles map[*Tile]struct{}, size int, dir Dir) map[*Tile]struct{} {
|
|||||||
if !merged[tt] {
|
if !merged[tt] {
|
||||||
ii = ni
|
ii = ni
|
||||||
jj = nj
|
jj = nj
|
||||||
|
moved = true
|
||||||
}
|
}
|
||||||
break
|
break
|
||||||
}
|
}
|
||||||
@ -137,11 +140,15 @@ func MoveTiles(tiles map[*Tile]struct{}, size int, dir Dir) map[*Tile]struct{} {
|
|||||||
nextTiles[t] = struct{}{}
|
nextTiles[t] = struct{}{}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return nextTiles
|
return nextTiles, moved
|
||||||
}
|
}
|
||||||
|
|
||||||
func (b *Board) Move(dir Dir) {
|
func (b *Board) Move(dir Dir) {
|
||||||
b.tiles = MoveTiles(b.tiles, b.size, dir)
|
moved := false
|
||||||
|
b.tiles, moved = MoveTiles(b.tiles, b.size, dir)
|
||||||
|
if !moved {
|
||||||
|
return
|
||||||
|
}
|
||||||
b.addRandomTile()
|
b.addRandomTile()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -191,7 +191,8 @@ func TestMoveTiles(t *testing.T) {
|
|||||||
for _, test := range testCases {
|
for _, test := range testCases {
|
||||||
tiles := cellsToTiles(test.Input, size)
|
tiles := cellsToTiles(test.Input, size)
|
||||||
want := tilesToCells(cellsToTiles(test.Want, size), size)
|
want := tilesToCells(cellsToTiles(test.Want, size), size)
|
||||||
got := tilesToCells(MoveTiles(tiles, size, test.Dir), size)
|
gotTiles, _ := MoveTiles(tiles, size, test.Dir)
|
||||||
|
got := tilesToCells(gotTiles, size)
|
||||||
if fmt.Sprint(got) != fmt.Sprint(want) {
|
if fmt.Sprint(got) != fmt.Sprint(want) {
|
||||||
t.Errorf("dir: %s, input: %v, got %v; want %v", test.Dir.String(), test.Input, got, want)
|
t.Errorf("dir: %s, input: %v, got %v; want %v", test.Dir.String(), test.Input, got, want)
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user