首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

js推箱子游戏源代码

推箱子(Sokoban)是一款经典的益智游戏,玩家需要通过移动箱子到指定位置来通关。下面是一个简单的JavaScript推箱子游戏源代码示例:

HTML部分

代码语言:txt
复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>推箱子游戏</title>
    <style>
        .game-board {
            display: grid;
            grid-template-columns: repeat(8, 50px);
            grid-gap: 2px;
        }
        .cell {
            width: 50px;
            height: 50px;
            background-color: #ddd;
            display: flex;
            align-items: center;
            justify-content: center;
        }
        .wall {
            background-color: #333;
        }
        .player {
            background-color: blue;
        }
        .box {
            background-color: red;
        }
        .target {
            background-color: green;
        }
    </style>
</head>
<body>
    <div id="game-board" class="game-board"></div>
    <script src="game.js"></script>
</body>
</html>

JavaScript部分(game.js)

代码语言:txt
复制
const board = [
    [1, 1, 1, 1, 1, 1, 1, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 0, 2, 0, 0, 3, 0, 1],
    [1, 0, 0, 0, 0, 0, 0, 1],
    [1, 1, 1, 1, 1, 1, 1, 1]
];

let playerPos = { x: 2, y: 2 };

function renderBoard() {
    const gameBoard = document.getElementById('game-board');
    gameBoard.innerHTML = '';
    board.forEach((row, y) => {
        row.forEach((cell, x) => {
            const div = document.createElement('div');
            div.classList.add('cell');
            switch (cell) {
                case 1:
                    div.classList.add('wall');
                    break;
                case 2:
                    div.classList.add('player');
                    break;
                case 3:
                    div.classList.add('box');
                    break;
                case 4:
                    div.classList.add('target');
                    break;
            }
            gameBoard.appendChild(div);
        });
    });
}

document.addEventListener('keydown', (e) => {
    let newX = playerPos.x;
    let newY = playerPos.y;

    switch (e.key) {
        case 'ArrowUp':
            newY -= 1;
            break;
        case 'ArrowDown':
            newY += 1;
            break;
        case 'ArrowLeft':
            newX -= 1;
            break;
        case 'ArrowRight':
            newX += 1;
            break;
    }

    if (board[newY][newX] === 1) return; // Hit a wall
    if (board[newY][newX] === 3) {
        const nextX = newX + (newX > playerPos.x ? 1 : newX < playerPos.x ? -1 : 0);
        const nextY = newY + (newY > playerPos.y ? 1 : newY < playerPos.y ? -1 : 0);
        if (board[nextY][nextX] !== 0 && board[nextY][nextX] !== 4) return; // Hit another box or wall
        board[newY][newX] = 0;
        board[nextY][nextX] = 3;
    }

    board[playerPos.y][playerPos.x] = 0;
    playerPos = { x: newX, y: newY };
    board[playerPos.y][playerPos.x] = 2;
    renderBoard();
});

renderBoard();

基础概念

  • 推箱子游戏:玩家通过移动箱子到指定位置来通关的益智游戏。
  • 游戏逻辑:包括玩家移动、箱子推动、碰撞检测等。

优势

  • 简单易懂:规则简单,适合各年龄层玩家。
  • 锻炼思维:需要规划路径和策略,有助于提高逻辑思维能力。

类型

  • 经典推箱子:基本的推箱子游戏形式。
  • 扩展版本:增加更多关卡、障碍物或特殊元素。

应用场景

  • 教育领域:用于培养学生的逻辑思维和问题解决能力。
  • 休闲娱乐:作为放松和消遣的游戏。

常见问题及解决方法

  1. 箱子无法推动
    • 原因:可能是箱子被其他箱子或墙壁阻挡。
    • 解决方法:检查路径是否畅通,确保没有障碍物。
  • 玩家移动超出边界
    • 原因:玩家移动到地图外。
    • 解决方法:在移动逻辑中增加边界检查。
  • 游戏状态不同步
    • 原因:可能是在更新游戏状态时出现错误。
    • 解决方法:确保每次移动后正确更新地图和玩家位置。

通过以上代码和解释,你可以创建一个基本的推箱子游戏,并了解其基础概念和相关问题解决方法。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

100关推箱子游戏

实现原理 1.创建游戏场景,通过读取配置文件,取到地图数据并保存,核心逻辑如下: this.allLevelConfig = {}; cc.loader.loadRes('levelConfig.json...//加载完配置后,直接创建关卡元素 this.createLavelItem(); }.bind(this)); 2.地图采用定宽原则,先计算出地图方块的尺寸,再计算每个方块的偏移量就可以设置游戏的每块地图的坐标...* this.boxH) / 2; } else{ offset = ((this.allRow - this.allCol) * this.boxH) / 2; } 3.人物运动,玩家点哪游戏人物就走到哪...,先检测箱子前方是否有障碍物,若没有则推动箱子,通过切换地图的图片和修改位置类型达到推动箱子的效果。...5.游戏结束判定,若达成目标的箱子数量和配置的箱子数量相等,则游戏过关。 以下是游戏中的效果图: ?

1.3K20
  • C语言实现推箱子游戏

    游戏中的人物、箱子、墙壁、球都是字符构成的。通过wasd键移动,规则的话就是推箱子的规则,也就不多说了。 二、代码实现 关于代码方面,我尽可能讲的细致。...,推箱子肯定要有箱子嘛。...printf("恭喜你完成游戏!...循环中大致流程如下: - 清除屏幕 - 绘制地图 - 判断游戏是否结束 - 对用户按下的按钮进行反馈 进入循环体,先清除屏幕,再绘制地图,然后再判断游戏是否结束。...- 对用户按下的按钮进行反馈 这里把判断游戏是否结束放到了重绘图像后面,因为在对用户进行反馈的时候只是改变了map中的数据,实际上最后一个箱子推到终点的图像还没有显示出来,所以要在重绘之后再判断是否结束游戏

    3.2K10

    Python使用tkinter模块实现推箱子游戏

    前段时间用C语言做了个字符版的推箱子,着实是比较简陋。正好最近用到了Python,然后想着用Python做一个图形界面的推箱子。...一、介绍 开发语言:Python 3.7 开发工具:PyCharm 2019.2.4 日期:2019年10月2日 作者:ZackSock 这次的推箱子不同于C语言版的,首先是使用了图形界面,然后添加了背景音乐...然后讲一下各个文件的功能: BoxGame:作为游戏的主入口,游戏的主要流程就在里面。老实说我Python学习的内容比较少,对Python的面向对象不是很熟悉,所有这个流程更偏向于面向过程的思想。...Painter import Painter from pygame import mixer #创建界面并设置属性 #创建一个窗口 root = Tk() #设置窗口标题 root.title("推箱子...这个游戏用的更多的是面向过程的思想,而可以改进的地方也非常多。

    2.5K50

    C语言实现推箱子小游戏

    C语言实现推箱子小游戏 包括黑窗和图形界面 参考视频 https://www.bilibili.com/video/BV1By4y1a79o?...#include //使用布尔类型 #include //使用图形界面-图形界面头文件(需要安装) #include //推箱子 //知识点...:数组 、函数、 //开发环境 vs2019 //准备地图数据 用二维数组来存储 //表示——空地 0 墙 1 目的地 2 箱子 3 玩家 4 //这两个是动态变化的 箱子+目的地 5 玩家+目的地...printf("%d %c\n", key, key); switch (key) { case 'w': case 'W': case 72://向上移动 //什么情况下 玩家才能移动 才能推箱子...//玩家的前面是空地(目的地)、玩家的前面是箱子(箱子的前面是什么) 可以动 //如果玩家的前面是空地 if (map[level][i- 1][k] == SPACE || map[level

    93610

    three.js 制作一个三维的推箱子游戏

    今天郭先生发现大家更喜欢看我发的three.js小作品,今天我就发一个3d版本推箱子的游戏,其实webGL有很多框架,three.js并不合适做游戏引擎,但是可以尝试一些小游戏。...在线案例请点击three.js推箱子 image.png 要制作一个推箱子游戏,正常要有以下4个步骤 定义一些数组,要有开始箱子数组、结束箱子数组、地面数组还有墙面数组,有这四个数组就可以组成一个关卡...根据相机正对箱子时,用鼠标点击箱子,控制箱子移动,并做成功性校验。 下面我们上代码分析代码 1. 定义数组 这四个数组分别是墙的数组、地面的数组、箱子初始位置数组和目标数组。...监听游戏成功 如果成功了,那么简单的弹出提示。...},100) } } 由于当时做这个小案例时还是菜鸟,所以很少用一些three.js的辅助方法,见笑了。 转载请注明地址:郭先生的博客

    3.3K20

    C语言实现推箱子游戏完整代码

    C语言实现推箱子游戏完整代码 前言 自己做的,可能有些代码不够工整,或者有些小问题,但游戏的基本操作是可以实现的 代码效果 ?..., 如果有三个方向被堵住了说明箱子无法移动了,也表明这个箱子失效了, 用k来记录失效的个数,当全部失效时游戏失败 (这是游戏的玩法,其实有一个被堵住就已经不可能胜利了)*/ } if(k...:加1,加2,加3减3都是什么意思 加1:箱子的值是2,人的值是3,所以箱子的位置变成人需要加1来实现 加2:空地的值是0,箱子的值是2,箱子和终点在一起的值是6,所以在推箱子的时候,前方的空格或者终点放上箱子后数值会加...,则地图不会发生变化,因为 推不动嘛*/ }else if(screen[x-1][y]==0){ screen[x-1][y]+=3; screen[x][y]-=3; x...return ; }else if(screen[x-2][y]==2){ return;//如果箱子的前面是墙或者其他的箱子,则箱子推不动 }else if(screen[x-

    2.7K31

    人人都可以用C语言写推箱子小游戏

    这个是我学习 C语言 后写的推箱子小游戏,自己的逻辑能力得到了提升,在这里同大家分享这个推箱子小游戏项目。...最终的效果图 这是一个在 Windows Dos 界面的小游戏,界面上有推箱子的地图,使用 # 来代表地图的边界,P 来代表推箱子的小人,X 来代表箱子,O 来代表箱子要推到的目标位置。...游戏地图 2、游戏怎么运行? 因为推箱子游戏在游戏结束之前要不断接受用户的输入,所以我们可以设置一个标志来判断游戏是否结束,把这个标志设置为一个 while 循环的条件。...4、游戏怎么结束? 前面我们说设置一个标志来判断游戏是否结束,但是游戏什么时候结束呢?推箱子的游戏目标是将每个箱子推到目标位置,这是一种游戏结束的情况,由于每次循环都要判断,可以将其写成一个函数。...将关卡中的游戏地图更换,就可以实现推箱子的多个关卡,读者有兴趣可自己尝试改进,本文也是起到一个抛砖引玉的作用。

    5.6K40

    纯C语言程序员写的编程新手入门基础小游戏之最炫酷推箱子

    很多编程爱好者都编写过推箱子游戏编程吧,最近有好些朋友看见我以前的推箱子程序后, 问我是怎么做的。我一直想把这个程序的整个过程写一份详细的东西,与各位编程爱好者分享,一直没空。...if (map[i-2][j]==0) { map[i-2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID() //下面是对箱子原地进行判断 if(map[i-1][j]==7) //如果箱子原地为目的地...if (map[i+2][j]==0) { map[i+2][j]=4; //人推箱子往前走一步,把空地ID修改为箱子ID() //下面是对箱子原地进行判断 if(map[i+1][j]==7) //如果箱子原地为目的地...if (map[i][j-2]==0) { map[i][j-2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID() //下面是对箱子原地进行判断 if(map[i][j-1]==7) //如果箱子原地为目的地...if (map[i][j+2]==0) { map[i][j+2]=4; //人推箱子往前走一步,把空地ID修改为箱子ID() //下面是对箱子原地进行判断 if(map[i][j+1]==7) //如果箱子原地为目的地

    2.7K60

    通过C语言设计的推箱子(控制台终端)

    一、项目介绍 推箱子游戏是一款经典的益智小游戏,玩家需要控制主角角色将几个木箱按照要求推到指定位置。...同时还需要定义一个二维字符数组board,用于表示整个游戏界面。 初始化游戏界面:在InitGame()函数中进行游戏初始化,设置游戏界面的边框和各个元素的位置。...更新游戏状态:UpdateGame()函数用于更新游戏状态,包括判断主角角色是否可以移动,以及是否完成任务等操作。...判断游戏是否结束:CheckGameOver()函数用于检查游戏是否结束,包括是否成功完成任务或者失败结束游戏。如果判断出游戏结束,则直接退出程序。...游戏暂停:Pause()函数用于控制游戏的暂停时间,可以通过调用Sleep()函数来实现。 游戏结束:GameOver()函数用于输出最终的游戏得分和游戏结束信息,并直接退出程序。

    24110

    推箱子(BFS+DFS 自定义哈希set)

    题目 「推箱子」是一款风靡全球的益智小游戏,玩家需要将箱子推到仓库中的目标位置。 游戏地图用大小为 n * m 的网格 grid 表示,其中每个元素可以是墙、地板或者是箱子。...现在你将作为玩家参与游戏,按规则将箱子 'B' 移动到目标位置 'T' : 玩家用字符 'S' 表示,只要他在地板上,就可以在网格中向上、下、左、右四个方向移动。 地板用字符 '.'...,"S","#"], ["#","#","#","#","#","#"]] 输出:3 解释:我们只需要返回推箱子的次数。...中间到达推箱子的过程,不必记录到队列内,采用DFS判断人的位置能否到达推动箱子的位置 不采用优先队列也可以 class node { public: int push, bi, bj, pi,...canReachPushPos(grid,pi,pj,bi,bj,pushPosx,pushPosy,record)) continue;//不能从当前位置到达推箱子位置

    89020
    领券