C++必学项目带背景音乐的贪吃蛇小游戏详细教程

这是一个使用C++在VS2010下开发的贪吃蛇游戏教程,详细介绍了游戏设计流程,包括游戏功能如背景音乐播放、动画效果、不同难度模式和得分显示。项目包含六个核心类,如StartInterface、Map、Food、Snake和Controller,以及自定义的tools函数库。游戏流程中,玩家通过键盘控制蛇移动,吃到食物得分,触碰边界或自身即为游戏结束。教程还展示了如何添加背景音乐,并提供了源代码实现。
摘要由CSDN通过智能技术生成

贪吃蛇小游戏描述

游戏的基本功能如下:

  1. 游戏整个过程播放背景音乐    
  2. 游戏开始前播放贪吃蛇动画
  3. 游戏支持不同难度模式及得分显示 
  4.  游戏实现贪吃蛇的基本功能

项目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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值