准备
- 准备一个Dev-C++就可以了
前期
画地图
- 先用一个二维数组来存放游戏的地图,并定义游戏地图的大小
#define X 15
#define Y 15
int gameMap[101][101];
接着写画出地图的函数即可。
void display() {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
switch(gameMap[x][y]) {
case 0: // 空白
cout << " ";
break;
case 1: // 墙
cout << "█";
break;
case 2: // 苹果
cout << "█";
break;
default: // 蛇身
cout << "□";
break;
}
}
cout << endl;
}
}
定义蛇的类
需要依次定义蛇头、尾位置、当前吃食物的个数。
移动(移动头、移动尾)
检查是否越界或者吃到苹果
class Snake {
public:
int x; // 头部位置
int y;
int tx; // 尾巴位置
int ty;
int food;
int point;
FACE face;
Snake(int gameMap[X][Y]) {
init(gameMap);
}
void init(int gameMap[X][Y]) {
x = X / 2;
y = Y / 2;
tx = x;
ty = y;
food = 2;
point = 3;
face = UP_;
gameMap[x][y] = point;
setFood(gameMap);
}
void setFace(FACE f) {
face = f;
}
bool check(int gameMap[X][Y], int x, int y) {
if (x < 0 || y < 0 || x >= X || y >= Y || (gameMap[x][y] != 2 && gameMap[x][y] != 0)) {
return false;
} else {
if (gameMap[x][y] == 2) {
food++;
setFood(gameMap);
}
return true;
}
}
bool move(int gameMap[X][Y]) {
return moveTail(gameMap), moveHead(gameMap);
}
bool moveHead(int gameMap[X][Y]) {
switch(face) {
case UP_:
y--;
break;
case DOWN_:
y++;
break;
case LEFT_:
x--;
break;
case RIGHT_:
x++;
break;
}
if (check(gameMap, x, y)) {
gameMap[x][y] = ++point;
return true;
} else {
return false;
}
}
void moveTail(int gameMap[X][Y]) {
if (food != 0) {
food--;
return;
}
int nextX = tx;
int nextY = ty;
int fx[4] = {1, -1, 0, 0};
int fy[4] = {0, 0, -1, 1};
for (int i = 0; i < 4; i++) {
if (gameMap[tx + fx[i]][ty + fy[i]] == gameMap[tx][ty] + 1) {
nextX = tx + fx[i];
nextY = ty + fy[i];
break;
}
}
gameMap[tx][ty] = 0;
tx = nextX;
ty = nextY;
}
};
写控制函数和随机放苹果的函数
void setFood(int gameMap[X][Y]) {
int tempX, tempY;
srand(time(0));
do {
tempX = rand() % (X - 1) + 1;
tempY = rand() % (X - 1) + 1;
} while (gameMap[tempX][tempY]);
gameMap[tempX][tempY] = 2;
}
void control(int ch) {
switch(ch) {
case 'w':
case 'W':
if (snake.face != DOWN_) {
snake.setFace(UP_);
}
break;
case 'a':
case 'A':
if (snake.face != RIGHT_) {
snake.setFace(LEFT_);
}
break;
case 'd':
case 'D':
if (snake.face != LEFT_) {
snake.setFace(RIGHT_);
}
break;
case 's':
case 'S':
if (snake.face != UP_) {
snake.setFace(DOWN_);
}
break;
}
}
主函数
主函数时刻刷新地图和控制移动蛇。
int main()
{
init();
display();
while (true) {
if (kbhit()) {
char a = getch();
control(a);
}
Sleep(100);
if (snake.move(gameMap)) {
system("cls");
display();
} else {
system("cls");
cout << "GameOver!" << endl;
break;
}
}
return 0;
}
结尾
今天做出来可以玩家自行控制的贪吃蛇,明天我们学习怎么让ta自己找苹果吃。
代码
#include <iostream>
#include <cstring>
#include <conio.h>
#include <windows.h>
#include <cstdlib>
#include <ctime>
using namespace std;
#define X 15
#define Y 15
enum FACE {UP_, DOWN_, RIGHT_, LEFT_};
int gameMap[X][Y];
class Snake {
public:
int x; // 头部位置
int y;
int tx; // 尾巴位置
int ty;
int food;
int point;
FACE face;
Snake(int gameMap[X][Y]) {
init(gameMap);
}
void init(int gameMap[X][Y]) {
x = X / 2;
y = Y / 2;
tx = x;
ty = y;
food = 2;
point = 3;
face = UP_;
gameMap[x][y] = point;
setFood(gameMap);
}
void setFace(FACE f) {
face = f;
}
void setFood(int gameMap[X][Y]) {
int tempX, tempY;
srand(time(0));
do {
tempX = rand() % (X - 1) + 1;
tempY = rand() % (X - 1) + 1;
} while (gameMap[tempX][tempY]);
gameMap[tempX][tempY] = 2;
}
bool check(int gameMap[X][Y], int x, int y) {
if (x < 0 || y < 0 || x >= X || y >= Y || gameMap[x][y] != 0) {
return false;
} else {
if (gameMap[x][y] == 2) {
food++;
setFood(gameMap);
}
return true;
}
}
bool move(int gameMap[X][Y]) {
return moveTail(gameMap), moveHead(gameMap);
}
bool moveHead(int gameMap[X][Y]) {
switch(face) {
case UP_:
y--;
break;
case DOWN_:
y++;
break;
case LEFT_:
x--;
break;
case RIGHT_:
x++;
break;
}
if (check(gameMap, x, y)) {
gameMap[x][y] = ++point;
return true;
} else {
return false;
}
}
void moveTail(int gameMap[X][Y]) {
if (food != 0) {
food--;
return;
}
int nextX = tx;
int nextY = ty;
int fx[4] = {1, -1, 0, 0};
int fy[4] = {0, 0, -1, 1};
for (int i = 0; i < 4; i++) {
if (gameMap[tx + fx[i]][ty + fy[i]] == gameMap[tx][ty] + 1) {
nextX = tx + fx[i];
nextY = ty + fy[i];
break;
}
}
gameMap[tx][ty] = 0;
tx = nextX;
ty = nextY;
}
};
Snake snake(gameMap);
void init();
void display();
void setFood(int gameMap[X][Y]);
void control(int ch);
int main()
{
init();
display();
while (true) {
if (kbhit()) {
char a = getch();
control(a);
}
Sleep(100);
if (snake.move(gameMap)) {
system("cls");
display();
} else {
system("cls");
cout << "GameOver!" << endl;
break;
}
}
return 0;
}
void init() {
memset(gameMap, 0, sizeof(gameMap));
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
if (x == 0 || y == 0 || x == X - 1 || y == Y - 1) {
gameMap[x][y] = 1;
}
}
}
snake.init(gameMap);
}
void display() {
for (int y = 0; y < Y; y++) {
for (int x = 0; x < X; x++) {
switch(gameMap[x][y]) {
case 0: // 空白
cout << " ";
break;
case 1: // 墙
cout << "█";
break;
case 2: // 苹果
cout << "★";
break;
default: // 蛇身
cout << "□";
break;
}
}
cout << endl;
}
}
void setFood(int gameMap[X][Y]) {
int tempX, tempY;
srand(time(0));
do {
tempX = rand() % (X - 1) + 1;
tempY = rand() % (X - 1) + 1;
} while (gameMap[tempX][tempY]);
gameMap[tempX][tempY] = 2;
}
void control(int ch) {
switch(ch) {
case 'w':
case 'W':
if (snake.face != DOWN_) {
snake.setFace(UP_);
}
break;
case 'a':
case 'A':
if (snake.face != RIGHT_) {
snake.setFace(LEFT_);
}
break;
case 'd':
case 'D':
if (snake.face != LEFT_) {
snake.setFace(RIGHT_);
}
break;
case 's':
case 'S':
if (snake.face != UP_) {
snake.setFace(DOWN_);
}
break;
}
}