栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

C++小游戏之“小货兵摆大炮”

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

C++小游戏之“小货兵摆大炮”

背景

记得小时候经常和爷爷在水泥地上,随手抓来两颗石子,一边口里念叨“小货兵摆大炮”,一边在地上划下横竖各6条道,然后在从旁边的土地上捡一些小石子和两个大石块,小石子代表小兵,大石块代表大炮。

游戏规则
  1. 小兵每次可移动一步,方向为前后左右。
  2. 大炮每次可移动一步,方向为前后左右。当大炮与小兵中间有一个空位,大炮可以选择吃掉小兵。
  3. 大炮与小兵的移动范围不能超过棋盘边界。
胜利规则
  1. 当大炮无法移动时,小兵获胜,即小兵把大炮逼到游戏边界处。
  2. 当小兵被大炮全部干掉时,大炮获胜。
代码实现
  1. Bing.cpp
#include "Bing.h"

Bing::Bing(int _x,int _y):x(_x),y(_y)
{
    length = 6;
    width = 6;
}

bool Bing::Move(Dir dir){
    //0,1,2,3,4,……,x (width)
    //1
    //2
    //3
    //……
    //y
    //(length)
    
    bool flag = true;
    switch (dir){
        case Dir::Up:
            if(x>0)
                x--;
            else
                return false;
            break;
        case Dir::Down:
            if(x0)
                y--;
            else
                return false;
            break;
        case Dir::Right:
            if(y < width-1)
                y++;
            else
                return false;
            break;
        default:
            break;
    }
    return true;
}

std::pair Bing::getPosition(){
    std::pair res(x,y);
    return res;
}


Bing::~Bing()
{
}
  1. Bing.h
#ifndef BING_H_
#define BING_H_

#include 

enum class Dir{
    Up = 0,
    Down,
    Left,
    Right
};

class Bing
{
private:
    int x;
    int y;

    int length;
    int width;

public:
    Bing(int _x,int _y);
    bool Move(Dir dir);
    std::pair getPosition();
    ~Bing();
};

#endif
  1. Pao.h
#ifndef PAO_H_
#define PAO_H_

#include "Bing.h"

class Pao:public Bing
{
private:
    
public:
    Pao(int _x,int _y);
    ~Pao();
};

#endif
  1. Pao.cpp
#include "Pao.h"

Pao::Pao(int _x,int _y):Bing(_x,_y)
{
}

Pao::~Pao()
{
}

  1. Game.h
#include "Bing.h"
#include "Pao.h"

#include 

class Game
{
private:
    int length;
    int width;
    int bingRows;
    int paoNum;
    int **sence;

    std::vector bings;
    std::vector delBings;
    
    std::vector paos;
    
public:

    Game();
   
    void updateSence();
    void show();

    bool isBingsWin();
    bool isPaosWin();
    
    bool MovePao();
    bool MoveBing();
    void run();

    ~Game();
};



  1. Game.cpp
#include 
#include "Game.h"

using namespace std;

Game::Game()
{
    length = 6;
    width = 6;
    bingRows = 3;
    paoNum = 2;
    sence = new int*[length];
    for(int i=0;i
        sence[i] = new int[width];
    }

    for(int i=0;i
        for(int j=0;j
            Bing* bing = new Bing(i,j);
            bings.push_back(bing);
        }
    }

    int row = bingRows-1+2;
    int col = width/2-1;
    for(int i=0;i
        Pao* pao = new Pao(row,col+i);
        paos.push_back(pao);
    }

}

void Game::updateSence(){
    for(int i=0;i
        for(int j=0;j
            sence[i][j] = 0;
        }
    }
    for(int i=0;i
        for(auto bing:bings){
            auto pos = bing->getPosition();
            sence[pos.first][pos.second] = 1;
        }
    }
    for(auto pao:paos){
        auto pos = pao->getPosition();
        sence[pos.first][pos.second] = 2;
    }
}

void Game::show(){
    updateSence();
    for(int i=0;i
        for(int j=0;j
            if(sence[i][j] == 1){
                printf("* ");
            }else if(sence[i][j] == 2){
                printf("+ ");
            }else{
                printf("  ");
            }
        }
        printf("n");
    }
}

bool Game::isBingsWin(){
    bool flag = true;
    for(auto pao:paos){
        auto pos = pao->getPosition();

        auto up = std::make_pair(pos.first-1,pos.second);
        if(up.first>=0&&up.first=0&&up.second
            if(sence[up.first][up.second] == 0){
                flag = false;
            }
        }

        up = std::make_pair(pos.first+1,pos.second);
        if(up.first>=0&&up.first=0&&up.second
            if(sence[up.first][up.second] == 0){
                flag = false;
            }
        }
        up = std::make_pair(pos.first,pos.second-1);
        if(up.first>=0&&up.first=0&&up.second
            if(sence[up.first][up.second] == 0){
                flag = false;
            }
        }
        up = std::make_pair(pos.first,pos.second+1);
        if(up.first>=0&&up.first=0&&up.second
            if(sence[up.first][up.second] == 0){
                flag = false;
            }
        }

    }
    return flag;
}

bool Game::isPaosWin(){ 
    if(bings.size()<4){
        return true;
    }
    return false;
}

bool Game::MovePao(){
    Pao* pao;
    printf("请选择你要移动的炮(1/2):");
    int x;
    
    cin>>x;
    if(x != 1 && x != 2){
        printf("你选择的炮无效,请重新选择!n");
        return false;
    }
    

    pao = paos[x-1];
    auto pos = pao->getPosition();

    printf("请选择你要进行的操作(移动:1 / 吃兵:2):");
    
    cin>>x;
    if(x != 1 && x != 2){
        printf("你选择的操作无效,请重新选择!n");
        return false;
    }

    if(x == 1){
        printf("请选择你要移动的方向(上:w /下:s /左:a /右:d):");
        char ch;
        bool flag = false;
       
        cin>>ch;
        if(ch == 'w' || ch == 's' ||ch == 'a' ||ch == 'd'){
            switch (ch)
            {
            case 'w':
                if(pos.first > 0 && sence[pos.first-1][pos.second] == 0){
                    pao->Move(Dir::Up);
                    flag = true;
                }
                break;
            case 's':
                if(pos.first < length-1 && sence[pos.first+1][pos.second] == 0){
                    pao->Move(Dir::Down);
                    flag = true;
                }
                break;
            case 'a':
                if(pos.second > 0 && sence[pos.first][pos.second-1] == 0){
                    pao->Move(Dir::Left);
                    flag = true;
                }
                break;
            case 'd':
                if(pos.second < width-1 && sence[pos.first][pos.second+1] == 0){
                    pao->Move(Dir::Right);
                    flag = true;
                }
                break;
            default:
                break;
            }
        }
        if(flag){
            return true;
        }
        else{
            printf("你选择的方向无效,请重新选择!n");
            return false;
        }
       
    }else if(x == 2){
        printf("请选择你要移动的方向(上:w /下:s /左:a /右:d):");
        char ch;
        bool flag = false;
       
        cin>>ch;
        if(ch == 'w' || ch == 's' ||ch == 'a' ||ch == 'd'){
            switch (ch)
            {
            case 'w':
                if(pos.first > 1 && sence[pos.first-2][pos.second] == 1 && sence[pos.first-1][pos.second] == 0){
                    pao->Move(Dir::Up);
                    pao->Move(Dir::Up);
                    pos = pao->getPosition();
                    auto begin = bings.begin();
                    while (begin != bings.end())
                    {
                        if(pos == (*begin)->getPosition()){
                            delBings.push_back(*begin);
                            bings.erase(begin);
                            break;
                        }
                        begin++;
                    }
                    flag = true;
                }
                break;
            case 's':
                if(pos.first < length-2 && sence[pos.first+2][pos.second] == 1 && sence[pos.first+1][pos.second] == 0){
                    pao->Move(Dir::Down);
                    pao->Move(Dir::Down);
                    pos = pao->getPosition();
                    auto begin = bings.begin();
                    while (begin != bings.end())
                    {
                        if(pos == (*begin)->getPosition()){
                            delBings.push_back(*begin);
                            bings.erase(begin);
                            break;
                        }
                        begin++;
                    }
                    flag = true;
                }
                break;
            case 'a':
                if(pos.second > 1 && sence[pos.first][pos.second-2] == 1 && sence[pos.first][pos.second-1] == 0){
                    pao->Move(Dir::Left);
                    pao->Move(Dir::Left);
                    pos = pao->getPosition();
                    auto begin = bings.begin();
                    while (begin != bings.end())
                    {
                        if(pos == (*begin)->getPosition()){
                            delBings.push_back(*begin);
                            bings.erase(begin);
                            break;
                        }
                        begin++;
                    }
                    flag = true;
                }
                break;
            case 'd':
                if(pos.second < width-2 && sence[pos.first][pos.second+2] == 1 && sence[pos.first][pos.second+1] == 0){
                    pao->Move(Dir::Right);
                    pao->Move(Dir::Right);
                    pos = pao->getPosition();
                    auto begin = bings.begin();
                    while (begin != bings.end())
                    {
                        if(pos == (*begin)->getPosition()){
                            delBings.push_back(*begin);
                            bings.erase(begin);
                            break;
                        }
                        begin++;
                    }
                    flag = true;
                }
                break;
            default:
                break;
            }
        }
        if(flag){
            return true;
        }
        else{
            printf("你选择的方向无效,请重新选择!n");
            return false;
        }

    }

}

bool Game::MoveBing(){
    printf("请选择你要移动的兵的位置(x,y):");
    int x,y;
    
    cin>>x>>y;
    if(x>0&&x<=length&&y>0&&y<=width&&sence[x-1][y-1]==1){
        
    }else{
        printf("你选择的位置无效,请重新选择!n");
        return false;
    }

    std::pair pos(x-1,y-1);
    Bing* b;
    for(auto bing:bings){
        if(pos == bing->getPosition()){
            b = bing;
            break;
        }
    }

    printf("请选择你要移动的方向(上:w /下:s /左:a /右:d):");
    char ch;
    cin>>ch;
    bool flag = false;
    switch (ch)
    {
    case 'w':
        if(pos.first>0&&sence[pos.first-1][pos.second] == 0){
            b->Move(Dir::Up);
            flag = true;
        }
        break;
    case 's':
        if(pos.first
            b->Move(Dir::Down);
            flag = true;
        }
        break;
    case 'a':
        if(pos.second>0&&sence[pos.first][pos.second-1] == 0){
            b->Move(Dir::Left);
            flag = true;
        }
        break;
    case 'd':
        if(pos.second
            b->Move(Dir::Right);
            flag = true;
        }
        break;
    default:
        break;
    }
    if(!flag){
        printf("你选择的方向无效,请重新选择!n");
    }
    return flag;
}

void Game::run(){
    while(true){
        system("clear");
        show();
        if(isBingsWin()){
            printf("小兵获胜!n");
            break;
        }
        while (!MovePao()){}
        system("clear");
        show();
        if(isPaosWin()){
            printf("大炮获胜!n");
            break;
        }
        while (!MoveBing()){}
    }
}



Game::~Game()
{
    for(auto bing:bings){
        delete bing;
    }
    for(auto bing:delBings){
        delete bing;
    }
    for(auto pao:paos){
        delete pao;
    }
}
  1. main.cpp
#include 

#include "Game.h"

using namespace std;

int main(){
    
    Game* g = new Game();
    
    g->run(); 

    g->~Game();

    return 0;
}
实现效果



后记

这个小游戏做完后,和朋友试玩了一下,发现有个bug,然后修正了。又试玩了一局,I win!
下一个小游戏做连连看吧!

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/1034136.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号