lua+love2d制作的2048游戏

使用lua和love2d编写的pc版2048游戏,适用于linux和windows平台。依赖love2d游戏引擎,love2d需0.9及以上版本。

core.lua

代码如下:

core = {}
core.block = {}
core.score = 0
core.best = 0
love.filesystem.setIdentity("2048")
local function get_best()
    if not love.filesystem.exists("best") then
        core.best = 0
        return
    end
    core.best = love.filesystem.read("best")
    core.best = tonumber(core.best)
end
function core.initial()
    core.block = {}
    local pos1 = love.math.random(1, 16)
    local pos2
    while true do
        pos2 = love.math.random(1, 16)
        if pos2 ~= pos1 then break end
    end
    local val
    val = love.math.random()
    if val < 0.8 then val = 2 else val = 4 end
    core.block[pos1] = val
    val = love.math.random()
    if val < 0.8 then val = 2 else val = 4 end
    core.block[pos2] = val
    core.score = 0
end
function core.set_best()
    if core.score > core.best then
        core.best = core.score
        local ret, err = love.filesystem.write("best", core.best)
    end
end
function core.tblclone(t1, num)
    local t2 = {}
    for i = 1, num do
        t2[i] = t1[i]
    end
    return t2
end
function core.isfull(testtbl)
    local block
    if testtbl then block = testtbl else block = core.block end
    for i = 1, 16 do
        if not block[i] then return false end
    end
    return true
end
local function combine(lstart, lend, lstep, rstart, rend, rstep, flag, testtbl)
    local index
    local tflag, block
    if testtbl then
        tflag = true
        block = testtbl
    else
        block = core.block
    end
    local cflag = false
    for i = lstart, lend, lstep do
        for j = rstart, rend, rstep do
            if flag == "up" then index = (i - 1) * 4 + j
            elseif flag == "down" then index = (i + 1) * 4 + j
            elseif flag == "left" then index = i * 4 + j - 1
            else index = i * 4 + j + 1 end
            if block[index] and block[i * 4 + j] and
            block[index] == block[i * 4 + j] and
            block[index] < 2048 then
                cflag = true
                if tflag then return cflag end
                block[index] = 2 * block[i * 4 + j]
                block[i * 4 + j] = nil
                core.score = core.score + block[index]
            end
        end
    end
    return cflag
end
local function move(lstart, lend, lstep, rstart, rend, rstep, flag)
    local mflag = false
    local index, kstart, kend, kstep
    for i = lstart, lend, lstep do
        for j = rstart, rend, rstep do
            if flag == "up" then
                kstart = 0
                kend = i - 1
                kstep = 1
            elseif flag == "down" then
                kstart = 3
                kend = i + 1
                kstep = -1
            elseif flag == "left" then
                kstart = 1
                kend = j - 1
                kstep = 1
            else
                kstart = 4
                kend = j + 1
                kstep = -1
            end
            for k = kstart, kend, kstep do
                if flag == "up" or flag == "down" then index = k * 4 + j
                else index = i * 4 + k end
                if not core.block[index] and core.block[i * 4 + j] then
                    core.block[index] = core.block[i * 4 + j]
                    core.block[i * 4 + j] = nil
                    mflag = true
                    break
                end
            end
        end
    end
    return mflag
end
local function do_tsk(lstart, lend, lstep, rstart, rend, rstep, flag, testtbl)
    if testtbl then return combine(lstart, lend, lstep, rstart, rend, rstep, flag, testtbl) end
    local mret = move(lstart, lend, lstep, rstart, rend, rstep, flag)
    local cret = combine(lstart, lend, lstep, rstart, rend, rstep, flag)
    if not mret and not cret then return false end
    core.score = core.score + 1
    move(lstart, lend, lstep, rstart, rend, rstep, flag)
    return true
end
function core.up_move(testtbl)
    return do_tsk(1, 3, 1, 1, 4, 1, "up", testtbl)
end
function core.down_move(testtbl)
    return do_tsk(2, 0, -1, 1, 4, 1,"down", testtbl)
end
function core.left_move(testtbl)
    return do_tsk(0, 3, 1, 2, 4, 1, "left", testtbl)
end
function core.right_move(testtbl)
    return do_tsk(0, 3, 1, 3, 1, -1, "right", testtbl)
end
function core.new_block()
    local val = love.math.random()
    if val < 0.8 then val = 2 else val = 4 end
    local empty_tbl = {}
    for i = 1, 16 do
        if not core.block[i] then
            table.insert(empty_tbl, i)
        end
    end
    if #empty_tbl == 1 then
        return {index = empty_tbl[1], value = val}
    end
    local pos = love.math.random(1, #empty_tbl)
    return {index = empty_tbl[pos], value = val}
end
get_best()
return core

main.lua

代码如下:

local core = require("core")
local block_pic = {}
local bk
local over_flag = false
local new_block = {flag = false}
local wH    --window height
local wW    --window weight
local bW    --block width
local startpos = {}
local delay = 0
function love.load()
    love.window.setFullscreen()
    wH = love.window.getHeight()
    wW = love.window.getWidth()
    bW = 0.8 * wH / 4
    bk = love.graphics.newImage("src/bk.jpg")
    for i = 1, 11 do
        block_pic[tostring(math.pow(2,i))] = love.graphics.newImage("src/"..tostring(math.pow(2,i))..".PNG")
    end
    love.graphics.setBackgroundColor(255, 255, 255)
    love.graphics.setNewFont(24)
    love.graphics.setColor(255, 255, 255)
    core.initial()
end
local function draw_block(index, value)
    local line = math.modf((index - 1)/4)
    local row = (index - 1) % 4
    local pic_index = tostring(value)
    love.graphics.draw(block_pic[pic_index], 0.1 * wH + row * bW, 0.1 * wH + line * bW, 0, bW/block_pic[pic_index]:getWidth(), bW/block_pic[pic_index]:getHeight())
end
function love.draw()
    local scorestr = "SCORE:\n"..core.score.."\nBEST:\n"..core.best
    love.graphics.draw(bk, 0, 0, 0, wW/bk:getWidth(), wH/bk:getHeight())
    love.graphics.setColor(255, 255, 255)
    love.graphics.rectangle("line", 0.1 * wH, 0.1 * wH, 0.8 * wH, 0.8 * wH)
    for i = 1, 16 do
        if core.block[i] then
            draw_block(i, core.block[i])
        end
    end
    if new_block.flag then
        if delay < 10 then delay = delay + 1
        else
            draw_block(new_block.index, new_block.value)
            core.block[new_block.index] = new_block.value
            new_block.flag = false
            delay = 0
        end
    end
    love.graphics.print(scorestr, wH, wH * 0.1)
    if over_flag then
        love.graphics.setColor(0, 0, 255)
        love.graphics.rectangle("fill", 0.25 * wW, 0.25 * wH, 0.5 * wW, 0.5 * wH)
        love.graphics.setColor(255,255,255)
        love.graphics.print(scorestr, 0.45 * wW, 0.45 * wH)
    end
end
function love.mousepressed(x, y, button)
    if button == 'l' then
        startpos.x = x
        startpos.y = y
    end
end
function love.mousereleased(x, y, button)
    if button == 'l' then
        if over_flag then
            over_flag = false
            core.initial()
            return
        end
        local x_dis = x - startpos.x
        local y_dis = y - startpos.y
        local ret
        if y_dis < 0 and math.abs(y_dis) > math.abs(x_dis) then
            ret = core.up_move()
        elseif y_dis > 0 and math.abs(y_dis) > math.abs(x_dis) then
            ret = core.down_move()
        elseif x_dis < 0 and math.abs(x_dis) > math.abs(y_dis) then
            ret = core.left_move()
        elseif x_dis > 0 and math.abs(x_dis) > math.abs(y_dis) then
            ret = core.right_move()
        end
        if not ret then return end
        new_block = core.new_block()
        if not new_block then return end
        new_block.flag = true
        local testtbl = core.tblclone(core.block, 16)
        testtbl[new_block.index] = new_block.value
        if core.isfull(testtbl) then
            if core.up_move(testtbl) or core.down_move(testtbl) or core.left_move(testtbl) or core.right_move(testtbl) then
                return
            end
            core.set_best()
            over_flag = true
        end
    end
end

以上便是本文的全部内容了,希望大家能够喜欢。也希望通过这几个2048小游戏的代码,能给到大家一些帮助

(0)

相关推荐

  • lua实现的2048小游戏

    lua实现的2048小游戏,只要可以运行lua脚本的环境下都可以玩. 复制代码 代码如下: --[[============================================================================= #     FileName: 2048.lua #         Desc: lua console 2048 #       Author: hanxi #        Email: hanxi.info@gmail.com #    

  • Java完美实现2048小游戏

    完美地模仿了2048游戏,是根据网友的一个2048改的. Block.java import javax.swing.*; import java.awt.*; public class Block extends JLabel { private int value; public Block() { value = 0;//初始化值为0 setFont(new Font("font", Font.PLAIN, 40));//设定字体 setBackground(Color.gray

  • 用VC++6.0的控制台实现2048小游戏的程序

    首先感谢这位大侠的无私分享,仔细学习这个程序以后收获很多,试着添加一些注释 源程序是从开源中国看到的,原作者是 刘地(sir?) 地址为http://www.oschina.net/code/snippet_593413_46040 geek_monkey于2015年3月5日为拜读该程序,受益匪浅 为了方便自己,以及更多初学者阅读,我试着写了写了注释供参考 我是C语言初学者,如有错误希望指正.轻喷 复制代码 代码如下: #include <stdlib.h> #include <stdi

  • Android游戏源码分享之2048

    引言 程序猿们,是否还在为你的老板辛辛苦苦的打工而拿着微薄的薪水呢,还是不知道如何用自己的应用或游戏来赚钱呢! 在这里IQuick将教您如何同过自己的应用来赚取自己的第一桶金! 你是说自己的应用还没有做出来? 不,在這里已经为你提供好了一个完整的游戏应用了,在文章的下面有源码的地址哦.你只要稍做修改就可以变成一个完全属于自己的应用了,比如将4*4换成5*5,甚至是其它的.如果你实在是慵懒至极的话,你只要将本应用的包名及广告换成自己的,就可以上传到市场上轻轻松松赚取自己的第一桶金了. 如果你觉得本

  • Python新手实现2048小游戏

    接触 Python 不久,看到很多人写2048,自己也捣鼓了一个,主要是熟悉Python语法. 程序使用Python3 写的,代码150行左右,基于控制台,方向键使用输入字符模拟. 演示图片 2048.py # -*- coding:UTF-8 -*- #! /usr/bin/python3 import random v = [[0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0], [0, 0, 0, 0]] def display(v, score): '''显示

  • javascript制作2048游戏

    2048.html <!DOCTYPE> <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8" /> <title>2048</title> <link rel="styleshe

  • C++ 实现2048游戏示例

    这游戏前一段时间传的很火,前几天早上实在太无聊了,就决定把这游戏自己也写一个. 前后写了一个多小时吧,大概300行左右,没什么复杂算法,不过实在懒得去优化了,但估计优化完能控制在200行以下,有兴趣的朋友可以自己优化一下. 说明:我一开始玩的是IOS APP版的TRHEES,后来才玩的2048,两者在滑动的规则上有些区别,本人这个版本是这两者的结合. 最后,祝试玩愉快! 界面丑陋,求不笑. 以下是源代码: 复制代码 代码如下: /*By Reason*/#include<iostream>#i

  • java使用OGEngine开发2048

    最近有一款2048的游戏非常火,本文将来介绍一下使用OGEngine游戏引擎开发游戏2048. OGEngine引擎是开源的,我们很容易找到,搭建起来也很方便,我们只需在Android工程下添加OGEngine的jar包或者直接引用源码就可以了. 源码下载:http://www.ogengine.com/download/resources.jsp private void initView() { // 游戏背景 AnimatedSprite game_bg = new AnimatedSpr

  • 使用graphics.py实现2048小游戏

    1.过年的时候在手机上下载了2048玩了几天,心血来潮决定用py写一个,刚开始的时候想用QT实现,发现依赖有点大.正好看到graphics.py是基于tkinter做的封装就拿来练手,并借用了CSDN一位朋友封装的model.py(2048逻辑部分) 2.由于是练手的所以不免有写的不好的地方请大家喷的轻点. 先看看演示图片 附上源码: 2048主程 复制代码 代码如下: #-*-coding:utf-8-*- #python3.3.5 from graphics import* from tki

  • javascript实现2048游戏示例

    原生javascript代码写的2048游戏.建议在谷歌浏览器下跑. 2048.html 复制代码 代码如下: <!DOCTYPE><html xmlns="http://www.w3.org/1999/xhtml"><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><title>2048

  • C语言控制台版2048小游戏

    效果不好,见谅,没事就写了一个!!! /** * @author Routh * @main.c * @date 2014, 4, 26 */ #include <stdio.h> #include <stdlib.h> #include <conio.h> #include <windows.h> // console width #define CONSOLE_WIDTH 80 #define BOX_WIDTH 10 int BOX[4][4] = {

  • linux控制台下实现2048小游戏

    废话少说,直接奉上代码: main.c 复制代码 代码如下: #include"2048.h" int main() {     start_game();     return 0; } 2048.h 复制代码 代码如下: #ifndef _2048_H_ #define _2048_H_ #include<stdio.h> #include<stdlib.h> #include<string.h> #include<termios.h>

  • mysql提示Changed limits: max_open_files: 2048 max_connections: 1910 table_cache: 64的解决

    在windows下安装Mysql系统日志出现max_open_files: 2048 max_connections: 510 table_cache: 764 类似错误是因为 max_connections 最大连接数和max_open_files.table_cache 不匹配.适当的降低max_connections 或调整其他两个数值 解决办法在 mysql bin > 中输入 mysql-nt --table_cache=764mysql-nt --innodb_open_files=

  • javascript版2048小游戏

    没有技术含量,只是用来练习代码逻辑的.为了代码结构清晰,我把逻辑控制部分写在全局变量里,用户界面操作封装在UI对象里,大概就这样了.仅供参考.工作时候,我的编码风格有人吐槽太乱了,所以我想试着写一个不是那么乱的东西出来.. 复制代码 代码如下: <HTML> <head> <title>2048 DEMO</title> <meta charset='utf-8' /> <!--  708616 javascript present  ht

  • python实现2048小游戏

    2048的python实现.修改自某网友的代码,解决了原网友版本的两个小bug: 1. 原版游戏每次只消除一次,而不是递归消除.如 [2 ,2 ,2 ,2] 左移动的话应该是 [4, 4, 0, 0] , 而不是[8 , 0 , 0 ,0] 2. 对游戏结束的侦测有bug,已经改正. 2048game.py # -*- coding: utf-8 -*- """ Created on Tue Jul 1 14:15:39 2014 @author: kelvin "

随机推荐