首页 > 其他分享 >简单的贪吃蛇小游戏

简单的贪吃蛇小游戏

时间:2023-06-30 13:12:01浏览次数:31  
标签:gridSize 20 snakeArray food ctx 小游戏 简单 gameCanvas 贪吃蛇

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Title</title>
</head>
<body>
<h1>画布canvas</h1>
<canvas id="gameCanvas" width="600" height="600" style="">
您的浏览器版本过低,请更新后再试
</canvas>
</body>
</html>
<script>
const gameCanvas = document.getElementById("gameCanvas")
const ctx = gameCanvas.getContext("2d")//获取canvas上下文环境,可以理解成获取了canvas功能
const gridSize = 30
const bgColor = "#ddbb80", snakeColor = "#3333ff", foodColor = "#00ff00"
//声明颜色,到时候可以直接调用
let food
let direction = 1
/* //绘制一条线
ctx.beginPath()//开始绘制
ctx.moveTo(0,20)//把笔移动到这个点
ctx.lineTo(600,20)//画线到这个点
ctx.stroke()//动手画*/

//绘制一个长方形


function drawBoard(){
ctx.fillStyle = bgColor
ctx.fillRect(0, 0, gameCanvas.width, gameCanvas.height) //在0,0这个点,向右向下绘制一个长方形,宽度为width,height

for (let x = 0; x <= gameCanvas.width; x += gridSize) {
ctx.beginPath()
ctx.moveTo(0, x)
ctx.lineTo(600, x)
ctx.stroke()
}
for (let y = 0; y <= gameCanvas.height; y += gridSize) {
ctx.beginPath()
ctx.moveTo(y, 0)
ctx.lineTo(y, 600)
ctx.stroke()
}
}
drawBoard()
//这段代码用于绘制网格,通过循环遍历画布的宽度和高度,依次绘制网格线。
const snakeArray = [45, 44, 43] //蛇初始位置

function drawSquare(color, number) {
ctx.fillStyle = color
ctx.fillRect(number % (gameCanvas.width / gridSize) * gridSize + 1, Math.floor(number / (gameCanvas.width / gridSize)) * gridSize + 1, gridSize - 2, gridSize - 2)
}

function gameOver(){
clearInterval(snakeMoveTimer)
onkeydown=null
}

//snake移动
const snakeMoveTimer = setInterval(() => {
const next=snakeArray[0] + direction

if(next<0||next>399||(snakeArray[0]%20===19&&next%20===0)||(snakeArray[0]%20===0&&next%20===19)||snakeArray.find(value => value===next)){
return gameOver()
}0

snakeArray.unshift(next)
let deleteSnakeItem
if (food!==next) deleteSnakeItem = snakeArray.pop()
else createFood()
drawSquare(bgColor, deleteSnakeItem)
snakeArray.forEach(value => drawSquare(snakeColor, value))
},200)
/*这段代码使用setInterval定时器,每200毫秒更新一次蛇的位置。如果贪吃蛇与食物位置相同,就创建一个新的食物。
如果蛇吃到了食物,同时重新生成一个食物。*/

//绘制食物
/* let food
do {
food = Math.floor(Math.random() * gameCanvas.width / gridSize * gameCanvas.height / gridSize)
} while (snakeArray.filter(value => value === food).length > 0)//生成了新数组,导致内存浪费,不建议使用*/

/* let food;
do {
food = Math.floor(Math.random() * (gameCanvas.width / gridSize) * (gameCanvas.height / gridSize));
} while (snakeArray.some(value => value === food))//同上,但不生成新数组*/
function createFood() {
do {
food = Math.floor(Math.random() * (gameCanvas.width / gridSize) * (gameCanvas.height / gridSize));
} while (snakeArray.find(value => value === food))//同上
drawSquare(foodColor, food)
}
// 通过do while循环随机生成一个位置,直到该位置不在蛇的身体中,然后使用drawSquare方法绘制食物。

createFood()

onkeydown = function (event) {
console.log(event.keyCode)
if (event.keyCode === 37&&direction!==1) {
return direction = -1
}
if (event.keyCode === 38&&direction!==20) {
return direction = -20
}
if (event.keyCode === 39&&direction!==-1) {
return direction = 1
}
if (event.keyCode === 40&&direction!==-20) {
return direction = 20
}

}
// 通过键盘事件,当按下键盘时改变蛇的移动方向。左箭头键对应的方向是 -1,上箭头键对应的方向是 -20,右箭头键对应的方向是 1,下箭头键对应的方向是 20。
</script>

标签:gridSize,20,snakeArray,food,ctx,小游戏,简单,gameCanvas,贪吃蛇
From: https://www.cnblogs.com/ckyjbd/p/17516439.html

相关文章

  • 小游戏——贪吃蛇案例
    一、案例目的 1、实现贪吃蛇游戏基本功能,屏幕上随机出现一个“食物”,称为豆子,上下左右控制“蛇”的移动,吃到“豆子”以后“蛇”的身体加长一点。2、“蛇”碰到边界或蛇头与蛇身相撞,蛇死亡,游戏结束。3、为游戏设计友好的交互界面;例如欢迎界面,游戏界面,游戏结束界面。要有开始键......
  • 贪吃蛇制作js
    <!DOCTYPEhtml><html><head><title>贪吃蛇游戏</title><style>#game-board{width:400px;height:400px;border:1pxsolid#000;position:relative;}.snake{width:20px;height:20......
  • 我制作的一个简单的跳棋小游戏
    我用虚幻5制作的简单的3D跳棋小游戏,可以本地多人对战以及和AI对战,已经上传到了itch.io。目前跳棋功能已经完善,其他棋类游戏留待以后加入。支持中英文。支持两种棋盘,支持经典玻璃弹珠和其他不透明弹珠。游戏网页链接......
  • go爬虫 简单请求
     demo1.go packagemainimport("fmt""io/ioutil""net/http")funcfech(urlstring)string{client:=&http.Client{}req,_:=http.NewRequest("GET",url,nil)req.Header.Set(&quo......
  • 数组简单介绍
    (文章目录)前言本文主要介绍数组的特点和概念,并简单介绍一维数组。一、数组概述特点:1.类型相同的元素组成的集合**(和高中学的集合差不多就是一个数组装着一些数字)**2.空间连续二、一维数组1.一维数组的声明类型+数组名+[元素个数]例:inta[10];//int表示元素类型......
  • 一个简单的makefile文件尝试
      SHARED_CFLAGS=-fPIC-sharedSHARED_SRC=calac_level.cppcalac_level.hBIN_SRC=main.cppSHARED_PATH=-L./-lcalac_levelBIN_CFLAGS=-Wl,-rpath,./-gCC_VERSION=-std=c++11ECHO_RED_COLOR=\033[31mECHO_END=\033[0mLIB_TARGET=libcalac_level.soBIN_TARG......
  • 带头结点单链表插入,删除,查找与排序实现一个简单的基于链表结构的学生管理系统
    链表结构和操作方法////CreatedbyAdministratoron2023/6/12.//#ifndefCODE_LINKEDLIST_H#defineCODE_LINKEDLIST_H#include<iostream>#include<cstring>#include<stdlib.h>#include"student.h"typedefstructlink_list{//......
  • python线程简单使用
    简单使用python定义多线程列子,供读者参考:在下面的示例中,我们定义了两个函数func1和func2,它们都将在新线程中运行。然后,我们使用threading.Thread构造函数创建了两个新线程,并将func1和func2函数作为目标。最后,我们启动了两个线程,并使用join方法等待它们结束。但需要注意的是,如......
  • 蔚来真题和答案,主打一个简单?
    问题来源如下:问题链接:https://www.nowcoder.com/discuss/493178141461041152答案解析1.解释脏读/不可重复读/幻读脏读:指一个事务读取到了另一个事务为提交保存的数据,之后此事务进行了回滚操作,从而导致第一个事务读取了一个不存在的脏数据。不可重复读:在同一个事务中,同一......
  • 构建一个简单的Silverlight应用程序
    我们先来看一看MicrosoftExpressionBlend,使用该工具创建一个XAML格式的非常简单的应用程序,以供Silverlight使用。要在Blend中创建Silverlight应用程序,请选择File(文件)->Newproject(新建项目),此时会打开“NewProject”(新建项目)对话框。请参见图1。选择OK(确定),即会创建......