找回密码
 立即注册
    查看: 3|回复: 0

    俄罗斯方块 1.0

    [复制链接]

    326

    主题

    66

    回帖

    1466

    积分

    积分
    1466
    发表于 2025-3-1 17:53:32 | 显示全部楼层 |阅读模式
    1. <div class="blockcode"><blockquote>-- 创建主窗口(横屏模式:1020x600)
    2. local win = GUI:Win_Create("Win_1", 0, 0, 1020, 600)

    3. -- 黑屏界面
    4. local blackScreen = GUI:Layout_Create(win, "BlackScreen", 0, 0, 1020, 600, true)
    5. GUI:Layout_setBackGroundColorType(blackScreen, 1)
    6. GUI:Layout_setBackGroundColor(blackScreen, "#000000")  -- 黑色背景

    7. -- 开始游戏按钮
    8. local btnStart = GUI:Button_Create(blackScreen, "BtnStart", 410, 350, "res/public/btn_normal_11.png")
    9. GUI:Button_setTitleText(btnStart, "开始游戏")

    10. -- 关闭游戏按钮
    11. local btnClose = GUI:Button_Create(blackScreen, "BtnClose", 410, 250, "res/public/btn_fubenan_01_1.png")
    12. GUI:Button_setTitleText(btnClose, "关闭游戏")

    13. -- 游戏区域大小
    14. local GRID_WIDTH = 10  -- 横向格子数
    15. local GRID_HEIGHT = 20 -- 纵向格子数
    16. local GRID_SIZE = 30   -- 每个格子的大小

    17. -- 游戏区域二维数组
    18. local gameGrid = {}
    19. for y = 1, GRID_HEIGHT do
    20.     gameGrid[y] = {}
    21.     for x = 1, GRID_WIDTH do
    22.         gameGrid[y][x] = 0  -- 0 表示空格子
    23.     end
    24. end

    25. -- 渲染游戏区域
    26. local gameArea = GUI:Layout_Create(win, "GameArea", 360, 30, GRID_WIDTH * GRID_SIZE, GRID_HEIGHT * GRID_SIZE, true)
    27. GUI:Layout_setBackGroundColorType(gameArea, 1)
    28. GUI:Layout_setBackGroundColor(gameArea, "#000000")  -- 黑色背景
    29. GUI:setVisible(gameArea, false)  -- 初始隐藏游戏区域

    30. -- 7 种方块形状
    31. local SHAPES = {
    32.     { {1, 1, 1, 1} },  -- I
    33.     { {1, 1}, {1, 1} }, -- O
    34.     { {0, 1, 0}, {1, 1, 1} }, -- T
    35.     { {1, 0, 0}, {1, 1, 1} }, -- L
    36.     { {0, 0, 1}, {1, 1, 1} }, -- J
    37.     { {0, 1, 1}, {1, 1, 0} }, -- S
    38.     { {1, 1, 0}, {0, 1, 1} }  -- Z
    39. }

    40. -- 当前方块
    41. local currentShape = SHAPES[math.random(1, #SHAPES)]
    42. local currentX = GRID_WIDTH / 2 - 1
    43. local currentY = GRID_HEIGHT - 1

    44. -- 渲染当前方块
    45. local function renderShape()
    46.     -- 清除之前的方块
    47.     for y = 1, GRID_HEIGHT do
    48.         for x = 1, GRID_WIDTH do
    49.             local cell = GUI:getChildByName(gameArea, "ShapeCell_" .. x .. "_" .. y)
    50.             if cell then
    51.                 GUI:removeFromParent(cell)
    52.             end
    53.         end
    54.     end

    55.     -- 渲染当前方块
    56.     for y = 1, #currentShape do
    57.         for x = 1, #currentShape[y] do
    58.             if currentShape[y][x] == 1 then
    59.                 local cell = GUI:Image_Create(gameArea, "ShapeCell_" .. x .. "_" .. y, (currentX + x - 1) * GRID_SIZE, (currentY + y - 1) * GRID_SIZE, "res/public/1900000550.png")
    60.                 -- GUI:Image_setScale(cell, GRID_SIZE / 32)  -- 调整图片大小
    61.                 GUI:setContentSize(cell, 25, 25)
    62.             end
    63.         end
    64.     end
    65. end

    66. -- 检查方块是否可以移动或旋转
    67. local function canMove(newShape, newX, newY)
    68.     for y = 1, #newShape do
    69.         for x = 1, #newShape[y] do
    70.             if newShape[y][x] == 1 then
    71.                 local gridX = newX + x - 1
    72.                 local gridY = newY + y - 1
    73.                 if gridX < 1 or gridX > GRID_WIDTH or gridY < 1 or (gameGrid[gridY] and gameGrid[gridY][gridX] == 1) then
    74.                     return false
    75.                 end
    76.             end
    77.         end
    78.     end
    79.     return true
    80. end

    81. -- 移动方块
    82. local function moveShape(dx, dy)
    83.     if canMove(currentShape, currentX + dx, currentY + dy) then
    84.         currentX = currentX + dx
    85.         currentY = currentY + dy
    86.         renderShape()
    87.     else
    88.         -- 方块落地,固定到游戏区域
    89.         for y = 1, #currentShape do
    90.             for x = 1, #currentShape[y] do
    91.                 if currentShape[y][x] == 1 then
    92.                     gameGrid[currentY + y - 1][currentX + x - 1] = 1
    93.                 end
    94.             end
    95.         end
    96.         -- 生成新方块
    97.         currentShape = SHAPES[math.random(1, #SHAPES)]
    98.         currentX = GRID_WIDTH / 2 - 1
    99.         currentY = GRID_HEIGHT - 1
    100.     end
    101. end

    102. -- 旋转方块
    103. local function rotateShape()
    104.     local newShape = {}
    105.     local width = #currentShape[1]
    106.     local height = #currentShape

    107.     -- 旋转 90 度
    108.     for x = 1, width do
    109.         newShape[x] = {}
    110.         for y = 1, height do
    111.             newShape[x][y] = currentShape[height - y + 1][x]
    112.         end
    113.     end

    114.     -- 检查旋转后是否可以放置
    115.     if canMove(newShape, currentX, currentY) then
    116.         currentShape = newShape
    117.         renderShape()
    118.     end
    119. end

    120. -- 消除满行
    121. local function clearLines()
    122.     for y = GRID_HEIGHT, 1, -1 do
    123.         local full = true
    124.         for x = 1, GRID_WIDTH do
    125.             if gameGrid[y][x] == 0 then
    126.                 full = false
    127.                 break
    128.             end
    129.         end
    130.         if full then
    131.             -- 消除该行
    132.             for x = 1, GRID_WIDTH do
    133.                 gameGrid[y][x] = 0
    134.             end
    135.             -- 上方行下移
    136.             for yy = y, GRID_HEIGHT - 1 do
    137.                 for x = 1, GRID_WIDTH do
    138.                     gameGrid[yy][x] = gameGrid[yy + 1][x]
    139.                 end
    140.             end
    141.         end
    142.     end
    143. end

    144. -- 游戏循环
    145. local function gameLoop()
    146.     moveShape(0, -1)  -- 方块下落
    147.     clearLines()
    148.     renderShape()
    149. end

    150. -- 启动定时器
    151. local gameTimer = nil

    152. -- 开始游戏
    153. local function startGame()
    154.     GUI:setVisible(blackScreen, false)  -- 隐藏黑屏界面
    155.     GUI:setVisible(gameArea, true)      -- 显示游戏区域
    156.     gameTimer = GUI:schedule(win, gameLoop, 1)  -- 启动游戏循环
    157. end

    158. -- 关闭游戏
    159. local function closeGame()
    160.     GUI:setVisible(blackScreen, true)  -- 显示黑屏界面
    161.     GUI:setVisible(gameArea, false)    -- 隐藏游戏区域
    162.     if gameTimer then
    163.         GUI:unSchedule(gameTimer)       -- 停止游戏循环
    164.         gameTimer = nil
    165.     end
    166. end

    167. -- 设置按钮点击事件
    168. GUI:addOnClickEvent(btnStart, startGame)
    169. GUI:addOnClickEvent(btnClose, closeGame)

    170. -- 键盘控制
    171. -- 左键:左移
    172. GUI:addKeyboardEvent("KEY_LEFT_ARROW", function()
    173.     moveShape(-1, 0)
    174. end)

    175. -- 右键:右移
    176. GUI:addKeyboardEvent("KEY_RIGHT_ARROW", function()
    177.     moveShape(1, 0)
    178. end)

    179. -- 下键:加速下落
    180. GUI:addKeyboardEvent("KEY_DOWN_ARROW", function()
    181.     moveShape(0, -1)
    182. end)

    183. -- 上键:旋转方块
    184. GUI:addKeyboardEvent("KEY_UP_ARROW", function()
    185.     rotateShape()
    186. end)
    复制代码

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则