贪吃蛇小游戏描述
游戏的基本功能如下:
- 游戏整个过程播放背景音乐
- 游戏开始前播放贪吃蛇动画
- 游戏支持不同难度模式及得分显示
- 游戏实现贪吃蛇的基本功能
项目github地址:https://github.com/dddlllyyy/GreedySnake
- 本项目所有都在vs2010编译通过,其他平台未测试。
游戏效果展示
游戏设计流程图
游戏玩法:通过键盘方向键控制蛇上下左右移动,吃到食物得分并增长,碰到墙或者自己的身体则死亡,游戏结束。
游戏具体流程图如下:
游戏中的面向对象(类)关系介绍
项目中一共构造六个类,分别是Point、StartInterface、Map 、Food、Snake、Controller。注意tools不是类,tools.h是自己写的函数库,方便调用tool.h中库函数。tool.h中四种库函数功能分别是:设置控制台窗口大小、设置控制台中光标位置、设置控制台中文字颜色,设置控制台背景颜色。
StartInterface类用于完成开始动画的放映
Map类用于完成地图生成
Food类 用于食物生成、限时食物生成等
snake类用操作蛇移动,检测是否撞到边界或自身等
Controller类Controller类就是控制整个游戏过程的,包括游戏的各个阶段,比如开始动画,游戏难度选择、生成地图、等。
游戏中类的大致关系如下:
游戏中的面向对象(类)关系介绍
游戏添加背景音乐
//加载头文件
#include <windows.h>
#pragma comment(lib, "Winmm.lib")
//调用函数
window.hPlaySound(TEXT("happy8k.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
注意(happy8k.wav这个文件已经放在我建立工程文件夹中,所以此处是相对路径的格式)
- 背景音乐你可以换成你喜欢的,注意要是.wav格式
代码实现
tools.h
#ifndef TOOLS_H
#define TOOLS_H
void SetWindowSize(int cols, int lines);
void SetCursorPosition(const int x, const int y);
void SetColor(int colorID);
void SetBackColor();
#endif
tools.cpp
#include "tools.h"
#include <windows.h>
#include <stdio.h>
void SetWindowSize(int cols, int lines)//设置窗口大小
{
system("title 贪吃蛇*");//设置窗口标题
char cmd[30];
sprintf(cmd, "mode con cols=%d lines=%d", cols * 2, lines);//一个图形■占两个字符,故宽度乘以2
system(cmd);//system(mode con cols=88 lines=88)设置窗口宽度和高度
}
void SetCursorPosition(const int x, const int y)//设置光标位置
{
COORD position;//COORD是Windows API中定义的一种结构,表示一个字符在控制台屏幕上的坐标
position.X = x * 2;
position.Y = y;
//GetStdHandle(STD_OUTPUT_HANDLE)返回标准的输出设备的句柄,也就是获得输出的屏幕缓冲区的句柄
//SetConsoleCursorPosition()是一个window api;作用是设置控制台(cmd)光标位置
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), position);
}
void SetColor(int colorID)//设置文本颜色
{
//SetConsoleTextAttribute()是一个可以在API(应用程序编程接口)中设置控制台窗口字体颜色和背景色的计算机函数
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), colorID);
}
void SetBackColor()//设置文本背景色
{
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE),
FOREGROUND_BLUE |
BACKGROUND_BLUE |
BACKGROUND_GREEN |
BACKGROUND_RED );
}
startinterface.h
#ifndef STARTINTERFACE_H
#define STARTINTERFACE_H
#include "point.h"
#include <vector>
#include <deque>//双端队列也是迭代器
using namespace std;
class StartInterface
{
public:
StartInterface()
{
speed = 20;
startsnake.push_back(Point(0,19));
startsnake.push_back(Point(0,18));//蛇初始化
startsnake.push_back(Point(0,17));
startsnake.push_back(Point(0,16));
startsnake.push_back(Point(0,15));
startsnake.push_back(Point(1,15));
startsnake.push_back(Point(2,15));
startsnake.push_back(Point(2,16));
startsnake.push_back(Point(2,17));
startsnake.push_back(Point(2,18));
startsnake.push_back(Point(2,19));
//SNAKE初始化
textsnake.push_back(Point(-26, 14));//S
textsnake.push_back(Point(-25, 14));
textsnake.push_back(Point(-27, 15));
textsnake.push_back(Point(-26, 16));
textsnake.push_back(Point(-25, 17));
textsnake.push_back(Point(-27, 18));
textsnake.push_back(Point(-26, 18));
textsnake.push_back(Point(-23, 14));//N
textsnake.push_back(Point(-23, 15));
textsnake.push_back(Point(-23, 16));
textsnake.push_back(Point(-23, 17));
textsnake.push_back(Point(-23, 18));
textsnake.push_back(Point(-22, 15));
textsnake.push_back(Point(-21, 16));
textsnake.push_back(Point(-20, 17));
textsnake.push_back(Point(-19, 14));
textsnake.push_back(Point(-19, 15));
textsnake.push_back(Point(-19, 16));
textsnake.push_back(Point(-19, 17));
textsnake.push_back(Point(-19, 18));
textsnake.push_back(Point(-17, 18));//A
textsnake.push_back(Point(-16, 17));
textsnake.push_back(Point(-15, 16));
textsnake.push_back(Point(-14, 15));
textsnake.push_back(Point(-14, 16));
textsnake.push_back(Point(-13, 14));
textsnake.push_back(Point(-13, 16));
textsnake.push_back(Point(-12, 15));
textsnake.push_back(Point(-12, 16));
textsnake.push_back(Point(-11, 16));
textsnake.push_back(Point(-10, 17));
textsnake.push_back(Point(-9, 18));
textsnake.push_back(Point(-7, 14));//K
textsnake.push_back(Point(-7, 15));
textsnake.push_back(Point(-7, 16));
textsnake.push_back(Point(-7, 17));
textsnake.push_back(Point(-7, 18));
textsnake.push_back(Point(-6, 16));
textsnake.push_back(Point(-5, 15));
textsnake.push_back(Point(-5, 17));
textsnake.push_back(Point(-4, 14));
textsnake.push_back(Point(-4, 18));
textsnake.push_back(Point(-2, 14));//E
textsnake.push_back(Point(-2, 15));
textsnake.push_back(Point(-2, 16));
textsnake.push_back(Point(-2, 17));
textsnake.push_back(Point(-2, 18));
textsnake.push_back(Point(-1, 14));
textsnake.push_back(Point(-1, 16));
textsnake.push_back(Point(-1, 18));
textsnake.push_back(Point(0, 14));
textsnake.push_back(Point(0, 16));
textsnake.push_back(Point(0, 18));
};
void PrintFirst();
void PrintSecond();
void PrintThird();
void PrintText();
void ClearText();
void Action();
private:
int speed;//动画速度
vector<Po