目录
游戏简介
贪吃蛇是一款经典的单人小游戏,玩家通过控制蛇的移动,吃掉食物来增加长度,避免撞到墙壁或自身,挑战最高分数。本文将详细介绍该贪吃蛇小游戏的功能、玩法以及代码实现。
游戏功能与特点
- 动态网格系统:根据选中的模式调整网格大小和游戏区域。
- 可选模式:提供20x20、30x30、40x40、50x50四种网格模式,适应不同难度需求。
- 难度调节:支持六档难度,从0.5秒到0.05秒不等,速度快则难度高。
- score计分系统:吃掉食物得10分,实时显示当前得分。
- 游戏重启:游戏结束后显示最终分数,玩家可重新开始挑战。
如何玩转贪吃蛇
游戏目标
控制蛇向食物(红方块)移动,每次吃掉食物蛇会变长,得分增加,避免碰到边界或自己。基本操作
- 方向控制:上下左右箭头键或W、A、S、D键。
- 开始游戏:点击“开始游戏”按钮启动。
注意事项
- 避免让蛇头撞到墙壁。
- 确保蛇不与自身碰撞。
游戏设计与实现
HTML结构
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>贪吃蛇</title>
<link rel="stylesheet" href="css/greedy_snake.css">
</head>
<body>
<!-- 导航、游戏容器等DOM元素 -->
<script src="js/greedy_snake.js"></script>
</body>
</html>
JavaScript核心实现
参数初始化
let gridSize = 20; // 网格大小 let snake = []; // 蛇的身体数组 let food = {}; // 食物位置 let dx = 0; // 横向移动单位 let dy = 0; // 纵向移动单位 let score = 0; // 当前分数 let gameSpeed = 1000; // 默认移动速度 let isGameRunning = false; // 游戏运行状态
主要函数
initGame():初始化游戏参数、蛇的起始位置和食物。 draw():绘制游戏界面,包括食物和蛇的各个段。 update():更新蛇的位置,检查是否吃到食物或发生碰撞。 gameLoop():游戏主循环,控制绘制和更新的频率。 generateFood():随机生成食物,确保不在蛇身上。 isCollision():检查蛇头是否碰到边界或自身。
事件监听
document.addEventListener('keydown', (event) => {
// 根据键盘输入调整蛇的方向
const key = event.key.toLowerCase();
switch (key) {
case 'arrowup':
case 'w':
if (dy !== 1) { dx = 0; dy = -1; }
break;
// 其他方向类似处理
}
});
代码结构:
greedy_snake.html:
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>贪吃蛇</title>
<link rel="stylesheet" href="css/greedy_snake.css">
</head>
<body>
<nav class="navbar">
<ul>
<li><a href="/index.html">首页</a></li>
<li><a href="/greedy_snake.html">贪吃蛇</a></li>
<li><a href="/other.html">其他游戏</a></li>
</ul>
</nav>
<div class="game-container">
<div class="settings">
<div class="select-mode">
<label for="mode">模式:</label>
<select id="mode">
<option value="20">20x20</option>
<option value="30" selected>30x30</option>
<option value="40">40x40</option>
<option value="50">50x50</option>
</select>
</div>
<div class="select-difficulty">
<label for="difficulty">难度:</label>
<select id="difficulty">
<!-- 默认为0.6秒/次 -->
<option value="1">1(0.5秒/次)</option>
<option value="2">2(0.4秒/次)</option>
<option value="3" selected>3(0.3秒/次)</option>
<option value="4">4(0.2秒/次)</option>
<option value="5">5(0.1秒/次)</option>
<option value="6">6(0.0.5秒/次)</option>
</select>
</div>
<button id="generate">开始游戏</button>
</div>
<div id="result" class="result"></div>
<canvas id="gameCanvas" class="game-canvas"></canvas>
</div>
<script src="js/greedy_snake.js"></script>
</body>
</html>
greedy_sanke.js:
const canvas = document.getElementById('gameCanvas');
const ctx = canvas.getContext('2d');
// 设置Canvas大小
canvas.width = 800;
canvas.height = 400;
// 游戏参数
let gridSize = 20; // 网格大小
let snake = []; // 蛇的身体数组
let food = {}; // 食物位置
let dx = 0; // 横向移动单位
let dy = 0; // 纵向移动单位
let score = 0; // 当前分数
let gameSpeed = 1000; // 默认移动速度
let isGameRunning = false; // 游戏运行状态
// 初始化游戏
function initGame() {
}
// 初始化蛇的位置
function initSnake() {
}
// 生成食物
function generateFood() {
}
// 绘制游戏界面
function draw() {
}
// 更新蛇的位置
function update() {
}
// 检查碰撞
function isCollision() {
}
// 游戏主循环
function gameLoop() {
}
// 开始游戏
function startGame() {
}
// 游戏结束
function gameOver() {
}
// 监听键盘事件
document.addEventListener('keydown', (event) => {
});
// 初始化游戏
initGame();
draw();
// 监听开始按钮点击事件
document.getElementById('generate').addEventListener('click', startGame);
greedy_snake.css:
body {
font-family: Arial, sans-serif;
background-color: #f2f2f2;
margin: 0;
padding: 0;
}
.navbar {
background-color: #4CAF50; /* 导航栏背景色 */
overflow: hidden;
}
.navbar ul {
list-style-type: none; /* 去掉默认的列表样式 */
padding: 0;
margin: 0;
display: flex; /* 使用 Flexbox 布局 */
justify-content: center; /* 居中对齐 */
}
.navbar li {
float: left;
}
.navbar li a {
display: block;
color: white; /* 链接颜色 */
text-align: center;
padding: 14px 20px; /* 内边距 */
text-decoration: none; /* 去掉下划线 */
}
.navbar li a:hover {
background-color: #3e8e41; /* 悬停效果 */
}
.game-container {
max-width: 80%;
max-height: 80%;
margin: 20px auto;
text-align: center;
overflow: auto;
background-color: #fff; /* 游戏容器背景色 */
border-radius: 10px;
box-shadow: 0 0 10px rgba(0, 0, 0, 0.1);
padding: 20px; /* 内边距 */
}
.game-canvas {
max-width: 80%;
height: 600px;
max-height: 80%;
border: 2px solid #333;
background-color: #fff;
}
.settings {
margin: 20px;
}
.select-mode, .select-difficulty {
margin: 10px 0;
}
.select-mode, .select-difficulty {
margin-bottom: 10px;
padding: 5px;
display: inline-block;
}
.select-mode label, .select-difficulty label {
display: inline-block;
width: 50px;
}
select {
padding: 5px;
border: 1px solid #ccc;
border-radius: 4px;
}
button {
padding: 8px 16px;
background-color: #4CAF50;
color: white;
border: none;
border-radius: 4px;
cursor: pointer;
}
button:hover {
background-color: #45a049;
}
/* 自定义滚动条样式 */
::-webkit-scrollbar {
width: 8px;
height: 8px;
}
::-webkit-scrollbar-track {
background: #f1f1f1;
}
::-webkit-scrollbar-thumb {
background: #888;
border-radius: 4px;
}
::-webkit-scrollbar-thumb:hover {
background: #555;
}
效果
关于“其他游戏”
通过iframe展示的3个链接的小游戏,点击选中的小游戏,游戏区域会自动展示该游戏界面.