C++实现简单24点游戏

C++实现简单24点游戏攻略

1. 游戏规则

简单24点是一款数学类撕牌游戏,每局游戏给出四个1-10之间的数字,玩家需要通过加减乘除等操作使这四个数字的结果为24。每个数字只能使用一次,游戏时间为2分钟,所有与24有接近的结果都可得分。更多详细规则请参考简单24点规则

2. 实现思路

本游戏的实现思路主要是对四个数进行排列组合构成计算表达式,然后通过计算表达式得到最终结果,在比较结果是否为24即可。由于要涉及到对计算表达式的求解,因此本游戏使用后缀表达式(逆波兰表达式)进行求解。

后缀表达式主要是将中缀表达式转化为后缀表达式,然后通过栈的方式进行计算,得到计算结果。其中后缀表达式的转化可以采用中缀表达式转化为后缀表达式的算法,具体实现可参考中缀表达式转后缀表达式

3. 代码实现

下面是本游戏的核心代码,包括表达式转化为逆波兰表达式,计算逆波兰表达式结果以及构造符号排列等。

//将表达式转化为逆波兰表达式
string expression2RPN(const string s){
    string op = "+-*/()";
    map<char, int> pr = {{'+', 1}, {'-', 1}, {'*', 2}, {'/', 2}};
    stack<char> opr;
    string ss = "";
    for (int i = 0;i < s.size();i++){
        if (isdigit(s[i])) ss += s[i];
        else if (op.find(s[i]) != string::npos){
            while (!opr.empty() && opr.top() != '(' && pr[s[i]] <= pr[opr.top()]){
                ss += opr.top(); opr.pop();
            }
            if (s[i] == ')') opr.pop();
            else opr.push(s[i]);
        }else return "error";
    }
    while (!opr.empty()) ss += opr.top(), opr.pop();
    return ss;
}

//计算逆波兰表达式结果
int RPN2result(const string s){
    stack<int> st;
    for (int i = 0;i < s.size();i++){
        if (isdigit(s[i])) st.push(s[i] - '0');
        else{
            int a = st.top(); st.pop();
            int b = st.top(); st.pop();
            switch (s[i]){
                case '+': st.push(b + a); break;
                case '-': st.push(b - a); break;
                case '*': st.push(b * a); break;
                case '/': st.push(b / a); break;
                default: return -1;
            }
        }
    }
    return st.top();
}

//对数字数组进行排列组合
bool next_permutation(vector<int>& v){
    int n = v.size(), i = n - 2, j = n - 1;
    while (i >= 0){
        if (v[i] < v[i + 1]) break;
        i--;
    }
    if (i < 0) return false;
    while (j > i){
        if (v[j] > v[i]) break;
        j--;
    }
    swap(v[i], v[j]);
    reverse(v.begin() + i + 1, v.end());
    return true;
}

//构造符号排列
bool next_expression_permutation(vector<char>& v,int pos){
    if(v.size() == pos) return true;
    vector<char> op = {'+', '-', '*', '/'};
    for(int i=pos;i<v.size();++i){
        if(i != pos && v[i] == v[pos]) continue;
        swap(v[i],v[pos]);
        if(v[pos] >='0' && v[pos] <='9') next_expression_permutation(v, pos+1);
        else for(char j:op){
            v[pos] = j;
            if(next_expression_permutation(v, pos+1)) return true;
        }
        swap(v[i],v[pos]);
    }
    return false;
}

//检查是否为24点
bool check_24_point(vector<int>& v){
    vector<char> op(3, 'A');
    vector<int> a;
    do{
        a.clear();
        vector<char> b(op);
        a.push_back(v[0]);
        a.push_back(v[1]);
        a.push_back(v[2]);
        a.push_back(v[3]);
        do{
            vector<int> s;
            s.push_back(a[0]);
            for(int i=0;i<3;++i){
                s.push_back(b[i]);
                s.push_back(a[i+1]);
            }
            if(RPN2result(expression2RPN(vtoa(s))) == 24) return true;
        }while(next_permutation(a));
    }while(next_expression_permutation(op, 0));
    return false;
}

对于以上代码的解释请参考代码说明

4. 示例说明

假如当前给定的四个数字分别为1,2,3,4,我么可以通过如下代码执行:

vector<int> a={1,2,3,4};
bool r = check_24_point(a);
if(r) cout<<"可以得到24点"<<endl;
else cout<<"不能得到24点"<<endl;

该代码的输出结果为 “可以得到24点”。

再假如当前给定的数字为3,4,5,6,我们可以通过如下代码执行:

vector<int> b={3,4,5,6};
bool r = check_24_point(b);
if(r) cout<<"可以得到24点"<<endl;
else cout<<"不能得到24点"<<endl;

该代码的输出结果为 “不能得到24点”。

通过以上示例的代码,我们可以方便实现简单24点游戏。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:C++实现简单24点游戏 - Python技术站

(0)
上一篇 2023年5月23日
下一篇 2023年5月23日

相关文章

  • JSON数据中存在单个转义字符“\”的处理方法

    处理 JSON 数据中存在单个转义字符“\”的方法有以下两种: 双反斜线转义为单斜线 当 JSON 数据中存在单个反斜线时,可以使用双反斜线转义为单斜线处理。示例如下: { "text": "这是一句包含反斜线\\的文本" } 可以通过代码将其转化为: { "text": "这是一句包含反…

    C 2023年5月23日
    00
  • C语言实现医院管理系统

    C语言实现医院管理系统攻略 1. 确定功能需求 在开始编写医院管理系统之前,需要先明确需要实现的功能需求。医院管理系统可能包括以下功能: 患者基本信息管理(包括姓名、年龄、性别等信息) 患者就诊记录管理(包括挂号时间、就诊科室、医生名称、费用等信息) 医生基本信息管理(包括姓名、性别、年龄、职称等信息) 医生排班信息管理(包括医生姓名、科室、上班时间等信息)…

    C 2023年5月23日
    00
  • Go语言利用Unmarshal解析json字符串的实现

    下面我来详细讲解“Go语言利用Unmarshal解析JSON字符串的实现”。 什么是Unmarshal Unmarshal(解封)是将数据从某种格式转换为可操作的结构体等数据类型的过程。对于Golang来说,Unmarshal通常用于将JSON格式的数据解析为Golang的数据结构,以便于进行数据的操作和处理。 Golang利用Unmarshal解析JSON…

    C 2023年5月23日
    00
  • 基于C语言实现的迷宫游戏代码

    基于C语言实现的迷宫游戏代码攻略 1. 程序介绍 本程序是基于C语言实现的迷宫游戏,通过命令行界面进行操作。玩家需要通过键盘操作,控制角色在迷宫中找到出口,并避开障碍物。 2. 程序设计 2.1 数据结构 程序需要用到以下数据结构: 迷宫地图:二维数组,用于存储迷宫地图中的信息,如墙、障碍物、出口等。 角色位置:定义一个结构体,用于存储角色的位置信息,包括坐…

    C 2023年5月23日
    00
  • sigsetjmp的用法总结

    下面详细讲解一下”sigsetjmp的用法总结”的完整攻略。 什么是sigsetjmp 在进行sigsetjmp的用法总结之前,我们先来了解一下什么是sigsetjmp。sigsetjmp和setjmp是类似的函数,它们可以将程序的当前执行状态保存下来,以便之后程序可以回到这个状态,实现长跳转。不过在sigsetjmp的基础上额外增加了信号处理器的保存以及信…

    C 2023年5月23日
    00
  • C语言实现链队列

    接下来我将详细讲解“C语言实现链队列”的完整攻略。 什么是链队列 链队列是一种基于链表的队列实现,其底层数据结构为一个链表。相比于数组实现的队列,链队列具有动态分配内存空间的优势。链队列的队首与队尾分别指向链表的首尾节点,数据元素按顺序排列,后进先出。 实现链队列的步骤 1. 定义队列结构体 首先,需要定义队列结构体,包括队列的基本属性和操作方法: // 定…

    C 2023年5月23日
    00
  • C语言实现校园导游系统

    C语言实现校园导游系统攻略 1. 系统概述 本系统旨在实现校园导游功能,包括以下两个主要功能: 给出校园地图,包括景点名称、景点描述、景点图片等信息。 提供导游功能,可根据用户输入,为用户提供一条包含多个景点的导游路线,并展示每个景点的信息和图片。 本系统使用C语言实现。主要技术栈包括链表结构、图论算法、文件读写等。 2. 实现过程详解 2.1 数据存储 本…

    C 2023年5月23日
    00
  • C/C++根据年月日计算星期几(蔡勒公式篇)

    C/C++根据年月日计算星期几(蔡勒公式篇) 背景 在日常生活中,经常需要计算某个日期是星期几,比如周末安排、节日调休等。本文将介绍一种根据年月日计算星期几的方法——蔡勒公式,使用C/C++实现。 蔡勒公式 公式说明 蔡勒公式是一种利用数学方法,通过年月日计算星期几的算法。其中涉及到一些复杂的数学运算,但相比其他计算方法,它具有“精确、易懂、快速”的特点。 …

    C 2023年5月23日
    00
合作推广
合作推广
分享本页
返回顶部