【CSOL】2048挑戰(zhàn)
if UI then
? ? Screen = {x = UI.ScreenSize().width, y = UI.ScreenSize().height}
? ? Ui_BoardText = {}
? ? Ui_BoardBox = {}
? ? -- 初始化游戲棋盤(pán)
? ? function initBoard()
? ? ? ? board = {}
? ? ? ? for i = 1, 4 do
? ? ? ? ? ? board[i] = {}
? ? ? ? ? ? for j = 1, 4 do
? ? ? ? ? ? ? ? board[i][j] = 0
? ? ? ? ? ? end
? ? ? ? end
? ? end
? ? -- 在空白位置隨機(jī)生成一個(gè)新的數(shù)字(2或4)
? ? function generateNewNumber()
? ? ? ? local emptyCells = {}
? ? ? ? for i = 1, 4 do
? ? ? ? ? ? for j = 1, 4 do
? ? ? ? ? ? ? ? if board[i][j] == 0 then
? ? ? ? ? ? ? ? ? ? table.insert(emptyCells, {row = i, col = j})
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? end
? ? ? ??
? ? ? ? if #emptyCells > 0 then
? ? ? ? ? ? local randomCell = emptyCells[math.random(#emptyCells)]
? ? ? ? ? ? board[randomCell.row][randomCell.col] = math.random() < 0.9 and 2 or 4
? ? ? ? end
? ? end
? ? -- 檢查游戲是否結(jié)束(無(wú)法再進(jìn)行移動(dòng))
? ? function isGameOver()
? ? ? ? for i = 1, 4 do
? ? ? ? ? ? for j = 1, 4 do
? ? ? ? ? ? ? ? if board[i][j] == 0 then
? ? ? ? ? ? ? ? ? ? return false
? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? if i < 4 and board[i][j] == board[i + 1][j] then
? ? ? ? ? ? ? ? ? ? return false
? ? ? ? ? ? ? ? end
? ? ? ? ? ? ? ??
? ? ? ? ? ? ? ? if j < 4 and board[i][j] == board[i][j + 1] then
? ? ? ? ? ? ? ? ? ? return false
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? end
? ? ? ??
? ? ? ? return true
? ? end
? ? -- 打印當(dāng)前游戲棋盤(pán)
? ? function printBoard()
? ? ? ? for i = 1, 4 do
? ? ? ? ? ? for j = 1, 4 do
? ? ? ? ? ? ? ? print(board[i][j] .. "\t")
? ? ? ? ? ? end
? ? ? ? ? ? print()
? ? ? ? end
? ? ? ??
? ? end
? ? function DrawBoard()
? ? ? ? for i=1,4 do
? ? ? ? ? ? for j=1,4 do
? ? ? ? ? ? ? ? Ui_BoardBox[i] = UI.Box.Create()
? ? ? ? ? ? ? ? Ui_BoardText[i]= UI.Text.Create()
? ? ? ? ? ? ? ? Ui_BoardBox[i]:Set({x = Screen.x/3+i*80, y = Screen.y/3+j*80, width = Screen.x/20, height = Screen.y/15, r = 255, g = 255, b = 255, a = 255})??
? ? ? ? ? ? ? ? if board[i][j]~=0 then
? ? ? ? ? ? ? ? ? ? ? Ui_BoardText[i]:Set({
? ? ? ? ? ? ? ? ? ? ? ? text=tostring(board[i][j]),
? ? ? ? ? ? ? ? ? ? ? ? align='center',
? ? ? ? ? ? ? ? ? ? ? ? font='medium',
? ? ? ? ? ? ? ? ? ? ? ? x=Screen.x/3+i*80,
? ? ? ? ? ? ? ? ? ? ? ? y=Screen.y/3+j*80,
? ? ? ? ? ? ? ? ? ? ? ? width=Screen.x/20,
? ? ? ? ? ? ? ? ? ? ? ? height=Screen.y/15,
? ? ? ? ? ? ? ? ? ? ? ? r=0,g=0,b=0,a=255
? ? ? ? ? ? ? ? ? ? ? })
? ? ? ? ? ? ? ? else
? ? ? ? ? ? ? ? ? ? ? Ui_BoardText[i]:Set({
? ? ? ? ? ? ? ? ? ? ? ? text="",
? ? ? ? ? ? ? ? ? ? ? ? align='center',
? ? ? ? ? ? ? ? ? ? ? ? font='medium',
? ? ? ? ? ? ? ? ? ? ? ? x=Screen.x/3+i*80,
? ? ? ? ? ? ? ? ? ? ? ? y=Screen.y/3+j*80,
? ? ? ? ? ? ? ? ? ? ? ? width=Screen.x/20,
? ? ? ? ? ? ? ? ? ? ? ? height=Screen.y/15,
? ? ? ? ? ? ? ? ? ? ? ? r=0,g=0,b=0,a=255
? ? ? ? ? ? ? ? ? ? ? })? ??
? ? ? ? ? ? ? ? end? ? ? ? ? ? ? ??
? ? ? ? ? ? end
? ? ? ? end?
? ? end
? ? Framework.UIPlug.OnUpdate:Register(function()
? ? ? ? DrawBoard()
? ? end)
? ? -- 合并相同的數(shù)字
? ? function mergeNumbers(row, col, drow, dcol)
? ? ? ? if board[row][col] == 0 then
? ? ? ? ? ? return
? ? ? ? end
? ? ? ? local currentRow, currentCol = row, col
? ? ? ? local nextRow, nextCol = row + drow, col + dcol
? ? ? ? while nextRow >= 1 and nextRow <= 4 and nextCol >= 1 and nextCol <= 4 do
? ? ? ? ? ? if board[nextRow][nextCol] == 0 then
? ? ? ? ? ? ? ? -- 如果下一個(gè)方塊是空白,則繼續(xù)前進(jìn)
? ? ? ? ? ? ? ? currentRow = nextRow
? ? ? ? ? ? ? ? currentCol = nextCol
? ? ? ? ? ? ? ? nextRow = currentRow + drow
? ? ? ? ? ? ? ? nextCol = currentCol + dcol
? ? ? ? ? ? elseif board[nextRow][nextCol] == board[currentRow][currentCol] then
? ? ? ? ? ? ? ? -- 如果下一個(gè)方塊與當(dāng)前方塊相等,則合并兩個(gè)方塊
? ? ? ? ? ? ? ? board[currentRow][currentCol] = board[currentRow][currentCol] * 2
? ? ? ? ? ? ? ? board[nextRow][nextCol] = 0
? ? ? ? ? ? ? ? break
? ? ? ? ? ? else
? ? ? ? ? ? ? ? -- 如果下一個(gè)方塊與當(dāng)前方塊不相等,則停止移動(dòng)
? ? ? ? ? ? ? ? break
? ? ? ? ? ? end
? ? ? ? end
? ? ? ??
? ? ? ? -- 繼續(xù)前進(jìn)直到遇到邊界或空白方塊
? ? ? ? while nextRow >= 1 and nextRow <= 4 and nextCol >= 1 and nextCol <= 4 and board[nextRow][nextCol] == 0 do
? ? ? ? ? ? currentRow = nextRow
? ? ? ? ? ? currentCol = nextCol
? ? ? ? ? ? nextRow = currentRow + drow
? ? ? ? ? ? nextCol = currentCol + dcol
? ? ? ? end
? ? ? ??
? ? ? ? -- 將當(dāng)前方塊移動(dòng)到空白方塊的位置
? ? ? ? if currentRow ~= row or currentCol ~= col then
? ? ? ? ? ? board[currentRow][currentCol] = board[row][col]
? ? ? ? ? ? board[row][col] = 0
? ? ? ? end
? ? end
? ? --[[
? ? function mergeNumbers(row, col, drow, dcol)
? ? ? ? if board[row][col] == 0 then
? ? ? ? ? ? return
? ? ? ? end
? ? ? ? local currentRow, currentCol = row, col
? ? ? ? local nextRow, nextCol = row + drow, col + dcol
? ? ? ? -- 判斷下一個(gè)方塊是否存在且相等
? ? ? ? while board[nextRow] and board[nextRow][nextCol] and board[currentRow][currentCol] == 0 do
? ? ? ? ? ? -- 移動(dòng)當(dāng)前方塊到下一個(gè)方塊位置
? ? ? ? ? ? board[currentRow][currentCol] = board[nextRow][nextCol]
? ? ? ? ? ? board[nextRow][nextCol] = 0
? ? ? ? ? ? currentRow = nextRow
? ? ? ? ? ? currentCol = nextCol
? ? ? ? ? ? nextRow = nextRow + drow
? ? ? ? ? ? nextCol = nextCol + dcol
? ? ? ? end
? ? ? ? -- 如果下一個(gè)方塊存在且值相等,則合并兩個(gè)方塊
? ? ? ? if board[nextRow] and board[nextRow][nextCol] and board[currentRow][currentCol] == board[nextRow][nextCol] then
? ? ? ? ? ? board[currentRow][currentCol] = board[currentRow][currentCol] * 2
? ? ? ? ? ? board[nextRow][nextCol] = 0
? ? ? ? end
? ? end
? ? ]]
? ? -- 移動(dòng)棋盤(pán)
? ? Framework.UIPlug.OnKeyDown:Register(function(inputs)
? ? ? ? if inputs[UI.KEY.W]==true then
? ? ? ? ? ? moveBoard("left")
? ? ? ? ? ? printBoard()? --更新棋盤(pán)
? ? ? ? end
? ? ? ? if inputs[UI.KEY.A]==true then
? ? ? ? ? ? moveBoard("up")
? ? ? ? ? ? printBoard()
? ? ? ? end
? ? ? ? if inputs[UI.KEY.S]==true then
? ? ? ? ? ? moveBoard("right")
? ? ? ? ? ? printBoard()
? ? ? ? end
? ? ? ? if inputs[UI.KEY.D]==true then
? ? ? ? ? ? moveBoard("down")
? ? ? ? ? ? printBoard()
? ? ? ? end
? ? end)
? ? Framework.UIPlug.OnChat:Register(function(msg,signal)
? ? ? ? if msg=="重新開(kāi)始" then
? ? ? ? ? ? initBoard()--初始化棋盤(pán)
? ? ? ? end
? ? end)
? ? -- 移動(dòng)棋盤(pán)
? ? function moveBoard(direction)
? ? ? ? if direction == "up" then
? ? ? ? ? ? -- 向上移動(dòng)棋盤(pán)
? ? ? ? ? ? for i = 2, 4 do
? ? ? ? ? ? ? ? for j = 1, 4 do
? ? ? ? ? ? ? ? ? ? mergeNumbers(i, j, -1, 0)
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? elseif direction == "down" then
? ? ? ? ? ? -- 向下移動(dòng)棋盤(pán)
? ? ? ? ? ? for i = 3, 1, -1 do
? ? ? ? ? ? ? ? for j = 1, 4 do
? ? ? ? ? ? ? ? ? ? mergeNumbers(i, j, 1, 0)
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? elseif direction == "left" then
? ? ? ? ? ? -- 向左移動(dòng)棋盤(pán)
? ? ? ? ? ? for i = 1, 4 do
? ? ? ? ? ? ? ? for j = 2, 4 do
? ? ? ? ? ? ? ? ? ? mergeNumbers(i, j, 0, -1)
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? elseif direction == "right" then
? ? ? ? ? ? -- 向右移動(dòng)棋盤(pán)
? ? ? ? ? ? for i = 1, 4 do
? ? ? ? ? ? ? ? for j = 3, 1, -1 do
? ? ? ? ? ? ? ? ? ? mergeNumbers(i, j, 0, 1)
? ? ? ? ? ? ? ? end
? ? ? ? ? ? end
? ? ? ? end
? ? ? ??
? ? ? ? generateNewNumber()
? ? end
? ? -- 游戲主循環(huán)
? ? function gameLoop()
? ? ? ? initBoard()
? ? ? ? generateNewNumber()
? ? ? ? local direction = ""
? ? ? ? printBoard()
? ? end
? ? -- 啟動(dòng)游戲,傳入移動(dòng)方向參數(shù)
? ? gameLoop("up") -- 這里可以傳入上下左右四個(gè)方向之一,例如:"up", "down", "left", "right"? ??
end