Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- --ComputerCraft
- --Tetris v 1.0
- --© dzanis 12.07.12
- local w,h = term.getSize()
- local sX = w / 2 - 10/2 -- X позиÑÐ¸Ñ ÑÑакана
- local sY = 1 -- Y позиÑÐ¸Ñ ÑÑакана
- local iX = 2 -- X позиÑÐ¸Ñ Ð¸Ð½ÑÑ
- local iY = 2 -- Y позиÑÐ¸Ñ Ð¸Ð½ÑÑ
- local matrix = {} -- ÑÑакан 10x20
- for p = 1 ,200 do -- иниÑиализиÑÑÑ 200 ÑÑеек
- matrix[p] = 0
- end
- local figurePosX = 4 -- позиÑÐ¸Ñ ÑигÑÑÑ Ð² ÑÑакане
- local figurePosY = 1 --позиÑÐ¸Ñ ÑигÑÑÑ Ð² ÑÑакане
- local figureNum = 1 -- Ð½Ð¾Ð¼ÐµÑ ÑигÑÑÑ
- local figureNextNum = math.random(1,7) -- ÑлÑÑайнÑй вÑÐ±Ð¾Ñ ÑигÑÑÑ
- local figureRotateNumber = 1 --Ð½Ð¾Ð¼ÐµÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑигÑÑÑ
- --кооÑдинаÑÑ ÐºÐ²Ð°Ð´ÑаÑиков ÑигÑÑ Ð¿Ð¾ оÑÑм (x,y)
- local figure = {
- {{0,0,1,0,0,1,1,1}},--ÑигÑÑа квадÑаÑ
- {{0,1,1,1,2,1,1,2},{1,0,0,1,1,1,1,2},{1,0,0,1,1,1,2,1},{1,0,1,1,2,1,1,2}},--ÑигÑÑа по ÑоÑме бÑÐºÐ²Ñ "Т"
- {{1,0,1,1,1,2,2,2},{0,1,1,1,2,1,0,2},{0,0,1,0,1,1,1,2},{2,0,0,1,1,1,2,1}},--ÑигÑÑа по ÑоÑме бÑÐºÐ²Ñ "L"
- {{1,0,1,1,1,2,0,2},{0,0,0,1,1,1,2,1},{1,0,2,0,1,1,1,2},{0,1,1,1,2,1,2,2}},--ÑигÑÑа по ÑоÑме бÑÐºÐ²Ñ "L" зеÑкалÑно
- {{0,1,1,1,1,2,2,2},{1,0,0,1,1,1,0,2}},--ÑигÑÑа по ÑоÑме бÑÐºÐ²Ñ "Z"
- {{1,1,2,1,0,2,1,2},{0,0,0,1,1,1,1,2}},--ÑигÑÑа по ÑоÑме бÑÐºÐ²Ñ "Z" зеÑкалÑно
- {{0,2,1,2,2,2,3,2},{1,0,1,1,1,2,1,3}} --ÑигÑÑа по ÑоÑме бÑÐºÐ²Ñ "I"
- }
- local run = true
- local FIRST = 1
- local PAUSE = 2
- local GAME_OVER = 3
- local GAME = 4
- local gameState = FIRST -- вÑклÑÑаÑÐµÐ»Ñ Ñежимов 1 наÑало,2 паÑза , 3 пÑоигÑÑÑ
- local speed = 1.0 -- ÑкоÑоÑÑÑ Ð¸Ð³ÑÑ
- local SCORE = 0 --оÑки
- local LINES = 0 --ÑÑÑÑÑик линий
- local LEVEL = 0 --ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð³ÑÑ
- --пÑоÑиÑовка инÑÑ
- local function paintInfa()
- y = iY
- --пÑоÑиÑовка инÑоÑмаÑии
- term.setCursorPos(iX,y)
- term.write("Score : " .. SCORE)
- y = y + 1
- term.setCursorPos(iX,y)
- term.write("Lines : " .. LINES)
- y = y + 1
- term.setCursorPos(iX,y)
- term.write("Level : " .. LEVEL)
- term.setCursorPos(iX,h - 2)
- term.write("ComputerCraft")
- term.setCursorPos(iX,h - 1)
- term.write("Tetris")
- term.setCursorPos(iX,h)
- term.write("dzanis 12.07.12")
- --пÑоÑиÑовка ÑледÑÑÑей ÑигÑÑÑ
- for i = 1,8,2 do
- term.setCursorPos(sX - 5 + figure[figureNextNum][1][i], iY + figure[figureNextNum][1][i + 1])
- term.write("0")
- end
- return
- end
- local helpText = { "",
- "------HELP-----",
- "",
- "Right: -> or D",
- "---------------",
- "Left: <- or A",
- "---------------",
- "Rotate:",
- " space or enter",
- "---------------",
- "Pause: P",
- "---------------",
- "Exit game:",
- " back space",
- "",
- "---------------",
- }
- --пÑоÑиÑовка Ñ ÐµÐ»Ð¿Ð° ÑпÑавлениÑ
- local function paintText()
- y = 1
- x = sX + 14
- --пÑоÑиÑовка инÑоÑмаÑии
- while #helpText > y - 1 do
- term.setCursorPos(x,y)
- term.write(helpText[y])
- y = y + 1
- end
- return
- end
- --пÑоÑиÑовка ÑигÑÑ Ð² ÑÑакане
- local function paintMatrix()
- -- пÑоÑиÑовка Ñона ÑÑакана
- for y = 0,17 do
- term.setCursorPos(sX,sY + y)
- term.write("|..........|")
- end
- local pos = 21 --наÑÐ¸Ð½Ð°Ñ Ð¿ÑоÑиÑовÑваÑÑ Ñ 21-го (ÑÑÐµÐºÑ Ð²ÑÐ»ÐµÐ·Ð°Ð½Ð¸Ñ ÑигÑÑ Ð¸Ð· поÑолка)
- --пÑоÑиÑовка ÑÑакана Ñ ÐºÑбиками
- for y = sY,18 do
- for x = 1 + sX , 10 + sX do
- if matrix[pos] ~= 0 then --еÑли не пÑÑÑо
- term.setCursorPos(x,y)
- term.write("0")
- end
- if matrix[pos] == -1 then matrix[pos] = 0 end -- обнÑление ÑÑейки падаÑÑей ÑигÑÑÑ
- pos = pos + 1
- end
- end
- end
- --даÑм добÑо на пеÑедвижение-повоÑÐ¾Ñ ÑигÑÑÑ ÐµÑли:
- --1.ÑигÑÑа не вÑÑ Ð¾Ð´Ð¸Ñ Ð·Ð° пÑÐµÐ´ÐµÐ»Ñ ÑÑакана
- --2.ÑигÑÑе не меÑаÑÑ ÐºÑбики
- --Ñак же иÑполÑзÑеÑÑÑ Ð´Ð»Ñ Ð¿ÑовеÑки на ÑÐ¿Ð¾Ñ ÑигÑÑÑ Ð² дно ÑÑакана или в замоÑоженнÑе кÑбики
- local function canMove()
- for i = 1,8,2 do
- x = figurePosX + figure[figureNum][figureRotateNumber][i];
- y = figurePosY + (figure[figureNum][figureRotateNumber][i+1] * 10);
- if x < 0 or x > 9 or x+y > 200 or x+y < 1 then --не вÑÑ Ð¾Ð´Ð¸Ñ Ð»Ð¸ ÑигÑÑа за пÑÐµÐ´ÐµÐ»Ñ ÑÑакана
- return false
- end
- if matrix[x+y] == 1 then --не меÑаÑÑ Ð»Ð¸ ÑигÑÑе кÑбики
- return false;
- end
- end
- return true
- end
- local function newFigure()
- figurePosX = 4 -- позиÑÐ¸Ñ ÑигÑÑÑ Ð² ÑÑакане
- figurePosY = 1 --позиÑÐ¸Ñ ÑигÑÑÑ Ð² ÑÑакане
- figureRotateNumber = 1 --Ð½Ð¾Ð¼ÐµÑ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑигÑÑÑ
- figureNum = figureNextNum
- figureNextNum = math.random(1,7) -- ÑлÑÑайнÑй вÑÐ±Ð¾Ñ ÑледÑÑÑей ÑигÑÑÑ
- return
- end
- --запиÑÑÐ²Ð°Ñ ÑигÑÑÑ Ð² маÑÑив полÑ
- --(kube = 1)- замоÑÐ¾Ð¶ÐµÐ½Ð½Ð°Ñ ÑигÑÑа(доÑÑигÑÐ°Ñ Ð´Ð½Ð°), (kube = -1) - падаÑÑÐ°Ñ ÑигÑÑа
- local function insertFigureToMatrix()
- local kube,pos, linesCount, count,len = 0
- if canMove() then
- kube = -1
- else --еÑли ÑигÑÑа ÑпеÑаеÑÑÑ Ñо замоÑÐ°Ð¶Ð¸Ð²Ð°Ñ ÐµÑ
- figurePosY = figurePosY - 10 --позиÑÐ¸Ñ Ð²Ð¾Ð·Ð²ÑаÑÑÑ Ð´Ð»Ñ Ð¸ÑклÑÑÐµÐ½Ð¸Ñ Ð²ÑÑ Ð¾Ð´Ð° за пÑÐµÐ´ÐµÐ»Ñ Ð¼Ð°ÑÑива или Ð½Ð°Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ ÑигÑÑÑ Ð½Ð° замоÑоженнÑе кÑбики
- kube = 1;
- end
- --запиÑÑÐ²Ð°Ñ ÑигÑÑÑ Ð² маÑÑив полÑ
- for i = 1,8,2 do
- pos = figurePosX + figure[figureNum][figureRotateNumber][i] + figurePosY + (figure[figureNum][figureRotateNumber][i+1] * 10)
- matrix[pos] = kube
- --print(pos)
- end
- pos = 21 --наÑÐ¸Ð½Ð°Ñ Ð¿ÑовеÑÑÑÑ Ñ 21-й ÑÑейки
- linesCount = 0 -- ÑÑÑÑÑик ÑдалÑннÑÑ Ð»Ð¸Ð½Ð¸Ð¹
- --пÑовеÑка еÑÑÑ Ð»Ð¸ полнÑе гоÑизонÑалÑнÑе линии
- for y = 1,18 do
- count = 0 -- ÑÑÑÑÑик замоÑоженнÑÑ ÑÑеек
- for x = 1 , 10 do
- if(matrix[pos] == 1) then --еÑли ÑÑейка замоÑожена Ñо ÑвелиÑиваем ÑÑÑÑÑик
- count = count + 1
- end
- if y == 1 and count > 0 then --еÑли еÑÑÑ Ð·Ð°Ð¼Ð¾ÑÐ¾Ð¶ÐµÐ½Ð°Ñ ÑÑейка в Ñамой веÑÑ Ð½ÐµÐ¹ линии Ñо игÑа законÑена
- gameState = GAME_OVER
- end
- if count == 10 then --еÑли в линии 10-ÑÑ Ð·Ð°Ð¼Ð¾ÑоженнÑÑ ÑÑеек Ñо она заполнена и ÐµÑ Ð½Ð°Ð´Ð¾ ÑдалиÑÑ
- linesCount = linesCount + 1
- --Ñдаление линии из ÑÑакана пÑÑÑм пеÑезапиÑÑÐ²Ð°Ð½Ð¸Ñ ÑÑеек веÑÑ Ð½ÐµÐ¹ линии в нижниÑ
- len = pos
- while len > 31 do
- for i = len,len - 10,-1 do matrix[i] = matrix[i - 10] end
- len = len - 10
- end
- --пеÑеÑиÑовÑÐ²Ð°Ñ ÑÑакан Ñ Ð·Ð°Ð´ÐµÑжкой
- paintMatrix()
- sleep(0.1)
- end
- pos = pos + 1
- end
- end
- -- еÑли бÑли ÑÑÑÑÑÑ Ð»Ð¸Ð½Ð¸Ð¸ обновлÑем инÑÑ
- if linesCount > 0 then
- LINES = LINES + linesCount --ÑвелиÑиваем ÑÑÑÑÑик линий
- LEVEL = math.floor (LINES / 10) --ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸Ð³ÑÑ Ð·Ð°Ð²Ð¸ÑÐ¸Ñ Ð¾Ñ ÐºÐ¾Ð»Ð¸ÑеÑÑва ÑÑÑÑÑÑÑ Ð»Ð¸Ð½Ð¸Ð¹ ,10 линий 1 ÑÑÐ¾Ð²ÐµÐ½Ñ ,20 линий 2й ÑÑÐ¾Ð²ÐµÐ½Ñ Ð¸ Ñ.д.
- --пÑиÑÑждаем оÑки за колиÑеÑÑво ÑдалÑннÑÑ Ð»Ð¸Ð½Ð¸Ð¹,и ÑÑовнÑ
- --оÑки за колиÑеÑÑво ÑдалÑннÑÑ Ð»Ð¸Ð½Ð¸Ð¹ за Ñаз,за Ð¾Ð´Ð½Ñ 10,за две 50 и Ñ.д
- local bonus = {10,50,100,200}
- SCORE = SCORE + bonus[linesCount]
- end
- if kube == 1 then --еÑли ÑигÑÑа зомоÑожена ÑÐ¾Ð·Ð´Ð°Ñ Ð½Ð¾Ð²ÑÑ
- newFigure()
- end
- return
- end
- local timer = os.startTimer(0)
- local event, p1, p2 = nil
- local function game()
- --вÑеменно ÑÐ¾Ñ ÑанÑÑ ÑекÑÑÑÑ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑигÑÑÑ
- previosfigureRotateNumber = figureRotateNumber;
- previosfigurePosX = figurePosX;
- previosfigurePosY = figurePosY;
- if event == "key" then -- еÑли нажаÑа ÐºÐ°ÐºÐ°Ñ Ð»Ð¸Ð±Ð¾ кнопка
- local key = p1
- if key == 83 or key == 263 then -- движение ÑигÑÑÑ Ð²Ð»ÐµÐ²Ð¾
- figurePosX = figurePosX - 1
- elseif key == 68 or key == 262 then --движение ÑигÑÑÑ Ð²Ð¿Ñаво
- figurePosX = figurePosX + 1
- --end
- elseif key == 32 or key == 257 then -- повоÑÐ¾Ñ ÑигÑÑÑ
- figureRotateNumber = ((#figure[figureNum] > figureRotateNumber ) and figureRotateNumber + 1) or 1 -- еÑли маÑÑив ÑигÑÑ Ð±Ð¾Ð»ÑÑе figureRotateNumber,Ñо ÑвелиÑеваем его на 1,еÑли Ð½ÐµÑ Ñо ÑбÑаÑÑваем на 1
- elseif key == 87 or key == 265 then -- вниз
- figurePosY = figurePosY + 10
- end
- end
- if canMove() ~= true then -- еÑли двигаÑÑ ÐºÑÑÑиÑÑ Ð½ÐµÐ»ÑÐ·Ñ Ñо возвÑаÑÑÑ Ð¿ÑÐµÐ¶Ð½Ð¸Ñ Ð¿Ð¾Ð·Ð¸ÑÐ¸Ñ ÑигÑÑÑ
- figureRotateNumber = previosfigureRotateNumber
- figurePosX = previosfigurePosX
- figurePosY = previosfigurePosY
- end
- -- 1 ÑÑÐ¾Ð²ÐµÐ½Ñ speed = 1.0 2 speed = 0.9 Ñем менÑÑе Ñем бÑÑÑÑее ÑигÑÑÑ Ð¿Ð°Ð´Ð°ÑÑ,и Ð½ÐµÐ´Ð°Ñ ÑкоÑоÑÑи ÑменÑÑиÑÑÑ Ð¼ÐµÐ½ÑÑе 0.3
- speed = ((speed > 0.1) and 1.0 - LEVEL/10) or 0.1
- if event == "timer" and p1 == timer then -- здеÑÑ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑкоÑоÑÑÑ Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ ÑигÑÑ Ð² завиÑимоÑÑи Ð¾Ñ ÑÑовнÑ
- timer = os.startTimer(speed)
- figurePosY = figurePosY + 10
- end
- return
- end
- -- Ð½Ð¾Ð²Ð°Ñ Ð¸Ð³Ñа
- local function newGame()
- SCORE = 0
- LINES = 0
- LEVEL = 0
- for p = 1 ,200 do matrix[p] = 0 end -- оÑиÑÑка
- newFigure()
- return
- end
- -- диалог пÑедлагаÑÑий пÑодолжиÑÑ
- flashing = true
- local function paintDialog()
- local text = {
- {" WELKOME TETRIS",
- " P A U S E",
- "G A M E O V E R",
- " PLAY TETRIS" },
- {" to start",
- " to rezume",
- " to start",
- "" },
- }
- term.setCursorPos(iX,h/2)
- term.write(text[1][gameState])
- if flashing and gameState ~= GAME then
- term.setCursorPos(iX,h/2 + 2)
- term.write(" Press any key")
- term.setCursorPos(iX,h/2 + 3)
- term.write(text[2][gameState])
- end
- if event == "timer" and p1 == timer then -- здеÑÑ Ð·Ð°Ð´Ð°ÑÑÑÑ ÑкоÑоÑÑÑ Ð¼Ð¾Ñгалки
- timer = os.startTimer(0.5)
- flashing = flashing ~= true
- end
- return
- end
- -- здеÑÑ Ð½Ð°ÑинаеÑÑÑ Ð¸Ð³Ñа
- newGame()
- while run do
- event, p1, p2 = os.pullEvent()
- if event == "key" then -- еÑли нажаÑа ÐºÐ°ÐºÐ°Ñ Ð»Ð¸Ð±Ð¾ кнопка
- local key = p1
- if key == 80 then -- кнопка P
- gameState = PAUSE
- elseif key == 259 then -- кнопка back space
- run = false
- elseif key > 1 and gameState ~= GAME then -- еÑли нажаÑа лÑÐ±Ð°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ° кÑоме Escape
- if gameState == GAME_OVER then newGame() end
- gameState = GAME
- timer = os.startTimer(0)
- end
- end
- if gameState == GAME then
- game()
- end
- insertFigureToMatrix()
- term.clear() --оÑиÑÑка ÑеÑминала
- paintMatrix()
- paintInfa()
- paintText()
- paintDialog()
- end
- term.clear() --оÑиÑÑка ÑеÑминала
- term.setCursorPos(1,1)
Advertisement
Add Comment
Please, Sign In to add comment