You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
151 lines
4.4 KiB
151 lines
4.4 KiB
From ffe9242a73abfb3e8ee9b6effd57e64155717bfb Mon Sep 17 00:00:00 2001
|
|
From: yinqiang <zhuyinqiang@foxmail.com>
|
|
Date: Sat, 7 Jun 2025 22:50:07 +0800
|
|
Subject: [PATCH] fix IBlock disappear issue
|
|
|
|
---
|
|
block.go | 21 +++++++++++----------
|
|
game.go | 26 +++++++++++++++-----------
|
|
2 files changed, 26 insertions(+), 21 deletions(-)
|
|
|
|
diff --git a/block.go b/block.go
|
|
index ad276ea..0b3aaee 100644
|
|
--- a/block.go
|
|
+++ b/block.go
|
|
@@ -14,7 +14,7 @@ type Block struct {
|
|
type BlockType int
|
|
|
|
const (
|
|
- IBlock BlockType = iota
|
|
+ IBlock BlockType = iota + 1
|
|
JBlock
|
|
LBlock
|
|
OBlock
|
|
@@ -32,13 +32,14 @@ type Tetromino struct {
|
|
|
|
// Colors for different block types
|
|
var BlockColors = map[BlockType]color.Color{
|
|
- IBlock: color.RGBA{0, 255, 255, 255}, // Cyan
|
|
- JBlock: color.RGBA{0, 0, 255, 255}, // Blue
|
|
- LBlock: color.RGBA{255, 165, 0, 255}, // Orange
|
|
- OBlock: color.RGBA{255, 255, 0, 255}, // Yellow
|
|
- SBlock: color.RGBA{0, 255, 0, 255}, // Green
|
|
- TBlock: color.RGBA{128, 0, 128, 255}, // Purple
|
|
- ZBlock: color.RGBA{255, 0, 0, 255}, // Red
|
|
+ EmptyBlock: color.RGBA{0, 0, 0, 0}, // Black
|
|
+ IBlock: color.RGBA{0, 255, 255, 255}, // Cyan
|
|
+ JBlock: color.RGBA{0, 0, 255, 255}, // Blue
|
|
+ LBlock: color.RGBA{255, 165, 0, 255}, // Orange
|
|
+ OBlock: color.RGBA{255, 255, 0, 255}, // Yellow
|
|
+ SBlock: color.RGBA{0, 255, 0, 255}, // Green
|
|
+ TBlock: color.RGBA{128, 0, 128, 255}, // Purple
|
|
+ ZBlock: color.RGBA{255, 0, 0, 255}, // Red
|
|
}
|
|
|
|
// TetrominoShapes defines the shape of each tetromino type
|
|
@@ -102,8 +103,8 @@ func NewTetromino(blockType BlockType, x, y int) *Tetromino {
|
|
shape := TetrominoShapes[blockType]
|
|
blocks := make([]Block, 0)
|
|
|
|
- for i := 0; i < len(shape); i++ {
|
|
- for j := 0; j < len(shape[i]); j++ {
|
|
+ for i := range shape {
|
|
+ for j := range shape[i] {
|
|
if shape[i][j] {
|
|
blocks = append(blocks, Block{
|
|
X: j,
|
|
diff --git a/game.go b/game.go
|
|
index aa9896f..2aa98e9 100644
|
|
--- a/game.go
|
|
+++ b/game.go
|
|
@@ -24,6 +24,7 @@ const (
|
|
// Game constants
|
|
InitialDropInterval = 60
|
|
MinDropInterval = 5
|
|
+ EmptyBlock = 0
|
|
)
|
|
|
|
// Game represents the main game state
|
|
@@ -90,9 +91,9 @@ func (g *Game) Draw(screen *ebiten.Image) {
|
|
}
|
|
|
|
// Draw placed blocks
|
|
- for y := 0; y < BoardHeight; y++ {
|
|
- for x := 0; x < BoardWidth; x++ {
|
|
- if g.board[y][x] != 0 {
|
|
+ for y := range BoardHeight {
|
|
+ for x := range BoardWidth {
|
|
+ if g.board[y][x] != EmptyBlock {
|
|
g.drawBlock(screen, x, y, g.board[y][x])
|
|
}
|
|
}
|
|
@@ -311,7 +312,7 @@ func (g *Game) isColliding() bool {
|
|
}
|
|
// Check collision with other pieces
|
|
if y >= 0 && x >= 0 && x < BoardWidth && y < BoardHeight {
|
|
- if g.board[y][x] != 0 {
|
|
+ if g.board[y][x] != EmptyBlock {
|
|
return true
|
|
}
|
|
}
|
|
@@ -324,6 +325,9 @@ func (g *Game) lockPiece() {
|
|
if g.currentPiece == nil {
|
|
return
|
|
}
|
|
+ // if g.currentPiece.BlockType == IBlock {
|
|
+ // g.currentPiece.BlockType = IBlock
|
|
+ // }
|
|
|
|
positions := g.currentPiece.GetAbsolutePositions()
|
|
for _, pos := range positions {
|
|
@@ -378,8 +382,8 @@ func (g *Game) clearLines() {
|
|
|
|
// isLineFull checks if a line is completely filled
|
|
func (g *Game) isLineFull(y int) bool {
|
|
- for x := 0; x < BoardWidth; x++ {
|
|
- if g.board[y][x] == 0 {
|
|
+ for x := range BoardWidth {
|
|
+ if g.board[y][x] == EmptyBlock {
|
|
return false
|
|
}
|
|
}
|
|
@@ -391,15 +395,15 @@ func (g *Game) removeLine(y int) {
|
|
for i := y; i > 0; i-- {
|
|
copy(g.board[i], g.board[i-1])
|
|
}
|
|
- for x := 0; x < BoardWidth; x++ {
|
|
- g.board[0][x] = 0
|
|
+ for x := range BoardWidth {
|
|
+ g.board[0][x] = EmptyBlock
|
|
}
|
|
}
|
|
|
|
// spawnNewPiece creates a new piece at the top of the board
|
|
func (g *Game) spawnNewPiece() {
|
|
if g.nextPiece == nil {
|
|
- g.nextPiece = NewTetromino(BlockType(rand.Intn(7)), 0, 0)
|
|
+ g.nextPiece = NewTetromino(BlockType(rand.Intn(7)+1), 0, 0)
|
|
}
|
|
|
|
g.currentPiece = g.nextPiece
|
|
@@ -409,7 +413,7 @@ func (g *Game) spawnNewPiece() {
|
|
}
|
|
g.currentPiece.Y = 0
|
|
|
|
- g.nextPiece = NewTetromino(BlockType(rand.Intn(7)), 0, 0)
|
|
+ g.nextPiece = NewTetromino(BlockType(rand.Intn(7)+1), 0, 0)
|
|
|
|
if g.isColliding() {
|
|
g.gameOver = true
|
|
@@ -423,7 +427,7 @@ func (g *Game) wouldCollide(piece *Tetromino) bool {
|
|
if x < 0 || x >= BoardWidth || y >= BoardHeight {
|
|
return true
|
|
}
|
|
- if y >= 0 && y < BoardHeight && x >= 0 && x < BoardWidth && g.board[y][x] != 0 {
|
|
+ if y >= 0 && y < BoardHeight && x >= 0 && x < BoardWidth && g.board[y][x] != EmptyBlock {
|
|
return true
|
|
}
|
|
}
|
|
--
|
|
2.39.5 (Apple Git-154)
|
|
|
|
|