C++ 贪吃蛇(含有图形库和背景音乐)

C++ 贪吃蛇(含有图形库和背景音乐)

1.目前的功能:
1.主界面:有四个选项,分别是开始游戏,制作人员,游戏介绍,退出。
2.游戏内容:随机食物的产生,蛇吃掉食物后增长,蛇头碰到游戏边界死亡,碰到自身的身体死亡。
3.分数的显示:进入游戏后,每次吃掉一个食物增加十分,保存最高分并显示到游戏界面。
4.游戏结束:游戏失败后弹出GAME OVER消息窗,之后返回主界面。

2.游戏部分截图:
游戏主界面
主界面
游戏截图
游戏
游戏结束
游戏结束
使用的头文件
#include
#include<graphics.h>
#include<conio.h>
#include<Windows.h>
#include<MMSystem.h>
#include
#pragma comment(lib,“winmm.lib”)

3.主要源码

#include <iostream>
#include<graphics.h>
#include<conio.h>
#include<Windows.h>
#include<MMSystem.h>            //播放音乐头文件
#include"Score.h"
#include"point.h"
#include"snack.h"
#include"food.h"
#pragma comment(lib,"winmm.lib")            //告诉编译器,加载winmm.lib库文件
using namespace std;

void Menu()                                               //主菜单
{
	initgraph(800, 600);
	loadimage(NULL, "1592727844818.jpeg", 800, 600);
	setbkmode(TRANSPARENT);
	outtextxy(350, 300, "Z.开始游戏");
	outtextxy(350, 350, "X.游戏说明");
	outtextxy(350, 400, "C.制作人员");
	outtextxy(350, 450, "V.退出");
	outtextxy(700, 550, "V 1.0");
}

int GameExplain()                                    //游戏说明
{
	initgraph(800, 600);
	setbkcolor(WHITE);
	loadimage(NULL, "1592727844818.jpeg", 800, 600);
	setbkmode(TRANSPARENT);
	outtextxy(350, 300, "W 控制向上");
	outtextxy(350, 350, "S 控制向下");
	outtextxy(350, 400, "A 控制向左");
	outtextxy(350, 450, "D 控制向右");
	outtextxy(350, 500, "蛇吃到食物即可");
	outtextxy(20, 20, "0.返回");
	char userkey=_getch();
	if (userkey == 0)
	{
		PlaySound(TEXT("游戏菜单选项按键_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
		return 1;
	}
}

int MadePerson()                                                     //制作人员
{
	initgraph(800, 600);
	setbkcolor(WHITE);
	loadimage(NULL, "1592727844818.jpeg", 800, 600);
	setbkmode(TRANSPARENT);
	outtextxy(350, 300, "图形设计:超级无敌聂小龙");
	outtextxy(350, 350, "游戏设计:超级无敌聂小龙");
	outtextxy(350, 400, "动作设计:超级无敌聂小龙");
	outtextxy(350, 450, "程序设计:超级无敌聂小龙");
	outtextxy(350, 500, "反正全都是我!!");
	outtextxy(20, 20, "0.返回");
	char userkey = _getch();
	if (userkey == 0)
	{
		PlaySound(TEXT("游戏菜单选项按键_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
		return 1;
	}
}

int Exit()                                                        //退出
{
	initgraph(800, 600);
	loadimage(NULL, "1592727844818.jpeg", 800, 600);
	setbkmode(TRANSPARENT);
	while (1)
	{
		outtextxy(350, 300, "再见!!");
		outtextxy(20, 20, "按任意键继续");
		outtextxy(600, 20, "按 0 返回");
		Sleep(100);
		char userkey = _getch();
		if (userkey != '0')
		{
			exit(0);
		}
		else
		{
			return 1;
		}
	}
}

void GetFood(Snack* snack, Food* food,Score& score)                  //获取食物互动
{
	if (food->Getpos().x == snack->GetSnkPos(0).x && food->Getpos().y == snack->GetSnkPos(0).y)
	{
		food->SetFoodPos();                           //重新随机食物位置
		snack->GetSnkStSz() += 2;                     //蛇的长度增加一
		score.getscore() += 10;                       //分数加十分
		PlaySound(TEXT("游戏获取能源_通关奖励_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
		//PlaySound(TEXT("bassline背景音乐_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
	}
}


void Game()                                   //游戏模块
{
	initgraph(800, 600);
	setbkcolor(WHITE);
	Snack* psnack = new Snack;               //创建蛇
	Food* pfood = new Food;                  //创建食物
	Score score;

	PlaySound(TEXT("bassline背景音乐_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);
	while (1)
	{
		cleardevice();
		psnack->DrawSnack();                //画蛇
		psnack->MoveSnack();                //蛇的移动
		GetFood(psnack, pfood, score);
		score.ShowScore();
		score.ifsScore();
		pfood->CrtFood();                   //获取食物互动
		if (_kbhit())                        //做条件判断  如果有键盘输入  _kbhit()返回 1,反之返回 0
		{
			psnack->Control();              //控制蛇
		}
		Sleep(50);                         //刷新(控制速度)
		
		if (psnack->GetSnkPos(0).x < 0 || psnack->GetSnkPos(0).y < 0 ||
			psnack->GetSnkPos(0).x>800 || psnack->GetSnkPos(0).y>600 )                   //设置死亡条件: 撞墙 撞身子死亡
		{
			PlaySound(TEXT("游戏结束_失败_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
			MessageBox(NULL, "GAME OVER", "TEXT", MB_OK | MB_SYSTEMMODAL);
		ABG:
			break;
		}
		for (int i = 1; i < psnack->GetSnkStSz(); i++)
		{
			if (psnack->GetSnkPos(0).x == psnack->GetSnkPos(i).x && psnack->GetSnkPos(0).y == psnack->GetSnkPos(i).y)
			{
				PlaySound(TEXT("游戏结束_失败_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
				MessageBox(NULL, "GAME OVER", "TEXT", MB_OK | MB_SYSTEMMODAL);
				goto ABG;
			}
		}
	}
	delete psnack;
	delete pfood;
	
}

int main()
{
	Flag:
	while (1)
	{
		Menu();
		PlaySound(TEXT("游戏循环音乐_耳聆网.wav"),NULL, SND_FILENAME | SND_ASYNC | SND_LOOP);                //播放音乐
		char userkey = 1;
		userkey = _getch();
		switch (userkey)
		{
		case 'z':
			//开始游戏
			PlaySound(TEXT("游戏菜单选项按键_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
			Game();
			break;
		case 'x':
			//游戏说明
			PlaySound(TEXT("游戏菜单选项按键_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
			GameExplain();
			break;
		case 'c':
			//制作人员
			PlaySound(TEXT("游戏菜单选项按键_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
			MadePerson();
			break;
		case 'v':
			//退出
			PlaySound(TEXT("游戏菜单选项按键_耳聆网.wav"), NULL, SND_FILENAME | SND_ASYNC);
			if (Exit() == 1)
			{
				goto Flag;
			}
			break;

		}
	}

	
	_getch();
	closegraph();
	return 0;
}

设置点的类
point.cpp

#pragma once
#include<iostream>
#include<string>

class point
{
public:
	int x;
	int y;
};

下面是蛇的类
Snake.h文件

#pragma once
#include<iostream>
#include<graphics.h>
#include"point.h"
using namespace std;

class Snack
{
public:
	Snack();
	void DrawSnack();         //画蛇
	void MoveSnack();         //移动蛇
	void Control();           //控制蛇      
	int& GetSnkStSz();        //获得私有成员数据接口
	point& GetSnkPos(int pos);  

private:
	point SnackSize[1000];     //设置蛇的最大长度
	int SnackStarSize;         //设置蛇的初始长度
	char goposition;           //蛇的前进方向
	enum position{left,right,up,down};    //枚举出四个方向


protected:
};

Snake.cpp

#include<iostream>
#include<graphics.h>
#include"point.h"
#include"snack.h"
#include <conio.h>
using namespace std;


Snack::Snack()                             //构造函数
{
	SnackStarSize = 3;                    //设置初始长度
	for (int i = 0; i < SnackStarSize; i++)
	{
		SnackSize[i].x = (2-i) * 10;
		SnackSize[i].y = 0;
	}
	goposition = right;                    //默认前进方向
}

void Snack::DrawSnack()                    //画蛇
{
	for (int i = 0; i < SnackStarSize; i++)
	{
		setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));                                  //设置蛇的颜色
		fillrectangle(SnackSize[i].x, SnackSize[i].y, SnackSize[i].x + 10, SnackSize[i].y + 10);      //设置蛇身的位置
	}
}

void Snack::MoveSnack()                         //蛇的移动
{
	/************************************************
	将前一个方块的位置重新赋给后一个方块,实现蛇的移动
	***************************************************/
	for (int i = SnackStarSize-1; i>0; i--)
	{
		SnackSize[i].x = SnackSize[i-1].x;
		SnackSize[i].y = SnackSize[i-1].y;
	}
	/*************************************************
	蛇的移动,每次移动十个单位
	**************************************************/
	switch (goposition)
	{
	case right:
		SnackSize[0].x += 10;
		break;
	case left:
		SnackSize[0].x -= 10;
		break;
	case up:
		SnackSize[0].y -= 10;
		break;
	case down:
		SnackSize[0].y += 10;
		break;
	}
}

void Snack::Control()                //控制蛇的移动
{
	char userkey = _getch();

	switch (userkey)
	{
	case 'w':
	case 'W':
		if (goposition != down)
		{
			goposition = up;
		}
		break;

	case 's':
	case 'S':
		if (goposition != up)
		{
			goposition = down;
		}
		break;

	case 'a':
	case 'A':
		if (goposition != right)
		{
			goposition = left;
		}
		break;

	case 'd':
	case 'D':
		if (goposition != left)
		{
			goposition = right;
		}
		break;
	}
}

int& Snack::GetSnkStSz()        //获得私有成员数据接口
{
	return SnackStarSize;
}

point& Snack::GetSnkPos(int pos) //返回位置
{
	return SnackSize[pos];
}

下面是食物类
Food.h

#pragma once
#include<iostream>
#include<graphics.h>
#include"point.h"
using namespace std;

class Food
{
public:
	Food();
	void CrtFood();            //创建食物
	void SetFoodPos();         //定义食物的位置
	point& Getpos();           //返回食物的位置

private:
	point pos;
};

Food.cpp

#include<iostream>
#include<graphics.h>
#include"point.h"
#include"food.h"
#include"snack.h"

using namespace std;

/********************
构造函数随机食物产生位置
*********************/
Food::Food()                      
{
	pos.x = rand() % 80 * 10;               
	pos.y = rand() % 60 * 10;
}

/************************
随机颜色
*************************/
void Food::CrtFood()
{
	setfillcolor(RGB(rand() % 255, rand() % 255, rand() % 255));
	fillrectangle(pos.x, pos.y, pos.x + 10, pos.y + 10);
}

void Food::SetFoodPos()
{
	pos.x = rand() % 80 * 10;
	pos.y = rand() % 60 * 10;
}

/**************************
返回食物位置
****************************/
point& Food::Getpos()
{
	return pos;
}


下面是分数显示以及保存最高分(分数类)
Score.h

#pragma once
#include<iostream>
#include<string>
#include<fstream>

class Score
{
public:
	Score();                   //读取文件中最高分
	void ShowScore();          //设置新的最高分
	int& getscore();          //接口
	void SaMScore();          //保存最高分
	void ifsScore();          //写出分数

private:
	int score;               //分数
	int Maxscore=0;          //最高分默认为0

protected:
};

Score.cpp

#include<iostream>
#include<string>
#include"food.h"
#include<fstream>
#include"Score.h"
using namespace std;

Score::Score()                   //初始化分数为0
{
	score = 0;

}
/*******************
设置最高分并且显示
********************/
void Score::ShowScore()           
{
	TCHAR s[100];
	settextcolor(RED);
	_stprintf_s(s, _T("你的分数:%d"), score);
	outtextxy(20, 20, s);

	if (score > Maxscore)
	{
		Maxscore = score;
		this->SaMScore();
	}
}

/*********************
返回分数
**********************/
int& Score::getscore()
{
	return score;
}

/*********************
保存最高分
**********************/
void Score::SaMScore()            
{
	ofstream ofs;
	ofs.open("Score.txt", ios::out);
	ofs << Maxscore;
	ofs.close();
}

/*********************
显示最高分
**********************/
void Score::ifsScore()          
{
	ifstream ifs;
	ifs.open("Score.txt", ios::in);     //ios::in:    文件以输入方式打开(文件数据输入到内存)  
	ifs >> Maxscore;
	TCHAR s[100];
	settextcolor(RED);
	_stprintf_s(s, _T("最高分分数:%d"),Maxscore);
	outtextxy(20, 560, s);
}

本人是大一的菜鸡,所以代码可能写的没那么好,文章可能也有一些错误,欢迎各位大佬指正

  • 13
    点赞
  • 66
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值