功能实现

  1. 网格类
  2. 难度属性
  3. 加载纹理,音乐等对象

游戏网格,难度

可以看到,我们的游戏素材都是以下面这种形式存储的,用不同的图片代表游戏中的网格

在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);
}
Last modification:July 12th, 2020 at 01:06 am