用c++的二维数组解决贪吃蛇问题时,蛇向下移,蛇头的坐标应该怎么变化
时间: 2024-03-15 22:42:43 浏览: 14
如果用一个二维数组表示贪吃蛇的游戏画面,那么蛇的身体和食物都可以用数组中的某个值来表示。在贪吃蛇向下移动时,蛇头的纵坐标应该加1,横坐标不变。如果用一个二元组(x,y)表示蛇头的坐标,那么向下移动时就可以写成(x, y+1)。同时,需要将蛇头所在的数组元素的值更新为表示蛇头的值。如果蛇头移动后与食物所在的坐标相同,那么就需要更新食物的位置,并在贪吃蛇的身体上增加一节,即在数组中添加一个新的元素来表示蛇身体的一节。
相关问题
JS二维数组做贪吃蛇
好的,我可以帮你讲一下如何用JS二维数组做贪吃蛇游戏。
首先,我们需要定义一个二维数组来表示贪吃蛇所在的游戏场地。数组的每个元素可以表示一个格子,用0表示空格,用1表示蛇身,用2表示食物。
```javascript
var ROW = 20; // 场地行数
var COL = 20; // 场地列数
var ground = []; // 场地数组
// 初始化场地数组
for (var i = 0; i < ROW; i++) {
ground[i] = [];
for (var j = 0; j < COL; j++) {
ground[i][j] = 0;
}
}
```
接着,我们需要定义一个表示贪吃蛇的数组,用一个二维数组来表示蛇的身体。数组的第一个元素表示蛇头,后面的元素表示蛇身。我们可以定义一个变量来表示蛇的初始长度,然后在场地数组中随机选择一些格子,把它们设为蛇身,直到蛇的长度达到初始长度。
```javascript
var snake = []; // 蛇的身体数组
var initLength = 3; // 蛇的初始长度
// 初始化蛇身体数组
for (var i = 0; i < initLength; i++) {
snake[i] = {row: 0, col: i}; // 蛇头在第0行,第i列
ground[0][i] = 1; // 把场地数组中的对应格子设为蛇身
}
```
接下来,我们需要实现贪吃蛇的移动逻辑。每当蛇移动一格,我们需要把蛇头向前移动一格,并把新的位置设为蛇头。然后我们需要判断蛇头是否撞到了边界或者撞到了自己的身体。如果蛇头撞到了食物,我们需要在场地数组中随机选择一个空格子,把它设为食物。然后我们把蛇的长度加1,并把新的位置设为蛇头。如果蛇头没有撞到边界或者撞到自己的身体,我们需要把蛇尾的位置设为0,表示蛇离开了这个位置。最后,我们需要把新的蛇身体位置设为1,表示蛇移动到了这个位置。
```javascript
var direction = "right"; // 蛇的移动方向
function move() {
// 根据方向计算新的蛇头位置
var newHead = {
row: snake[0].row,
col: snake[0].col
};
switch (direction) {
case "up":
newHead.row--;
break;
case "down":
newHead.row++;
break;
case "left":
newHead.col--;
break;
case "right":
newHead.col++;
break;
}
// 判断蛇头是否撞到边界或者撞到自己的身体
if (newHead.row < 0 || newHead.row >= ROW ||
newHead.col < 0 || newHead.col >= COL ||
ground[newHead.row][newHead.col] === 1) {
// 游戏结束
return false;
}
// 判断蛇头是否撞到食物
if (ground[newHead.row][newHead.col] === 2) {
// 在场地数组中随机选择一个空格子,设为食物
var food = randomFood();
ground[food.row][food.col] = 2;
// 把新的位置设为蛇头
snake.unshift(newHead);
// 蛇的长度加1
length++;
} else {
// 把蛇尾的位置设为0
var tail = snake.pop();
ground[tail.row][tail.col] = 0;
// 把新的位置设为蛇头
snake.unshift(newHead);
}
// 把新的蛇身体位置设为1
ground[newHead.row][newHead.col] = 1;
return true;
}
```
最后,我们需要实现键盘事件,来控制贪吃蛇的移动方向。当用户按下方向键时,我们改变方向变量的值。
```javascript
document.addEventListener("keydown", function(event) {
switch (event.keyCode) {
case 37: // left arrow
if (direction !== "right") {
direction = "left";
}
break;
case 38: // up arrow
if (direction !== "down") {
direction = "up";
}
break;
case 39: // right arrow
if (direction !== "left") {
direction = "right";
}
break;
case 40: // down arrow
if (direction !== "up") {
direction = "down";
}
break;
}
});
```
好了,以上就是用JS二维数组做贪吃蛇游戏的基本实现。当然,还有很多细节需要处理,比如如何随机生成食物,如何计分等等。希望对你有所帮助!
用c++语言面对对象思想,再用vector构建二维数组,写出一个贪吃蛇代码。其中食物类构成,代码
好的,我会尽力回答你的问题。以下是基于C++语言和面向对象思想的贪吃蛇代码,其中使用了vector构建二维数组,同时实现了食物类。
```c++
#include <iostream>
#include <vector>
#include <conio.h>
#include <windows.h>
using namespace std;
// 坐标类
class Coordinate {
public:
int x;
int y;
Coordinate(int _x = 0, int _y = 0) {
x = _x;
y = _y;
}
};
// 食物类
class Food {
public:
Coordinate coordinate;
Food() {
srand((unsigned)time(NULL));
coordinate.x = rand() % 20;
coordinate.y = rand() % 20;
}
void generateFood() {
srand((unsigned)time(NULL));
coordinate.x = rand() % 20;
coordinate.y = rand() % 20;
}
};
// 贪吃蛇类
class Snake {
public:
vector<Coordinate> body;
Coordinate direction;
int length;
Snake() {
length = 3;
direction.x = 1;
direction.y = 0;
body.push_back(Coordinate(0, 0));
body.push_back(Coordinate(1, 0));
body.push_back(Coordinate(2, 0));
}
void move() {
// 计算蛇头新的位置
Coordinate newHead = body[length - 1];
newHead.x += direction.x;
newHead.y += direction.y;
// 判断蛇头是否与食物重合
bool isEatFood = (newHead.x == food.coordinate.x && newHead.y == food.coordinate.y);
// 将蛇头插入到身体最后面
body.push_back(newHead);
// 判断是否吃到了食物
if (!isEatFood) {
// 如果没有吃到食物,将蛇尾移除
body.erase(body.begin());
}
else {
// 如果吃到了食物,重新生成一个食物
food.generateFood();
length++;
}
}
bool isDead() {
// 判断蛇头是否超过边界
if (body[length - 1].x < 0 || body[length - 1].x >= 20 || body[length - 1].y < 0 || body[length - 1].y >= 20) {
return true;
}
// 判断蛇头是否与身体重合
for (int i = 0; i < length - 1; i++) {
if (body[i].x == body[length - 1].x && body[i].y == body[length - 1].y) {
return true;
}
}
return false;
}
private:
Food food;
};
// 游戏类
class Game {
public:
void start() {
while (true) {
// 清空屏幕
system("cls");
// 输出地图
for (int i = 0; i < 20; i++) {
for (int j = 0; j < 20; j++) {
bool isSnake = false;
// 判断该位置是否为蛇身
for (int k = 0; k < snake.length; k++) {
if (snake.body[k].x == j && snake.body[k].y == i) {
isSnake = true;
break;
}
}
// 输出地图
if (isSnake) {
cout << "■";
}
else if (food.coordinate.x == j && food.coordinate.y == i) {
cout << "★";
}
else {
cout << "□";
}
}
cout << endl;
}
// 判断是否死亡
if (snake.isDead()) {
cout << "Game Over" << endl;
break;
}
// 接收用户输入
if (_kbhit()) {
switch (_getch()) {
case 'w':
if (snake.direction.y != 1) {
snake.direction.x = 0;
snake.direction.y = -1;
}
break;
case 's':
if (snake.direction.y != -1) {
snake.direction.x = 0;
snake.direction.y = 1;
}
break;
case 'a':
if (snake.direction.x != 1) {
snake.direction.x = -1;
snake.direction.y = 0;
}
break;
case 'd':
if (snake.direction.x != -1) {
snake.direction.x = 1;
snake.direction.y = 0;
}
break;
}
}
// 移动蛇
snake.move();
// 延时
Sleep(100);
}
}
private:
Snake snake;
Food food;
};
int main() {
Game game;
game.start();
return 0;
}
```
其中,贪吃蛇类包含了蛇的身体、移动方向和长度等信息,食物类包含了食物的位置信息,游戏类包含了游戏的开始、结束和循环等逻辑。整个游戏的流程如下:
1. 初始化贪吃蛇和食物,输出地图;
2. 接收用户输入,移动蛇;
3. 判断是否死亡,如果死亡则结束游戏,否则继续循环;
4. 延时一段时间,再次循环。
希望这个代码能够帮助到你!