代码模式怎么用?在通义官网点击代码模式,在对话框用大白话描述你的需求,通义会自动生成代码及应用预览。
请你创建一个经典的2048游戏实现,使用HTML、CSS和JavaScript编写,集成在一个html文件中。该游戏通过一个4x4的网格来组织数字块,玩家的目标是通过合并相同的数字块,最终达到2048的数字。游戏具有基本的交互逻辑,支持通过按钮控制四个方向(上、下、左、右)移动块。
1. HTML 结构
<!DOCTYPE html>: 定义文档类型为HTML5。
<html lang="en">: 定义文档语言为英语。
<head>: 包含网页的元信息,如字符集、视口设置和标题。
meta charset="UTF-8": 使用UTF-8字符编码。
meta name="viewport" content="width=device-width, initial-scale=1.0": 适配移动设备。
<title>: 网页标题,显示为“2048 Game”。
<body>: 网页主体内容,包括一个游戏界面。
.container:包含标题、网格和控制按钮。
<h1>:游戏标题,字体颜色为#333,大小1.5em。
.grid:游戏的主网格,包含16个格子(4x4),使用CSS Grid布局。
.button-container:包含四个按钮用于控制游戏的移动方向。
2. CSS 样式
字体与布局:
使用 avenir 字体,若不可用则使用 sans-serif。
使用Flexbox将游戏居中显示,justify-content: center 和 align-items: center 使游戏垂直水平居中,height: 100vh 确保高度占满整个视口,margin: 0 移除默认边距。
背景颜色为白色(#ffffff)。
网格样式:
.grid 使用CSS Grid布局,定义为4行4列的网格,每个格子的宽高为60px,格子之间有6px的间隙(gap: 6px),背景色为浅米色(#FFE2B5),并有12px的内边距和10px的圆角。
单元格样式:
每个 .cell 单元格的宽高为60px,使用Flexbox使内容居中显示,背景颜色默认是浅灰色(#eee),字体颜色为深灰色(#333)。
数字块根据其值改变背景色,例如:
2 的背景色为浅米色(#eee4da)。
4 的背景色为米色(#ede0c8)。
8、16、32、64 等的背景色逐渐变深,文字颜色为白色(#f9f6f2)。
最大的块 2048 背景为深黄色(#edc22e)。
按钮样式:
按钮使用橙色背景(#f57c00),鼠标悬停时背景色变浅(#fb8c00),并具有轻微放大的效果(transform: scale(1.05))。
按钮文本颜色为白色,字体大小为10px,字体使用 avenir 字体,按钮之间有3px的间隔。
3. JavaScript 逻辑
初始化游戏:
游戏初始化时,首先在网格中随机生成两个数字块(值为2或4),然后渲染网格并展示。
添加随机方块:
addRandomTile 函数会在空白格子中随机选择一个位置生成数字块,90%的概率生成2,10%的概率生成4。
渲染网格:
render 函数遍历 grid 数组中的每个值,将其渲染为相应的单元格。若值为0,则显示为空格(.empty),否则显示相应的数字和背景色。
移动和合并逻辑:
move 函数接收一个方向参数(up, down, left, right),根据按钮的点击方向,调用合并和移动的处理逻辑。
移动时,数字块会移动并合并相同的数字,合并后数字加倍,空出的格子会被填充为0。
处理完一轮移动后,会添加一个新的随机数字块,并检查游戏是否结束。
合并数字:
mergeCells 函数接收一个数组,首先过滤掉值为0的元素,然后尝试合并相邻的相同数字,合并后数字加倍,空出的格子会被填充为0。
最后返回合并后的数组,确保数组长度为4。
检查游戏是否结束:
checkGameOver 函数检查是否有空格子或相邻的相同数字,如果没有,则返回游戏结束。
4. 交互逻辑
玩家可以点击上下左右四个按钮来控制数字块的移动。
每次移动后,新的随机块会被加入网格,更新视图。
游戏结束时,会弹出“Game Over”提示。
5. 画布和响应式设计
游戏界面使用Flexbox居中,适应不同设备屏幕的宽度和高度。
网格大小固定,4x4的格子适应不同屏幕,但每个格子的大小(60px)是固定的。