Love2D游戏引擎制作贪吃蛇游戏

代码地址如下:
http://www.demodashi.com/demo/15051.html

Love2D游戏引擎制作贪吃蛇游戏

内附有linux下的makefile,windows下的生成方法请查看:

for windows

预览游戏

love2d游戏引擎重要函数

详情:

love2d wiki

  • love.load:当游戏开始时被调用且仅调用一次
  • love.draw:回调函数,每帧更新一次游戏画面
  • love.update:回调函数,每帧更新一次游戏状态
  • love.keypressed:回调函数,当有按键被按下时触发
  • love.filesystem.load:加载一个lua脚本文件但不执行

!其他的函数在用到时再做解释

版本区别以及初始化资源

!首先要注意的是,本次使用的游戏引擎时love 0.9版本,与最新的love 11.x版本稍有区别。在0.9版本中颜色使用0~255来表示,而在11.x版本中是0~1来表示。

因为需要制作的游戏非常小,所以我们将所用到的资源在第一时间将其初始化并加载到内存中,以便使用。使用到的资源主要有:

  • 字体
  • 颜色
  • 声音
  • 窗口大小与块大小
  • 标题
  • 边框

所用到的函数:

  • love.window.setMode:设置窗口大小,以及样式
  • love.window.setTitle:设置标题
  • love.graphics.newFont:加载字体文件,大小自定义,返回Font类型
  • love.audio.newSource:加载音效文件

代码如下:

function love.load ()
    -- 块大小,窗口宽高,标题
    cellSize = 20
    width = 20 * 40
    height = 20 * 25
    title = 'SNAKE !'

    -- 设置窗口大小和标题
    love.window.setMode (width, height)
    love.window.setTitle (title)

    -- 加载不同大小字体
    fonts = {
        pixies100 = love.graphics.newFont ('Fonts/Pixies.TTF', 100),
        pixies30 = love.graphics.newFont ('Fonts/Pixies.TTF', 30),
        pixies10 = love.graphics.newFont ('Fonts/Pixies.TTF', 10)
    }

    -- 加载音效资源
    sounds = {
        showMenu = love.audio.newSource ('Sounds/showMenu.wav', 'stream'),
        switchOption = love.audio.newSource ('Sounds/switchOption.wav', 'stream'),
        eatFood = love.audio.newSource ('Sounds/eatFood.wav', 'stream'),
        collided = love.audio.newSource ('Sounds/collided.wav', 'stream'),
        gameOver = love.audio.newSource ('Sounds/gameOver.wav', 'stream')
    }

    -- 边框数据
    border = {
        1, 1,
        width-1, 1,
        width-1, height-1,
        1, height-1,
        1, 1
    }

    -- 颜色数据
    colors = {
        darkGray = { 0.3, 0.3, 0.3, 1 },
        beiga = { 0.98, 0.91, 0.76, 1 },
        white = { 1, 1, 1, 1 },
        paleTurquoise = { 0.7, 1, 1, 1 },
    }

    SwitchScence ('Menu')
end

场景与其切换

!首先我们需要实现一个简单的场景切换函数,因为一个游戏总是有多个场景

  1. 先将love2d引擎的主要回调函数赋值nil以免之后出现错误
  2. 加载新场景的lua脚本
  3. 执行新场景的lua脚本

代码如下:

function SwitchScence (scence)
    -- 将重要的函数赋予空值,以免冲突
    love.update = nil
    love.draw = nil
    love.keypressed = nil

    -- 将需要的场景加载进来,并执行load函数
    love.filesystem.load ('Scences/'..scence..'.lua') ()
    love.load ()
end

-- 切换到初始化场景
SwitchScence ('Init')

绘制开始界面

在这里我们需要认识一些绘图函数:

  • love.graphics.setFont:设置当期字体
  • love.graphics.setColor:设置当前颜色
  • love.graphics.rectangle:绘制矩形
  • love.graphics.line:绘制直线
  • love.graphics.print:在窗口上输出

!绘制比较简单,其他详情都在代码里有详细注释,要注意的是我绘制选项的方法。options的有效长度并不是#options,而是options.count记录的选项数量

代码如下:

-- 游戏标题,以及绘制位置
local gameName = {
    text = title,
    textX = cellSize * 12,
    textY = cellSize * 6
}

-- 选项:开始和退出
local options = {
    {
        text = "START",

        textX = cellSize * 18,
        textY = cellSize * 15 - 5,

        border = {
            cellSize*16, cellSize*14,
            cellSize*24, cellSize*14,
            cellSize*24, cellSize*17,
            cellSize*16, cellSize*17,
            cellSize*16, cellSize*14
        }
    },
    {
        text = "QUIT",

        textX = cellSize * 19 - 10,
        textY = cellSize * 19 - 5,

        border = {
            cellSize*16, cellSize*18,
            cellSize*24, cellSize*18,
            cellSize*24, cellSize*21,
            cellSize*16, cellSize*21,
            cellSize*16, cellSize*18
        }
    },

    -- 一些其他属性
    count = 2,
    selected = 1
}

function love.load ()
    -- 加载并播放背景音乐
    sounds.showMenu:play ()

    -- 设置米色和蓝色的透明程度为0,为了之后的动画效果
    colors.beiga[4] = 0
    colors.paleTurquoise[4] = 0
end

function love.draw ()
    -- 灰色背景
    love.graphics.setColor (colors.darkGray)
    love.graphics.rectangle (
        'fill',
        0,
        0,
        width,
        height
    )

    -- 白色边框
    love.graphics.setColor (colors.white)
    love.graphics.line (border)

    -- 渐显效果
    if colors.beiga[4] < 1 then
        colors.beiga[4] = colors.beiga[4] + 0.01
        colors.paleTurquoise[4] = colors.paleTurquoise[4] + 0.01
    end

    -- 设置字体,在指定位置画出米色标题
    love.graphics.setFont (fonts.pixies100)
    love.graphics.setColor (colors.beiga)
    love.graphics.print (gameName.text, gameName.textX, gameName.textY)

    -- 设置字体
    love.graphics.setFont (fonts.pixies30)

    -- 绘制所有选项
    for i = 1, options.count do
        if i == options.selected then
            love.graphics.setColor (colors.paleTurquoise)
        else
            love.graphics.setColor (colors.beiga)
        end

        -- 绘制选项边框和字体
        love.graphics.line (options[i].border)
        love.graphics.print (options[i].text, options[i].textX, options[i].textY)
    end
end

function love.keypressed (key)
    -- 上下箭头选择选项,回车按键确认选项
    if key == 'up' then
        -- 关闭切换选项的声音并重新播放
        if sounds.switchOption.isPlaying then
            sounds.switchOption:stop ()
        end
        sounds.switchOption:play ()

        -- 切换当前选项索引
        options.selected = options.selected - 1
        if options.selected <= 0 then
            options.selected = options.count
        end
    elseif key == 'down' then
        -- 同上
        if sounds.switchOption.isPlaying then
            sounds.switchOption:stop ()
        end
        sounds.switchOption:play ()

        options.selected = options.selected + 1
        if options.selected > options.count then
            options.selected = 1
        end
    elseif key == 'return' then
        -- 关闭显示界面声音
        if sounds.showMenu.isPlaying then
            sounds.showMenu:stop ()
        end

        -- 对应不同选项作出不同回应
        if options.selected == 1 then
            SwitchScence ('GameStart')
        elseif options.selected == 2 then
            love.event.quit ()
        end
    end
end

实现游戏主体

游戏的实现方法,主要知道两个方面:

  • 蛇的移动方式:根据方向获取下一个头的位置,若没有吃到食物就将蛇尾删除,达到移动效果
-- 下一个蛇头位置
local nextX = snake.body[1].x
local nextY = snake.body[1].y

-- 当方向队列中的方向大于1时除去第一个方向(当前方向)
if #directionQueue > 1 then
    table.remove (directionQueue, 1)
end

-- 根据方向作出改动
if directionQueue[1] == 'right' then
    nextX = nextX + 1
    if nextX > limit.x then
        nextX = 0
    end
    elseif directionQueue[1] == 'left' then
        nextX = nextX - 1
        if nextX < 0 then
            nextX = limit.x
        end
    elseif directionQueue[1] == 'down' then
       nextY = nextY + 1
       if nextY > limit.y then
          nextY = 0
       end
    elseif directionQueue[1] == 'up' then
        nextY = nextY - 1
        if nextY < 0 then
            nextY = limit.y
        end
    end

    -- 蛇是否可以移动(没有与自身相撞)
    local canMove = true
    for index, pair in ipairs (snake.body) do
        if index ~= #snake.body
        and nextX == pair.x
        and nextY == pair.y then
            canMove = false
        end
    end

    -- 当蛇可以移动时
    if canMove then
        -- 将新位置加在蛇身的头,并检测是否吃到了食物
        table.insert (snake.body, 1, { x = nextX, y = nextY })
        if nextX == food.x and nextY == food.y then
            -- 播放吃到食物的音效(关闭之前的音效)
            if sounds.eatFood.isPlaying then
                sounds.eatFood:stop ()
            end
            sounds.eatFood:play ()

            -- 分数加一,并生成新的食物位置
            currentScore.score = currentScore.score + 1
                CreateFood ()
            else
            -- 没有吃到食物则删去蛇身的尾部,达到移动的目的
            table.remove (snake.body)
        end
    else
    -- 蛇死亡,并播放相撞的音效
        snake.alive = false
        sounds.collided:play ()
    end
end
  • 方向队列的引入:主要是解决键位冲突的问题
function love.keypressed (key)
    -- 空格键暂停游戏
    if key == 'space' then
        paused = not paused
    end

    -- 没有暂停时
    if not paused then
        -- 记录方向键的按下顺序,同方向或相反方向的不记录
        if key == 'right'
        and directionQueue[#directionQueue] ~= 'right'
        and directionQueue[#directionQueue] ~= 'left' then
            table.insert (directionQueue, 'right')
        elseif key == 'left'
        and directionQueue[#directionQueue] ~= 'left'
        and directionQueue[#directionQueue] ~= 'right' then
            table.insert (directionQueue, 'left')
        elseif key == 'down'
        and directionQueue[#directionQueue] ~= 'down'
        and directionQueue[#directionQueue] ~= 'up' then
            table.insert (directionQueue, 'down')
        elseif key == 'up'
        and directionQueue[#directionQueue] ~= 'up'
        and directionQueue[#directionQueue] ~= 'down' then
            table.insert (directionQueue, 'up')
        end
    end
end

代码如下:

-- 游戏窗口与记分窗口的分界线
local boundary = {
    cellSize*30, 0,
    cellSize*30, height
}

-- 当前分数的信息
local currentScore = {
    text = 'SCORE',
    score = 0,

    -- 文字的绘图位置
    textX = cellSize * 33,
    textY = cellSize * 2,

    -- 分数的绘图位置
    scoreX = cellSize * 34,
    scoreY = cellSize * 5
}

-- 最高分的信息
local highScore = {
    text = 'HIGH SCORE',
    score = 0,

    -- 同上
    textX = cellSize * 31,
    textY = cellSize * 12,

    scoreX = cellSize * 34,
    scoreY = cellSize * 15
}

-- 提示信息
local notes = {
    {
        text = 'ARROW KEY TO MOVE',
        textX = cellSize * 34,
        textY = cellSize * 22
    },
    {
        text = 'ENTER KEY TO PAUSE',
        textX = cellSize * 34,
        textY = cellSize * 23
    }
}

-- 游戏窗口的限制
local limit = { x = 29, y = 24 }

-- 蛇的初始化信息
local snake = {
    -- 蛇身
    body = {
        { x = 2, y = 0 },
        { x = 1, y = 0 },
        { x = 0, y = 0 }
    },

    -- 速度与状态
    speed = 0.1,
    alive = true,
}

-- 食物的位置
local food = { x = nil, y = nil }

-- 方向队列,用于记录键盘按下的顺序以免产生冲突
local directionQueue = { 'right' }

-- 计时器,暂停状态以及最高分文件
local timer = 0
local paused = false
local file = nil

-- 用于生成食物的可存在位置
local function CreateFood ()
    local foodPosition = {}

    -- 遍历整个窗口,将可生成食物的位置记录在foodPosition表里
    for i = 0, limit.x do
        for j = 0, limit.y do
            local possible = true

            -- 是否与蛇身冲突
            for index, pair in ipairs (snake.body) do
                if i == pair.x and j == pair.y then
                    possible = false
                end
            end

            if possible then
                table.insert (foodPosition, { x = i, y = j })
            end
        end
    end

    -- 生成随机食物位置
    local index = love.math.random (#foodPosition)
    food.x, food.y = foodPosition[index].x, foodPosition[index].y
end

function love.load ()
    file = love.filesystem.newFile ('HighScore.txt')
    file:open ('r')
    highScore.score = file:read ()
    file:close ()

    -- 没有透明度
    colors.beiga[4] = 1
    colors.paleTurquoise[4] = 1

    CreateFood ()
end

function love.draw ()
    -- 绘制背景
    love.graphics.setColor (colors.darkGray)
    love.graphics.rectangle (
        'fill',
        0,
        0,
        width,
        height
    )

    -- 绘制白色边框和边界线
    love.graphics.setColor (colors.white)
    love.graphics.line (border)
    love.graphics.line (boundary)

    -- 设置字体和颜色,并在指定位置绘制当前分数信息和最高分信息
    love.graphics.setFont (fonts.pixies30)
    love.graphics.setColor (colors.beiga)
    love.graphics.print (currentScore.text, currentScore.textX, currentScore.textY)
    love.graphics.print (currentScore.score, currentScore.scoreX, currentScore.scoreY)
    love.graphics.setColor (colors.paleTurquoise)
    love.graphics.print (highScore.text, highScore.textX, highScore.textY)
    love.graphics.print (highScore.score, highScore.scoreX, highScore.scoreY)

    -- 蛇生存和死亡时使用不同的颜色绘制
    if snake.alive then
        love.graphics.setColor (colors.paleTurquoise)
    else
        love.graphics.setColor (colors.beiga)
    end

    -- 绘制蛇身,蛇头另绘
    for index, pair in ipairs (snake.body) do
        if index == 1 then
            love.graphics.rectangle (
                'fill',
                cellSize*pair.x,
                cellSize*pair.y,
                cellSize,
                cellSize
            )
        end
        love.graphics.rectangle (
            'fill',
            cellSize*pair.x+1,
            cellSize*pair.y+1,
            cellSize-1*2,
            cellSize-1*2
        )
    end

    -- 绘制食物
    love.graphics.setColor (colors.beiga)
    love.graphics.rectangle (
        'fill',
        cellSize*food.x+1,
        cellSize*food.y+1,
        cellSize-1*2,
        cellSize-1*2
    )

    -- 如果是暂停状态,则绘制暂停字样
    if paused then
        love.graphics.print ('PAUSED !', cellSize*12, cellSize*11)
    end

    -- 设置字体和颜色并绘制提示信息
    love.graphics.setFont (fonts.pixies10)
    love.graphics.setColor (colors.beiga)
    for i = 1, #notes do
        love.graphics.print (notes[i].text, notes[i].textX, notes[i].textY)
    end
end

function love.update (dt)
    -- 使用计时器
    timer = timer + dt

    -- 当蛇生存时
    if snake.alive then
        -- 根据蛇的速度更新游戏
        if timer > snake.speed then
            timer = timer - snake.speed

            -- 没有暂停时
            if not paused then
                -- 下一个蛇头位置
                local nextX = snake.body[1].x
                local nextY = snake.body[1].y

                -- 当方向队列中的方向大于1时除去第一个方向(当前方向)
                if #directionQueue > 1 then
                    table.remove (directionQueue, 1)
                end

                -- 根据方向作出改动
                if directionQueue[1] == 'right' then
                    nextX = nextX + 1
                    if nextX > limit.x then
                        nextX = 0
                    end
                elseif directionQueue[1] == 'left' then
                    nextX = nextX - 1
                    if nextX < 0 then
                        nextX = limit.x
                    end
                elseif directionQueue[1] == 'down' then
                    nextY = nextY + 1
                    if nextY > limit.y then
                        nextY = 0
                    end
                elseif directionQueue[1] == 'up' then
                    nextY = nextY - 1
                    if nextY < 0 then
                        nextY = limit.y
                    end
                end

                -- 蛇是否可以移动(没有与自身相撞)
                local canMove = true
                for index, pair in ipairs (snake.body) do
                    if index ~= #snake.body
                    and nextX == pair.x
                    and nextY == pair.y then
                        canMove = false
                    end
                end

                -- 当蛇可以移动时
                if canMove then
                    -- 将新位置加在蛇身的头,并检测是否吃到了食物
                    table.insert (snake.body, 1, { x = nextX, y = nextY })
                    if nextX == food.x and nextY == food.y then
                        -- 播放吃到食物的音效(关闭之前的音效)
                        if sounds.eatFood.isPlaying then
                            sounds.eatFood:stop ()
                        end
                        sounds.eatFood:play ()

                        -- 分数加一,并生成新的食物位置
                        currentScore.score = currentScore.score + 1
                        CreateFood ()
                    else
                        -- 没有吃到食物则删去蛇身的尾部,达到移动的目的
                        table.remove (snake.body)
                    end
                else
                    -- 蛇死亡,并播放相撞的音效
                    snake.alive = false
                    sounds.collided:play ()
                end
            end
        end
    -- 等待一秒
    elseif timer >= 1 then
        -- 存储最高分
        if currentScore.score > tonumber (highScore.score) then
            file:open ('w')
            file:write (tostring (currentScore.score))
            file:close ()
        end

        -- 切换到游戏结束场景
        SwitchScence ('GameOver')
    end
end

function love.keypressed (key)
    -- 回车键暂停游戏
    if key == 'return' then
        paused = not paused
    end

    -- 没有暂停时
    if not paused then
        -- 记录方向键的按下顺序,同方向或相反方向的不记录
        if key == 'right'
        and directionQueue[#directionQueue] ~= 'right'
        and directionQueue[#directionQueue] ~= 'left' then
            table.insert (directionQueue, 'right')
        elseif key == 'left'
        and directionQueue[#directionQueue] ~= 'left'
        and directionQueue[#directionQueue] ~= 'right' then
            table.insert (directionQueue, 'left')
        elseif key == 'down'
        and directionQueue[#directionQueue] ~= 'down'
        and directionQueue[#directionQueue] ~= 'up' then
            table.insert (directionQueue, 'down')
        elseif key == 'up'
        and directionQueue[#directionQueue] ~= 'up'
        and directionQueue[#directionQueue] ~= 'down' then
            table.insert (directionQueue, 'up')
        end
    end
end

实现最高分的保存与读取

游戏存档目录:

  • Windows XP: C:\Documents and Settings\user\Application Data\LOVE?or %appdata%\LOVE
  • Windows Vista and 7,8: C:\Users\user\AppData\Roaming\LOVE or %appdata%\LOVE
  • Linux: $XDG_DATA_HOME/love/ or ~/.local/share/love/
  • Mac: /Users/user/Library/Application Support/LOVE/

!写文件只能在存档目录

最高分读取:

file = love.filesystem.newFile ('HighScore.txt')
file:open ('r')
highScore.score = file:read ()
file:close ()

最高分保存:

file:open ('w')
file:write (tostring (currentScore.score))
file:close ()

绘制游戏结束界面

游戏结束界面的绘制与开始界面大致相同,这里不再赘述

代码如下:

local gameOver = {
    text = 'GAME OVER !',
    textX = cellSize * 6,
    textY = cellSize * 6
}

-- 选项:开始和退出
local options = {
    {
        text = "BACK",

        textX = cellSize * 13 - 15,
        textY = cellSize * 17 - 5,

        border = {
            cellSize*10, cellSize*16,
            cellSize*18, cellSize*16,
            cellSize*18, cellSize*19,
            cellSize*10, cellSize*19,
            cellSize*10, cellSize*16
        }
    },
    {
        text = "RETRY",

        textX = cellSize * 24,
        textY = cellSize * 17 - 5,

        border = {
            cellSize*22, cellSize*16,
            cellSize*30, cellSize*16,
            cellSize*30, cellSize*19,
            cellSize*22, cellSize*19,
            cellSize*22, cellSize*16
        }
    },

    -- 一些其他属性
    count = 2,
    selected = 1
}

function love.load ()
    sounds.gameOver:play ()

    -- 设置米色和蓝色的透明程度为0,为了之后的动画效果
    colors.beiga[4] = 0
    colors.paleTurquoise[4] = 0
end

function love.draw ()
    -- 灰色背景
    love.graphics.setColor (colors.darkGray)
    love.graphics.rectangle (
        'fill',
        0,
        0,
        width,
        height
    )

    -- 白色边框
    love.graphics.setColor (colors.white)
    love.graphics.line (border)

    -- 渐显效果
    if colors.beiga[4] < 1 then
        colors.beiga[4] = colors.beiga[4] + 0.01
        colors.paleTurquoise[4] = colors.paleTurquoise[4] + 0.01
    end

    -- 设置字体,在指定位置画出米色标题
    love.graphics.setFont (fonts.pixies100)
    love.graphics.setColor (colors.beiga)
    love.graphics.print (gameOver.text, gameOver.textX, gameOver.textY)

    -- 设置字体
    love.graphics.setFont (fonts.pixies30)

    for i = 1, options.count do
        if i == options.selected then
            love.graphics.setColor (colors.paleTurquoise)
        else
            love.graphics.setColor (colors.beiga)
        end

        love.graphics.line (options[i].border)
        love.graphics.print (options[i].text, options[i].textX, options[i].textY)
    end
end

function love.keypressed (key)
    -- 上下箭头选择选项,回车按键确认选项
    if key == 'left' then
        if sounds.gameOver.isPlaying then
            sounds.gameOver:stop ()
        end

        if sounds.switchOption.isPlaying then
            sounds.switchOption:stop ()
        end
        sounds.switchOption:play ()

        options.selected = options.selected - 1
        if options.selected <= 0 then
            options.selected = options.count
        end
    elseif key == 'right' then
        if sounds.gameOver.isPlaying then
            sounds.gameOver:stop ()
        end

        if sounds.switchOption.isPlaying then
            sounds.switchOption:stop ()
        end
        sounds.switchOption:play ()

        options.selected = options.selected + 1
        if options.selected > options.count then
            options.selected = 1
        end
    elseif key == 'return' then
        if sounds.gameOver.isPlaying then
            sounds.gameOver:stop ()
        end

        if options.selected == 1 then
            SwitchScence ('Menu')
        elseif options.selected == 2 then
            SwitchScence ('GameStart')
        end
    end
end

项目结构

项目结构图如下

代码地址如下:
http://www.demodashi.com/demo/15051.html

注:本文著作权归作者,由demo大师代发,拒绝转载,转载需要作者授权

原文地址:https://www.cnblogs.com/demodashi/p/10503475.html

时间: 2024-10-07 22:59:55

Love2D游戏引擎制作贪吃蛇游戏的相关文章

使用Love2D引擎开发贪吃蛇游戏

今天来介绍博主最近捣腾的一个小游戏[贪吃蛇],贪吃蛇这个游戏相信大家都不会感到陌生吧.今天博主将通过Love2D这款游戏引擎来为大家实现一个简单的贪吃蛇游戏,在本篇文章当中我们将会涉及到贪吃蛇的基本算法.Lua语言编程等基本的内容,希望能够对大家开发类似的游戏提供借鉴和思考,文章中如有不足之处,还希望大家能够谅解,因为博主的游戏开发基本就是这样慢慢摸索着学习,所以难免会有不足的地方. 游戏算法 我们首先来看看贪吃蛇是怎么移动的? 通过这四张图的演示,我们可以发现这样一个规律: 蛇的移动其实是将蛇

结对编程—贪吃蛇游戏—需求分析

1.游戏简介:贪吃蛇游戏是一款经典的益智游戏,既简单又耐玩.该游戏通过控制蛇头方向吃食物,从而使得蛇变得越来越长. 2.游戏玩法:用上下左右方向键控制蛇的方向,寻找吃的食物,每吃一口就能得到一定的积分,而且蛇的身子会越吃越长,身子越长玩的难度就越大,不能碰墙,不能咬到自己的身体,地图的大小.蛇的速度可调节,且随游戏时间的推移,难度会自动增加. 3.游戏目的:达到一定积分,即可获胜. 4.需求分析:需要创建界面.蛇和食物,声明计时器.蛇的移动方法.吃食物增长蛇身的方法.食物随机生成的方法以及界面和

WebGL实现HTML5的3D贪吃蛇游戏

js1k.com收集了小于1k的javascript小例子,里面有很多很炫很酷的游戏和特效,今年规则又增加了新花样,传统的classic类型基础上又增加了WebGL类型,以及允许增加到2K的++类型,多次想尝试提交个小游戏但总无法写出让自己满意还能控制在这么小的字节范围. 自己写不出来,站在巨人肩膀总是有机会吧,想起<基于HTML5的电信网管3D机房监控应用>这篇提到的threejs,babylonjs和Hightopo的几种基于WebGL的3D引擎,突然想挑战下自己实现个100行JS的3D小

[C入门 - 游戏编程系列] 贪吃蛇篇(三) - 蛇定义

蛇是这个游戏的主角,要实现的功能也是最复杂的一个.因为蛇不止有属性,还有行为.它会动,还会吃东西,还会长大!而且还会死!这是很要命的.我一向看不懂复杂的代码,也写不出复杂的代码.所以对于蛇,我很纠结,如何才能简单的实现它. 毫无质疑的一点是,食物具有的属性,蛇也具有.蛇必须存在于世界中,有大小和位置以及颜色.这样最起码可以推测出一个蛇的简单定义.但是这还远远不够,蛇是活的,它能动,就必须有速度和方向,它能吃,就必须能长大.所以,抛开其它的一切,它最简单的形式起码也得这样: typedef str

JS贪吃蛇游戏

<!DOCTYPE html><html> <head>    <meta charset="utf-8">    <meta http-equiv="X-UA-Compatible" content="IE=edge">    <title>JS贪吃蛇游戏</title>    <style>    * {        margin: 0;    

用Java开发贪吃蛇游戏

贪吃蛇游戏的设计步骤: Part 1: 设计游戏图纸 画出900*700的白色窗口 在窗口上添加画布 在画布上添加标题 在画布上添加黑色游戏区 Part 2: 放置静态的蛇:一个头.两个身体 加上开始提示:按空格键开始游戏 让蛇动起来:监听Timer事件,平移数据 实现游戏暂停 实现转向功能 Part 3: 添加食物 吃掉食物 添加死亡条件 实现“重新开始”功能 添加分数和长度 游戏图纸如下: 蛇及游戏框的素材如下:                              Snake主类: 1

Qt版贪吃蛇游戏

Qt版贪吃蛇游戏 转载请标明出处:牟尼的专栏 http://blog.csdn.net/u012027907 最近在学习Qt,用了一个多月的时间掌握了Qt中最基本的知识,也完成了<Qt版音乐播放器>.<Qt版贪吃蛇游戏>.<Qt版双人俄罗斯方块>以及<Qt版科学计算器>等,之前在VC下写过这些程序,所以在Qt下只是改变了显示等语句,我写过<C++版贪吃蛇游戏>.<VC版贪吃蛇游戏>,当时将与显示等无关的东西封装起来,在Qt下直接用,只

【141030】VC++贪吃蛇游戏源码(Win32+API)

不错的贪吃蛇游戏,运用了Win32的API.完整源代码,在VS2005下编译通过.内附有编程要点,很好的学习范例. 游戏源码下载地址:点击下载

结对-开发贪吃蛇游戏-开发环境搭建过程

项目:贪吃蛇游戏开发 环境搭建: Mac下: 1)官网下载jkd1.8版本. 2)下载IDE--eclipse或Myeclipse win下: 1)官网下载JDK,找到符合自己电脑的版本,下载的本地 2)下载IDE--eclipse或Myeclipse 3)配置环境变量: i.计算机->属性->高级系统设置 ii.单击高级系统设置->环境变量在系统变量里面分别设置JAVA_HOME.CLASSPATH和Path iii.在系统变量里找变量名JAVA_HOME,如果没有就点击新建.输入变量