最近女朋友挺无聊的(不是左手,也不是右手),决定用C++写一个贪吃蛇的游戏给他玩玩。顺便更新一下博客,把思路记下来。
相信看这篇博客的人都用过诺基亚的手机,玩过贪吃蛇(不接受反驳)。贪吃蛇的玩法就是一条小蛇在转圈圈儿,同时要去吃食物,每吃一个,自身增加1节长度,直到撞到自己或者撞到墙才算失败。游戏规则是非常的简单。相信各位早就看懂了,那接下来就开始敲代码吧:
首先在这个游戏中有蛇,有食物还有墙。因此我们需要设计三个类来依次表示他们。
首先我们先在excel中模拟一下贪吃蛇的游戏过程如下:
我们可以假定用*表示墙,用=表示蛇身,用@表示蛇头,用#表示食物。因此,整个过程我们可以用一个二维数组来维护整个蛇,墙以及食物的状态。先建立一个墙的类,内容如下:
#pragma once
#include<iostream>
class Wall {
public:
enum
{
ROW = 25, COLUMN = 25
};
//构造函数
Wall();
//根据条件设置点的元素,可能为食物,可能为蛇身可能为蛇头
void setPoint(int x, int y, char ele);
//获取某一坐标的元素,用于给需要移动到的下一点判断是否会装上
char getPoint(int x, int y)const;
//在屏幕上输出当前状态
void drawWall();
//重载绘制方法,此时传入一个参数为得分,并写在第一行
void drawWall(unsigned int score);
private:
char gameArr[ROW][COLUMN]; //维护一个二维数组
};
wall.h
然后对墙这个类里面的基本方法进行实现,内容如下:
#include"Wall.h"
//构造函数,先把墙搭建好,即i=0或i=ROW - 1或j=0或j=COLUMN - 1的地方就为墙用'*'表示,其他地方为待使用区域用' '表示
Wall::Wall() {
for (int i = 0; i < ROW; ++i)
for (int j = 0; j < COLUMN; ++j)
if (i == 0 || j == 0 || i == ROW - 1 || j == COLUMN - 1)
this->gameArr[i][j] = '*';
else
this->gameArr[i][j] = ' ';
}
//根据传入的元素,设置点位的状态,可能是食物'#',也可能是蛇头'@'或蛇身'='
void Wall::setPoint(int x, int y, char ele) {
this->gameArr[x][y] = ele;
}
//返回点位的元素,用来判断是否会撞上,或者是否吃到了食物
char Wall::getPoint(int x, int y)const {
return this->gameArr[x][y];
}
//将二维数组中维护的状态输出在屏幕上,同时在右侧加入开发者,玩法等信息
void Wall::drawWall() {
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN; j++)
std::cout << this->gameArr[i][j] << " ";
if (i == 6)
std::cout << "开发者: 方人也WJ";
if (i == 8)
std::cout << "玩法——a: left | w: up | s:down | d: right";
std::cout << std::endl;
}
}
//重载的输出信息,并且通过传入的分数参数计算当前的得分
void Wall::drawWall(unsigned int score) {
for (int i = 0; i < ROW; ++i) {
for (int j = 0; j < COLUMN; j++)
std