HTML2048小游戏(最新版)

比上一篇文章的2048更好一点。 控制方法:WASD键(小写)或页面上四个按钮

效果图如下:                 源代码在图片后面   

源代码

 ·HTML·

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>2048 Game</title><link rel="stylesheet" href="styles.css">
</head>
<body><div id="game-container"><div id="game-board"></div><div id="controls"><button id="up">W</button><button id="left">A</button><button id="down">S</button><button id="right">D</button></div></div><script src="script.js"></script>
</body>
</html>

 ·CSS·

* {box-sizing: border-box;margin: 0;padding: 0;font-family: 'Arial', sans-serif;
}body {display: flex;justify-content: center;align-items: center;height: 100vh;background-color: #faf8ef;
}#game-container {display: flex;flex-direction: column;align-items: center;
}#game-board {display: grid;grid-template-columns: repeat(4, 1fr);grid-template-rows: repeat(4, 1fr);gap: 10px;background-color: #bbada0;padding: 10px;border-radius: 10px;margin-bottom: 20px;
}.tile {width: 80px;height: 80px;background-color: #cdc1b4;display: flex;justify-content: center;align-items: center;font-size: 24px;border-radius: 10px;transition: all 0.2s ease-in-out;
}#controls {display: flex;gap: 10px;
}button {width: 60px;height: 60px;font-size: 20px;border-radius: 10px;background-color: #8f7a66;color: white;border: none;cursor: pointer;
}button:hover {background-color: #9f8b76;
}

  ·JavaScript·

document.addEventListener('DOMContentLoaded', () => {const boardSize = 4;let board = [];let score = 0;const gameBoard = document.getElementById('game-board');const buttons = {up: document.getElementById('up'),down: document.getElementById('down'),left: document.getElementById('left'),right: document.getElementById('right')};function initBoard() {for (let i = 0; i < boardSize * boardSize; i++) {const tile = document.createElement('div');tile.classList.add('tile');gameBoard.appendChild(tile);}board = Array.from(document.querySelectorAll('.tile'));generateTile();generateTile();updateBoard();}function generateTile() {let emptyTiles = board.filter(tile => !tile.textContent);if (emptyTiles.length > 0) {let randomTile = emptyTiles[Math.floor(Math.random() * emptyTiles.length)];randomTile.textContent = Math.random() < 0.9 ? '2' : '4';}}function updateBoard() {board.forEach(tile => {const value = tile.textContent;tile.style.backgroundColor = getTileColor(value);});}function getTileColor(value) {switch (value) {case '2': return '#eee4da';case '4': return '#ede0c8';case '8': return '#f2b179';case '16': return '#f59563';case '32': return '#f67c5f';case '64': return '#f65e3b';case '128': return '#edcf72';case '256': return '#edcc61';case '512': return '#edc850';case '1024': return '#edc53f';case '2048': return '#edc22e';default: return '#cdc1b4';}}function move(direction) {switch (direction) {case 'up': moveUp(); break;case 'down': moveDown(); break;case 'left': moveLeft(); break;case 'right': moveRight(); break;}generateTile();updateBoard();}function moveUp() {for (let i = 0; i < boardSize; i++) {let column = [];for (let j = 0; j < boardSize; j++) {column.push(board[i + j * boardSize].textContent);}let newColumn = slideTiles(column);for (let j = 0; j < boardSize; j++) {board[i + j * boardSize].textContent = newColumn[j];}}}function moveDown() {for (let i = 0; i < boardSize; i++) {let column = [];for (let j = 0; j < boardSize; j++) {column.push(board[i + j * boardSize].textContent);}let newColumn = slideTiles(column.reverse()).reverse();for (let j = 0; j < boardSize; j++) {board[i + j * boardSize].textContent = newColumn[j];}}}function moveLeft() {for (let i = 0; i < boardSize; i++) {let row = [];for (let j = 0; j < boardSize; j++) {row.push(board[i * boardSize + j].textContent);}let newRow = slideTiles(row);for (let j = 0; j < boardSize; j++) {board[i * boardSize + j].textContent = newRow[j];}}}function moveRight() {for (let i = 0; i < boardSize; i++) {let row = [];for (let j = 0; j < boardSize; j++) {row.push(board[i * boardSize + j].textContent);}let newRow = slideTiles(row.reverse()).reverse();for (let j = 0; j < boardSize; j++) {board[i * boardSize + j].textContent = newRow[j];}}}function slideTiles(tiles) {let newTiles = tiles.filter(tile => tile);for (let i = 0; i < newTiles.length - 1; i++) {if (newTiles[i] === newTiles[i + 1]) {newTiles[i] = (parseInt(newTiles[i]) * 2).toString();newTiles[i + 1] = '';}}newTiles = newTiles.filter(tile => tile);while (newTiles.length < boardSize) {newTiles.push('');}return newTiles;}buttons.up.addEventListener('click', () => move('up'));buttons.down.addEventListener('click', () => move('down'));buttons.left.addEventListener('click', () => move('left'));buttons.right.addEventListener('click', () => move('right'));document.addEventListener('keydown', (e) => {switch (e.key) {case 'w': move('up'); break;case 's': move('down'); break;case 'a': move('left'); break;case 'd': move('right'); break;}});initBoard();
});

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://xiahunao.cn/news/3247649.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

Qt日志库QsLog使用教程

前言 最近项目中需要用到日志库。上一次项目中用到了log4qt库&#xff0c;这个库有个麻烦的点是要配置config文件&#xff0c;所以这次切换到了QsLog。用了后这个库的感受是&#xff0c;比较轻量级&#xff0c;嘎嘎好用&#xff0c;推荐一波。 下载QsLog库 https://github.c…

Python、Rust与AI的未来展望

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 非常期待和您一起在这个小…

leetcode简单题27 N.119 杨辉三角II rust描述

// 直接生成杨辉三角当前行 pub fn get_row(row_index: i32) -> Vec<i32> {let mut row vec![1; (row_index 1) as usize];for i in 1..row_index as usize {for j in (1..i).rev() {row[j] row[j] row[j - 1];}}row } // 空间优化的方法 pub fn get_row2(row_ind…

【C#】计算两条直线的交点坐标

问题描述 计算两条直线的交点坐标&#xff0c;可以理解为给定坐标P1、P2、P3、P4&#xff0c;形成两条线&#xff0c;返回这两条直线的交点坐标&#xff1f; 注意区分&#xff1a;这两条线是否垂直、是否平行。 代码实现 斜率解释 斜率是数学中的一个概念&#xff0c;特别是…

Windows 2012安装之实现远程连接

新建虚拟机 点击稍后安装操作系统 点击Microsoft Windows(W) 选择Windows Server 2012 设置虚拟机名称、安装位置 选择你的电脑核数 点击编辑虚拟机设置 点击CD/DVD(SATA) 使用ISO映像文件(M) 配置完之后点击确定 然后开启虚拟机 下一步&#xff1a; 点击现在安装&#xff1a…

【LeetCode】删除排序链表中的重复元素 II

目录 一、题目二、解法完整代码 一、题目 给定一个已排序的链表的头 head &#xff0c; 删除原始链表中所有重复数字的节点&#xff0c;只留下不同的数字 。返回 已排序的链表 。 示例 1&#xff1a; 输入&#xff1a;head [1,2,3,3,4,4,5] 输出&#xff1a;[1,2,5] 示例 …

【单片机毕业设计选题24069】-物联网节水灌溉系统设计

系统功能: 完成基于物联网的节水灌溉系统的电路图以及软件代码编写。要求系统可以通过传感器监测土壤的湿度和环境温湿度&#xff0c;如果土壤湿度低于限值和环境温湿度超过限值&#xff0c;则需开启继电器&#xff0c;打开电机水泵进行供水灌溉&#xff1b;当土壤湿度高于限值…

Python | Leetcode Python题解之第242题有效的字母异位词

题目&#xff1a; 题解&#xff1a; class Solution:def isAnagram(self, s: str, t: str) -> bool:s_c Counter(s)t_c Counter(t)if(len(s_c) ! len(t_c)):return Falseelse:for key, value in s_c.items():if t_c.get(key) ! value:return Falsereturn True

浅谈数学模型在UGC/AIGC游戏数值配置调参中的应用(AI智能体)

浅谈数学模型在UGC/AIGC游戏数值配置调参中的应用 ygluu 卢益贵 关键词&#xff1a;UGC、AIGC、AI智能体、大模型、数学模型、游戏数值调参、游戏策划 一、前言 在策划大大群提出《游戏工厂&#xff1a;AI&#xff08;AIGC/ChatGPT&#xff09;与流程式游戏开发》讨论之后就…

【软件建模与设计】-04-软件设计和体系结构概念

目录 1、类与对象 2、信息隐藏 2.1、示例 3、继承和泛化/特化 4、并发处理 4.1、并发对象间的协作 5、设计模式 6、软件体系结构和构件 7、软件质量属性 1、类与对象 一个对象是现实世界中物理的或概念的实体。 一个对象盖了数据(data)以及作用于数据之上的过程(pro…

缓存和数据库双写的四种策略分析

概述 缓存是提升系统性能的极为简便的手段之一。相较而言&#xff0c;数据库&#xff08;或者 NoSQL 数据库&#xff09;的运行速度较为迟缓&#xff0c;然而速度在很多时候却是决胜的关键要素。采用缓存能够降低响应时间、减轻数据库负载并且节约成本。 正因如此&#xff0c;往…

HTML2048小游戏

源代码在效果图后面 效果图 源代码 <!DOCTYPE html> <html lang"zh-CN"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>2048 Game&l…

银河麒麟搭建ftp服务器

1.先 查看系统架构&#xff0c;一般银河麒麟都是arrch64的 lscpu uname -a cat /etc/os-release 去下载对应版本的vsftp.rpm包和ftp包 Index of /NS/ (cs2c.com.cn) 1.安装rpm rpm -ivh *.rpm --nodeps --force #强制安装 2.修改配置文件 vi /etc/vsftpd/vsftpd.conf anon…

【STC89C51单片机】串口通信

【STC89C51单片机】串口通信 串口简介1. 串口接线方式2. 通信过程 相关寄存器1. SBUF&#xff08;Serial Buffer Register&#xff09;2. SCON&#xff08;Serial Control Register&#xff09;3. PCON&#xff08;Power Control Register&#xff09;4. TCON&#xff08;Timer…

北京青蓝智慧科技CCRC-DCO数据合规官:人工智能遭遇寒冬?

人工智能技术是否真正迈入了新纪元&#xff1f; 历史上&#xff0c;人工智能已经经历了多次起伏&#xff0c;每次都伴随着寒冷的冬天。 然而&#xff0c;为什么这一次的技术变革被看作是人类社会重大转型的关键节点呢&#xff1f;在CES 2024上&#xff0c;吴恩达和李飞飞预言了…

【HZHY-AI300G智能盒试用连载体验】RTC示例程序测试

本文首发于&#xff1a;【   】【HZHY-AI300G智能盒试用连载体验】 智能工业互联网网关 - 北京合众恒跃科技有限公司 - 电子技术论坛 - 广受欢迎的专业电子论坛! (elecfans.com) HZHY-AI300G智能盒默认的系统是Ubuntu&#xff0c;这样非常方便使用&#xff0c;接上USB键盘和…

开发一个自己的chrom插件

开发一个自己的chrom插件 一、创建一个文件夹 二、配置文件manifest.json 创建名字为&#xff1a;manifest.json的配置文件&#xff0c;模板如下&#xff1a; {"manifest_version": 3,"name": "Hello World Extension","version": …

如何防范场外个股期权的交易风险?

场外个股期权交易&#xff0c;作为金融衍生品市场的重要组成部分&#xff0c;为投资者提供了更为灵活和多样化的投资策略。然而&#xff0c;其高杠杆、高风险特性也使得投资者在追求高收益的同时&#xff0c;面临着较大的交易风险。为了有效防范这些风险&#xff0c;投资者需要…

生成式之CycleGAN图像风格迁移互换

模型介绍 CycleGAN是一种循环对抗生成网络&#xff0c;用于实现在没有配对示例的情况下学习将图像从一个域转换到另一个域的方法。它的重要应用领域是域迁移&#xff0c;即图像风格迁移。与之前的模型不同&#xff0c;CycleGAN不需要训练数据成对出现&#xff0c;因此可以实现…

沙尘传输模拟教程(基于wrf-chem)

沙尘传输模拟教程(基于wrf-chem) 文章目录 沙尘传输模拟教程(基于wrf-chem)简介实验目的wrf-chem简介 软件准备wps、wrf-chem安装conda安装ncl安装ncap安装 数据准备气象数据准备下垫面数据准备 WPS数据预处理namelist.wps的设置geogrid.exe下垫面处理ungrib.exe气象数据预处理…