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); }本人是大一的菜鸡,所以代码可能写的没那么好,文章可能也有一些错误,欢迎各位大佬指正