#include <Windows.h>
#include <iostream>
#include "snake.h"
#include "map.h"
using namespace std;
Snake::Snake(int width, int height) {
Snake::head = '@';
Snake::body = '=';
init(width, height);
}
void Snake::init(int width, int height) {
//蛇头应该生成在除墙壁以外的位置
int headX = (rand() % (width - 2)) + 1;
int headY = (rand() % (height - 2)) + 1;
//第一个蛇身可选位置为蛇头的上下左右
int body1SelectableP[4][2] = {{headX - 1, headY}, {headX + 1, headY}, {headX, headY - 1}, {headX, headY + 1}};
int* body1P;
while (true) {
body1P = body1SelectableP[rand() % 4];
//但是上下左右有可能某个是石头,如果是石头就重选
if (body1P[0] != 0 && body1P[0] != (width - 1) && body1P[1] != 0 && body1P[1] != (height - 1))
break;
}
//第二个蛇身可选位置为第一个蛇身的上下左右
int body2SelectableP[4][2] = {{body1P[0] - 1, body1P[1]}, {body1P[0] + 1, body1P[1]}, {body1P[0], body1P[1] - 1}, {body1P[0], body1P[1] + 1}};
int* body2P;
while (true) {
body2P = body2SelectableP[rand() % 4];
//但是上下左右有可能某个是石头或蛇头,如果没有选到空位置就重选
if ((body2P[0] != 0 && body2P[0] != (width - 1) && body2P[1] != 0 && body2P[1] != (height - 1)) && (body2P[0] != headX || body2P[1] != headY))
break;
}
/*蛇的当前方向,在这里也是初始方向,是由第一个蛇身和蛇头的位置决定的,蛇头的位置决定了当前方向可能会是蛇头的上下左右(废话),
而可以把蛇身的位置看做是当前方向的反方向,即如果蛇身位置在蛇头下方,那当前方向就是上,如果在左面,当前方向就是右*/
if (headX == body1P[0]) {
if (body1P[1] < headY)
direction = DOWN;
else
direction = UP;
}
else {
if (body1P[0] < headX)
direction = RIGHT;
else
direction = LEFT;
}
length = 3;
Snake::headX = headX;
Snake::headY = headY;
int *a = new int[2];
int *b = new int[2];
a[0] = body1P[0];
a[1] = body1P[1];
b[0] = body2P[0];
b[1] = body2P[1];
bodyPositions.push_back(a);
bodyPositions.push_back(b);
}
char Snake::getHead() {
return head;
}
char Snake::getBody() {
return body;
}
int Snake::getNextX() {
if (direction == LEFT) {
return headX - 1;
}
if (direction == RIGHT) {
return headX + 1;
}
return headX;
}
int Snake::getNextY() {
if (direction == UP) {
return headY - 1;
}
if (direction == DOWN) {
return headY + 1;
}
return headY;
}
int Snake::getDirection() {
return direction;
}
void Snake::setDirection(int direction) {
Snake::direction = direction;
}
int Snake::getHeadX() {
return headX;
}
int Snake::getHeadY() {
return headY;
}
int Snake::getBodyX(int index) {
return bodyPositions.at(index)[0];
}
int Snake::getBodyY(int index) {
return bodyPositions.at(index)[1];
}
void Snake::addBody(int index, int x, int y) {
int *a = new int[2];
a[0] = x;
a[1] = y;
bodyPositions.insert(bodyPositions.begin() + index, a);
length++;
}
void Snake::removeBody(int index) {
bodyPositions.erase(bodyPositions.begin() + index);
length--;
}
void Snake::setHeadPosition(int x, int y) {
headX = x;
headY = y;
}
int Snake::getLength() {
return length;
}
int Snake::notGo() {
if (direction == UP)
return DOWN;
if (direction == DOWN)
return UP;
if (direction == LEFT)
return RIGHT;
return LEFT;
}