蛇形的数据结构的设计及相关的操作:
// 画布的宽度
var x = 20;
// 画布的长度
var y = 20;
// 初始时蛇的长度
var startLength = 10;
// 记录每个蛇的节点信息
var BNode = function() {
this.x = 0;
this.y = 0;
this.directory = 0;// 北 0、南 1、西 2、东 3
}
// 贪吃蛇
var Snake = function() {
// 记录蛇身的信息
this.snakeBody = new Array();
// 改变蛇行走的方向
this.changeDir = function(dir) {
// 修改头节点方向达到调整方向的目的
var node = this.snakeBody[0]
var currDir = node.directory;
// 行走方向必须与当前头节点的行走方向垂直
if(currDir == dir)
return;
else if(currDir == 0 && dir == 1 || currDir == 1 && dir == 0)
return;
else if(currDir == 2 && dir == 3 || currDir == 3 && dir == 2)
return;
node.directory = dir;
}
// 向前移动
this.forword = function() {
// 获取尾节点
var node = this.snakeBody[this.snakeBody.length - 1];
// 将头结点的信息复制个尾节点
node.x = this.snakeBody[0].x;
node.y = this.snakeBody[0].y;
node.directory = this.snakeBody[0].directory;
// 调整列表中的节点位置
this.snakeBody.pop();
this.snakeBody.unshift(node);
switch(node.directory) {
case 0:
node.x = node.x - 1;
break;
case 1:
node.x = node.x + 1;
break;
case 2:
node.y = node.y - 1;
break;
case 3:
node.y = node.y + 1;
break;
}
}
// 判断是否可以移动
this.canMove = function() {
var bNode = this.snakeBody[0];
// 判断是否碰壁
if(bNode.x < 0 || bNode.x > x || bNode.y < 0 || bNode.y > y)
return false;
for(var i = 1; i < this.snakeBody.length; i++)
if(bNode.x == this.snakeBody[i].x && bNode.y == this.snakeBody[i].y)
return false;
// 判断是否碰到自己
return true;
}
// 用来创建初始蛇形
this.create = function() {
// 尚未解决初始就是死蛇的情况
var startX = Math.round(x * Math.random());
var startY = Math.round(y * Math.random());
var startDir = Math.round(3 * Math.random());
for(var i = 0; i < startLength; i++) {
var bNode = new BNode();
switch(startDir){
case 0:
bNode.x = startX - i;
bNode.y = startY;
break;
case 1:
bNode.x = startX + i;
bNode.y = startY;
break;
case 2:
bNode.x = startX;
bNode.y = startY - i;
break;
case 3:
bNode.x = startX;
bNode.y = startY + i;
break;
}
bNode.directory = startDir;
this.snakeBody.unshift(bNode);
}
}
// 获取显示的蛇形html
this.show = function() {
var bNode;
var content = "";
for(var i = 0; i < this.snakeBody.length; i++) {
bNode = this.snakeBody[i];
content += "<div class='bnode' style='top: "+bNode.x*20+"px; left: "+bNode.y*20+"px;'></div></br>";
}
return content;
}
// 构造初始蛇形
this.create();
}
JavaScript 测试脚本:
var snake = new Snake();
var draw ;
window.onload = function() {
draw = document.getElementById("snake");
draw.style.width = x * 20 + "px";
draw.style.height = y * 20 + "px";
draw.innerHTML = snake.show();
}
// 测试运行蛇行走
setInterval("demoMove()",200);
var i = 0;
function demoMove() {
snake.forword();
draw.innerHTML = snake.show();
}
document.onkeydown =function() {
switch(event.keyCode) {
case 38:
snake.changeDir(0);
break;
case 40:
snake.changeDir(1);
break;
case 37:
snake.changeDir(2);
break;
case 39:
snake.changeDir(3);
break;
}
}
<style type="text/css" >
.bnode {
width:20px;
height:20px;
background-color:#0F0;
position:absolute;
}
</style>
<div id="snake" style="background-color:#96C;" ></div>
说明:snake层为蛇出现的地方,以上只是贪吃蛇中“蛇”的基本操作,并未完全实现贪吃蛇的所有功能,所有代码尽请参考。
分享到:
相关推荐
LabWindows/CVI是一款由National Instruments公司开发的交互式可视化编程环境,主要用于开发和调试工业级的...学习和实践这个项目不仅可以提升编程技能,还能深入理解事件驱动编程、数据结构和算法在实际项目中的应用。
- **蛇的移动**:蛇的移动通常采用队列数据结构实现,头部位置作为队首,每次移动时,队首元素更新,然后将旧的头部位置加入队尾,模拟蛇的身体。 - **碰撞检测**:检测蛇是否吃到食物或者撞到自身,这需要用到...
在提供的代码片段中,虽然没有完整的贪吃蛇游戏代码,但是可以看到一些基础的数据结构和逻辑判断的雏形。比如,代码中定义了几个二维字符数组来存储国家、房子、宠物、饮料和香烟的信息,这可能是在模拟游戏中的房间...
此外,排行榜的显示也需要利用QT的数据显示组件,如QTableWidget,将高分信息以表格形式呈现。 在实际编码过程中,开发者还会使用QT的信号和槽(Signal & Slot)机制来处理各种事件,这是QT中的一种重要通信方式。...
贪吃蛇行为学习数据集是用于研究人工智能和强化学习领域的一个宝贵资源,它包含了大量蛇游戏的玩家行为记录。在这款经典游戏中,蛇通过不断吞噬食物来增长,但同时必须避免碰撞到自身或游戏边界,否则游戏结束。数据...
阅读学习了源代码,并做了简单的注释和修改,里面只用了链表数据结构,非常适合C语言入门者学习阅读。 程序可在VS2013下编译运行。 #include #include #include #include #define U 1 #define D 2 #define L 3 #...
在Python环境中,我们可以利用数据结构如队列和栈来实现搜索算法,同时使用二维数组表示游戏地图。每一步,贪吃蛇都会基于当前状态、食物位置和自身身体位置进行决策。决策过程可以通过Q学习或强化学习的其他方法来...
3. **继承与多态**:可能使用继承来构建层次结构,如不同长度的蛇可能继承自同一基类的蛇。多态则允许不同的对象对同一消息作出不同的响应。 4. **事件处理**:游戏循环和用户输入都需要事件驱动编程,Java的AWT或...
这个游戏通常包含程序设计、数据结构(如队列)以及基本的控制逻辑。描述中的"snake basic this code is copy of snake code use c queue to imply ." 提到了代码是贪吃蛇的基本实现,并且利用了C语言的队列来实现...
Table元素在HTML中用于展示结构化数据,而在本项目中,我们将利用它来创建游戏的网格环境。每个表格单元格(td)代表游戏地图上的一个位置,蛇和食物都将在这个网格上移动。 游戏的主体部分是蛇的移动和碰撞检测。...
model/view架构是Qt中用于分离数据和视图的一种设计模式,广泛用于列表、表格等复杂控件的数据展示和管理。 ### 详细知识点 #### 1. Qt简介 - Qt框架是一个跨平台的C++库,支持GUI编程以及网络、数据库、XML处理等...
- **对象操作**:JavaScript 中的对象是一种非常重要的数据结构,可用于模拟复杂的现实世界实体。 #### 三、JavaScript应用实例 - **表单验证**:通过 JavaScript 验证用户输入的有效性,如确保电子邮件格式正确、...
此外,还需掌握表格`<table>`、列表`<ul>`和`<ol>`、图像`<img>`以及表格`<form>`等元素的使用,这些都是创建一个完整网页不可或缺的部分。 在HTML基础上,JavaScript(JS)的引入使得网页具备了动态交互性。JS是一...
实例098 不使用strcpy()函数实现 字符串复制功能 127 实例099 逆序存放数据 129 实例100 相邻元素之和 130 实例101 选票统计 131 实例102 使用数组统计学生成绩 132 实例103 查找数组中的最值 134 实例104 判断一个...
第2部分 数值计算与数据结构篇 实例16 常用的几种排序方法 46 实例17 广度优先搜索及深度优先搜索 53 实例18 实现基本的串操作 59 实例19 计算各点到源点的最短距离 62 实例20 储油问题 65 实例21 中奖...