功能实现
- 网格类
- 难度属性
- 加载纹理,音乐等对象
游戏网格,难度
可以看到,我们的游戏素材都是以下面这种形式存储的,用不同的图片代表游戏中的网格
在Game.h中
定义枚举
//枚举定义网格状态
typedef enum GRIDSTATE {
ncNull,ncUNDOWN,ncMINE,ncONE,ncTWO,ncTHREE,ncFOUR,ncFIVE,ncSIX,ncSEVEN,ncEIGHT,ncFLAG,ncQ,ncX,ncBOOM,ncUNFOUND
//空地 背景方块 地雷 数字…… 旗子 问号 备用 爆炸的雷 未检测出来的类
};
定义网格的类
class Grid {
public:
int mState; //网格状态
int mStateBackUp; //网格原始状态
bool isPress; //横格是否被点击
};
游戏难度设定
宏定义
#define LVL1_WIDTH 9
#define LVL1_HEIGHT 9
#define LVL1_NUM 10
#define LVL2_WIDTH 16
#define LVL2_HEIGHT 16
#define LVL2_NUM 40
#define LVL3_WIDTH 30
#define LVL3_HEIGHT 16
#define LVL3_NUM 99
初始化纹理,音乐等
Texture tBackground, tTiles, tButtons, tNum, tTimer, tCounter, tGameOver; //创建纹理对象
Sprite sBackground, sTiles, sButtons, sNum, sTimer, sCounter, sGameOver; //创建精灵对象
IntRect buttonRectEasy, buttonRectNormal, buttonRectHard, buttonRectBG, buttonRectSkin, buttonRectRestart, buttonRectQuit;
SoundBuffer sbWin, sbBoom;
Sound soundWin, soundBoom;
Music bk;
新增模块
void Run(); //游戏运行
void Initial(); //初始化函数
void initData();
void loadMediaData();
void mineSet(int pY, int pX); //布雷
void Input(); //键盘,鼠标输入函数
void rButtonDown(Vector2i mPoint); //鼠标右击
void lButtonDown(Vector2i mPoint); //鼠标左击
void lButtonDoubleClick(Vector2i mPoint); //鼠标左键双击
void Logic(); //逻辑判断
void isWin();
void unCover();
void Draw(); //界面绘制函数
void drawGrid();
void drawButton();
void drawScore();
void drawTimer();
void drawGameEnd();
完善后的Game.h
#pragma once
#include <SFML/Graphics.hpp>
#include <SFML/Audio.hpp>
#include <windows.h>
#include <iostream>
#include <sstream>
#define GRIDSIZE 25
#define LVL1_WIDTH 9
#define LVL1_HEIGHT 9
#define LVL1_NUM 10
#define LVL2_WIDTH 12
#define LVL2_HEIGHT 12
#define LVL2_NUM 40
#define LVL3_WIDTH 16
#define LVL3_HEIGHT 16
#define LVL3_NUM 99
//枚举定义网格状态
typedef enum GRIDSTATE {
ncNull, ncUNDOWN, ncMINE, ncONE, ncTWO, ncTHREE, ncFOUR, ncFIVE, ncSIX, ncSEVEN, ncEIGHT, ncFLAG, ncQ, ncX, ncBOOM, ncUNFOUND
//空地 背景方块 地雷 数字…… 旗子 问号 备用 爆炸的雷 未检测出来的类
};
typedef enum GAMEOVERSTATE {
ncNo, //游戏未结束
ncWin, //游戏胜利
ncLose //游戏失败
};
using namespace sf;
class Grid {
public:
int mState; //网格状态
int mStateBackUp; //网格原始状态
bool isPress; //横格是否被点击
};
class Game {
public:
sf::RenderWindow window; //定义游戏窗口
Game();
~Game();
bool gameOver, gameQuit; //游戏结束 游戏退出
int windowWidth, windowHeight, stageWidth, stageHeight; //窗口大小 游戏舞台大小
int mMineNum, mFlagCalc;
int gameLVL, mTime; //游戏难度 游戏计时
Grid mGameData[LVL3_HEIGHT][LVL3_WIDTH]; //舞台尺寸
bool isGameBegin; //游戏是否开始
int isGameOverState; //游戏是否结束
Vector2i mCornPoint; //舞台左顶点坐标
int gridSize; //网格大小
int imgBGNo, imgSkinNo;
Texture tBackground, tTiles, tButtons, tNum, tTimer, tCounter, tGameOver; //创建纹理对象
Sprite sBackground, sTiles, sButtons, sNum, sTimer, sCounter, sGameOver; //创建精灵对象
IntRect buttonRectEasy, buttonRectNormal, buttonRectHard, buttonRectBG, buttonRectSkin, buttonRectRestart, buttonRectQuit;
SoundBuffer sbWin, sbBoom;
Sound soundWin, soundBoom;
Music bk;
Clock gameClock, mouseClickTimer; //游戏计时 鼠标双击计时器
void Run(); //游戏运行
void Initial(); //初始化函数
void initData();
void loadMediaData();
void mineSet(int pY, int pX); //布雷
void Input(); //键盘,鼠标输入函数
void rButtonDown(Vector2i mPoint); //鼠标右击
void lButtonDown(Vector2i mPoint); //鼠标左击
void lButtonDoubleClick(Vector2i mPoint); //鼠标左键双击
void Logic(); //逻辑判断
void isWin();
void unCover();
void Draw(); //界面绘制函数
void drawGrid();
void drawButton();
void drawScore();
void drawTimer();
void drawGameEnd();
};
Game.cpp中完善模块
Game()函数
Game::Game() {
windowWidth = 860; //根据游戏美术素材设定宽高度
windowHeight = 600;
gameLVL = 2; //默认游戏难度
imgBGNo = 1;
imgSkinNo = 1;
window.create(sf::VideoMode(windowWidth, windowHeight), "mineClearance by legroft"); //建立游戏窗口
}
Initial()函数
void Game::Initial() {
window.setFramerateLimit(60); //设置游戏帧数
gridSize = GRIDSIZE; //点击位置块的大小
switch (gameLVL) {
case 1:
stageWidth = LVL1_WIDTH;
stageHeight = LVL1_HEIGHT;
mMineNum = LVL1_NUM;
break;
case 2:
stageWidth = LVL2_WIDTH;
stageHeight = LVL2_HEIGHT;
mMineNum = LVL2_NUM;
break;
case 3:
stageWidth = LVL3_WIDTH;
stageHeight = LVL3_HEIGHT;
mMineNum = LVL3_NUM;
break;
default:
break;
}
gameOver = gameQuit = false;
isGameOverState = ncNo; //初始化游戏结束状态
mFlagCalc = 0; //初始化旗子数量
isGameBegin = false; //初始化游戏是否开始
mTime = 0; //初始化游戏进行时间
mCornPoint.x = (windowWidth - stageWidth * GRIDSIZE) / 2; //设置舞台左上角坐标
mCornPoint.y = (windowHeight - stageHeight * GRIDSIZE) / 2;
initData(); //初始化数据
loadMediaData(); //加载素材
}
initData()函数
void Game::initData() {
int i, j;
for ( i = 0; i < stageHeight; i++) { //所有网格为空且未被点击
for ( j = 0; j < stageWidth; j++) {
mGameData[j][i].mState = ncUNDOWN;
mGameData[j][i].isPress = false;
}
}
}
loadMediaData()函数
void Game::loadMediaData() {
stringstream ss;
ss << "data/images/BKO" << imgBGNo << ".jpg";
if (!tBackground.loadFromFile(ss.str())) {
cout << "BK image 没有找到" << endl;
}
ss.str(""); //清空字符串
ss << "data/images/Game" << imgSkinNo << ".jpg";
if (!tTiles.loadFromFile(ss.str())) {
cout << "Game Skin image 没有找到" << endl;
}
if (!tNum.loadFromFile("data/images/num.jpg")) {
cout << "num.jpg 没有找到" << endl;
}
if (!tTimer.loadFromFile("data/images/jishiqi.jpg")) {
cout << "jishiqi.jpg 没有找到" << endl;
}
if (!tCounter.loadFromFile("data/images/jishuqi.jpg")) {
cout << "jishuqi.jpg 没有找到" << endl;
}
if (!tButtons.loadFromFile("data/images/button.jpg")) {
cout << "button.jpg 没有找到" << endl;
}
if (!tGameOver.loadFromFile("data/images/gameover.jpg")) {
cout << "gameover.jpg 没有找到" << endl;
}
sBackground.setTexture(tBackground);
sTiles.setTexture(tTiles);
sButtons.setTexture(tButtons);
sNum.setTexture(tNum);
sTimer.setTexture(tTimer);
sCounter.setTexture(tCounter);
sGameOver.setTexture(tGameOver);
}