1.目前的功能:
1.主界面:有四个选项,分别是开始游戏,制作人员,游戏介绍,退出。
2.游戏内容:随机食物的产生,蛇吃掉食物后增长,蛇头碰到游戏边界死亡,碰到自身的身体死亡。
3.分数的显示:进入游戏后,每次吃掉一个食物增加十分,保存最高分并显示到游戏界面。
4.游戏结束:游戏失败后弹出GAME OVER消息窗,之后返回主界面。
2.游戏部分截图:
游戏主界面
游戏截图
游戏结束
使用的头文件
#include
#include
#include
#include
#include
#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);
}
本人是大一的菜鸡,所以代码可能写的没那么好,文章可能也有一些错误,欢迎各位大佬指正