2048游戏逻辑

2048游戏逻辑

 math.randomseed(os.time()) local function printGrid(grid) local celllen = 8 -- one cell have character count local gridStrLines = {} table.insert(gridStrLines,"\n-------------------------------------") for i,row in ipairs(grid) do local line = {} -- format the number in the center of the cell for _,num in ipairs(row) do if num==0 then local pres = "" for tmp=1,celllen do pres = pres .. " " end local s = string.format("%s",pres) table.insert(line,s) else local s = tostring(num) local l = string.len(s) local l = (celllen-l)/2 local prel = math.floor(l) local sufl = math.ceil(l) local pres = "" for tmp=1,prel do pres = pres .. " " end local sufs = pres if sufl>prel then sufs = pres.. " " end local s = string.format("%s%s%s",pres,s,sufs) table.insert(line,s) end end local line = table.concat(line,"|") line = "|" .. line .. "|" table.insert(gridStrLines,line) table.insert(gridStrLines,"-------------------------------------") end local gridStr = table.concat(gridStrLines,"\n") print(gridStr) end local function getRandomZeroPos(grid) local m = #grid local n = #grid[1] local zeros = {} for i=1,m do for j=1,n do if grid[i][j]==0 then table.insert(zeros,{i=i,j=j}) end end end if #zeros>0 then local r = math.random(1,#zeros) return zeros[r].i,zeros[r].j end end local function randomNum(grid) local i,j = getRandomZeroPos(grid) if i and j then local r = math.random() if r<0.9 then grid[i][j] = 2 else grid[i][j] = 4 end return i,j end end local function moveLeft(grid) print("==============moveLeft===============") local score = 0 local win = false local m = #grid local n = #grid[1] for i=1,m do local line = {} for j=1,n do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k=#line for j=1,n do if j<=k then grid[i][j] = line[j] else grid[i][j] = 0 end end for j=1,k-1 do if grid[i][j]==grid[i][j+1] then grid[i][j+1] = grid[i][j] + grid[i][j+1] if grid[i][j+1]==2048 then win = true end score = score + grid[i][j+1] for x=j,n-1 do grid[i][x] = grid[i][x+1] end grid[i][n] = 0 end end end return score,win end local function moveRight(grid) print("==============moveRight==============") local score = 0 local win = false local m = #grid local n = #grid[1] for i=1,m do local line = {} for j=n,1,-1 do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k = #line for j=n,1,-1 do if n-j+1<=k then grid[i][j] = line[n-j+1] else grid[i][j] = 0 end end for j=n,n-k+2,-1 do if grid[i][j]==grid[i][j-1] then grid[i][j-1] = grid[i][j] + grid[i][j-1] if grid[i][j-1]==2048 then win = true end score = score + grid[i][j-1] for x=j,2,-1 do grid[i][x] = grid[i][x-1] end grid[i][1] = 0 end end end return score,win end local function moveUp(grid) print("===============moveUp================") local score = 0 local win = false local m = #grid local n = #grid[1] for j=1,n do local line = {} for i=1,m do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k = #line for i=1,m do if i<=k then grid[i][j] = line[i] else grid[i][j] = 0 end end for i=1,k-1 do if grid[i][j]==grid[i+1][j] then grid[i+1][j] = grid[i][j] + grid[i+1][j] if grid[i+1][j]==2048 then win = true end score = score + grid[i+1][j] for x=i,m-1 do grid[x][j] = grid[x+1][j] end grid[m][j] = 0 end end end return score,win end local function moveDown(grid) print("==============moveDown===============") local score = 0 local win = false local m = #grid local n = #grid[1] for j=1,n do local line = {} for i=m,1,-1 do if grid[i][j]~=0 then table.insert(line,grid[i][j]) end end local k = #line for i=m,1,-1 do if m-i+1<=k then grid[i][j] = line[m-i+1] else grid[i][j] = 0 end end for i=m,m-k+2,-1 do if grid[i][j]==grid[i-1][j] then grid[i-1][j] = grid[i][j] + grid[i-1][j] if grid[i-1][j]==2048 then win = true end score = score + grid[i-1][j] for x=i,2,-1 do grid[x][j] = grid[x-1][j] end grid[1][j] = 0 end end end return score,win end local function copyGrid(grid) local m = #grid local n = #grid[1] local tmpGrid = {} for i=1,m do if not tmpGrid[i] then tmpGrid[i] = {} end for j=1,n do tmpGrid[i][j] = grid[i][j] end end return tmpGrid end local function getOpList(beforeGrid,grid) local m = #grid local n = #grid[1] local op_list = {} for i=1,m do for j=1,n do if beforeGrid[i][j]~=grid[i][j] then table.insert(op_list,{ 'setnum',i,j,grid[i][j]}) end end end return op_list end -- serialize lua table. for save lua table in file function serialize(t) local mark={} local assign={} local function ser_table(tbl,parent) mark[tbl]=parent local tmp={} for k,v in pairs(tbl) do local key= type(k)=="number" and "["..k.."]" or k if type(v)=="table" then local dotkey= parent..(type(k)=="number" and key or "."..key) if mark[v] then table.insert(assign,dotkey.."="..mark[v]) else table.insert(tmp, key.."="..ser_table(v,dotkey)) end else table.insert(tmp, key.."="..v) end end return "{ "..table.concat(tmp,",").."}" end return ser_table(t,"ret")..table.concat(assign," ") end function initGrid(m,n) local grid = {} for i=1,m do if not grid[i] then grid[i] = {} end for j=1,n do grid[i][j] = 0 end end randomNum(grid) randomNum(grid) return grid end function canMove(grid) local m = #grid local n = #grid[1] for i=1,m do for j=1,n do if grid[i][j]==0 then return true end if (i<m and grid[i][j]==grid[i+1][j] ) or (j<n and grid[i][j]==grid[i][j+1]) then return true end end end return false end local ops = { left = moveLeft, right = moveRight, up = moveUp, down = moveDown, } function touch_op(grid,op) local beforeGrid = copyGrid(grid) local score,win = ops[op](grid) randomNum(grid) printGrid(grid) local op_list = getOpList(beforeGrid,grid) return op_list,score,win end ------------------------------------------------------------------------------- -- for lua console 2048 ------------------------------------------------------------------------------- local function main() local grid = initGrid(4,4) randomNum(grid) printGrid(grid) io.write("next step 'a'[←],'w'[↑],'s'[↓],'d'[→],'q'[exit] >> ") local input = io.read() while input~="q" do if input=="a" or input=="w" or input=="s" or input=="d" then if input=="a" then moveLeft(grid) elseif input=="w" then moveUp(grid) elseif input=="s" then moveDown(grid) elseif input=="d" then moveRight(grid) end randomNum(grid) printGrid(grid) else print("error input. please input 'a'[←] or 'w'[↑] or 's'[↓] or 'd'[→] or 'q'[exit]") end io.write("next step 'a'[←],'w'[↑],'s'[↓],'d'[→],'q'[exit] >> ") input = io.read() end end -- uncomment this. you can in console run command to play console 2048. "$ lua logic.lua" main()

用notepad++来运行lua代码,要运行命令:

 cmd /k lua “$(FULL_CURRENT_PATH)” & PAUSE & EXIT 
复制去Google翻译
翻译结果
 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。

发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/109532.html原文链接:https://javaforall.cn

【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛

【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...

(0)


相关推荐

  • datax(27):不太常见配置项querySql、preSql、postSql、splitPk[通俗易懂]

    datax(27):不太常见配置项querySql、preSql、postSql、splitPk[通俗易懂]每个datax的json都有自己的json配置文档,基本大同小异,有几个配置较为少用,但是用了之后,真香~一、querySql1、使用教程描述:在有些业务场景下,where这一配置项不足以描述所筛选的条件,用户可以通过该配置型来自定义筛选SQL。当用户配置了这一项之后,DataX系统就会忽略table,column这些配置型,直接使用这个配置项的内容对数据进行筛选,例如需要进行多表join后同步数据,使用selecta,bfromtable_ajointable_bontabl.

  • django自定义用户认证_为什么需要自定义类加载器

    django自定义用户认证_为什么需要自定义类加载器前言如果我们不用使用drf那套认证规则,我们想自定义认证类,那么我们首先要知道,drf本身是如何定义认证规则的,也就是要查看它的源码是如何写的源码分析源码的入口在APIView.py文件下的di

  • plot绘图颜色_matlab画图plot详细

    plot绘图颜色_matlab画图plot详细所有颜色的名字及值:’aliceblue’:’#F0F8FF’,’antiquewhite’:’#FAEBD7′,’aqua’:’#00FFFF’,’aquamarine’:’#7FFFD4′,’azure’:’#F0FFFF’,’beige’:’#F5F5DC’,’bisque’:’#FFE4C4′,

    2022年10月15日
  • 7个最优秀的手机游戏引擎

    7个最优秀的手机游戏引擎随着智能手机成为主要的游戏平台,移动游戏引擎变得越来越流行。下面将介绍7个最优秀的手机游戏引擎。1.CoronaSDK游戏开发引擎这是一款实用Lua语言作为开发语言的游戏引擎,对我来说比起的其他的游戏引擎要好学一点。而且,Lua语言现在很有游戏开发都有相关的支持。Coronasdk官方网址:https://coronalabs.com/Lua学习网址,最好从菜鸟教程开始http://www.runoob.com/lua/lua-tutorial.htmlCoronaSDK开发欢迎W

  • WebStorm使用 webstorm快捷键

    WebStorm使用 webstorm快捷键WebStormWebStorm是JetBrains推出的一款商业的 JavaScript 开发工具任何一个编辑器都需要保存(ctrl+s),这是所有win平台上编辑类软件的特点,但是webstorm编辑文件右上角是没有那个熟悉的*的。好处:省去了ctrl+s之后,在结合Firefox的vim,基本不动鼠标就可以看到结果页面了。 坏处:没有以前的*

  • 小程序align-items和justify-content 对齐方式之不同

    小程序align-items和justify-content 对齐方式之不同

发表回复

您的电子邮箱地址不会被公开。

关注全栈程序员社区公众号