C++实现简单24点游戏

yizhihongxing

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日

相关文章

  • Arduino控制舵机详解 附代码

    针对这个话题,完整的攻略包含以下几个方面的内容: 标题 需要为文章选择一些明确简洁的标题。该标题应清楚地说明文章主题以及文章具体内容。 概述 在攻略的开头部分,需要对文章做一些简要介绍。这应包括有关文章主题的背景信息以及可能对读者有用的任何上下文信息。 在介绍该话题时可以先讲解一下:Arduino介绍,舵机介绍,这样更容易为读者提供更细致的指导。 前置知识 …

    C 2023年5月23日
    00
  • php判断是否为json格式的方法

    PHP语言中判断是否为JSON格式的方法有很多种,常见的有以下两种方法: 方法一:使用PHP自带的json_decode函数 使用json_decode函数将JSON字符串转换成PHP数组 判断转换结果是否为NULL或者与原始字符串相等 示例代码: function is_json1($string) { $result = json_decode($str…

    C 2023年5月23日
    00
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码 什么是字符串快速压缩算法 字符串压缩是一种将文本数据编码为较短二进制串的技术,其可以对一定范围内的部分文本数据进行无损压缩,使得压缩后的数据占用更小的存储空间,也方便网络传输和存储。 字符串快速压缩算法是一种快速编码和高效解码的无损算法。该算法的主要思想是通过统计原始数据中出现的字符及其出现的频率,选用最出现频率的字符在新的编码…

    C 2023年5月22日
    00
  • Python如何读写JSON格式数据

    什么是JSON格式数据? JSON(JavaScript Object Notation)是一种轻量级的数据交换格式,易于人类阅读和编写,并能快速地在服务器和客户端之间传输数据。在Python中,JSON数据可以是一个嵌套的字典对象,或者是一个由字典组成的列表对象。 如何读取JSON格式数据? 在Python中读取JSON格式数据的主要过程如下: (1)在P…

    C 2023年5月23日
    00
  • 浅析JSONP解决Ajax跨域访问问题的思路详解

    下面我将详细讲解“浅析JSONP解决Ajax跨域访问问题的思路详解”。 一、什么是Ajax跨域访问问题 在Web开发中,由于同源策略的限制,导致浏览器不能直接访问跨域的文档,常见的一种情况就是在开发中使用Ajax请求时,由于Ajax请求要访问的资源和当前网页的域名不一致,就会报错,这就是Ajax跨域访问问题。 二、JSONP解决Ajax跨域访问问题的解决思路…

    C 2023年5月23日
    00
  • Qt计时器使用方法详解

    以下是关于“Qt计时器使用方法详解”的攻略说明: 1. 概述 Qt是一款功能强大的跨平台C++应用程序开发框架,提供了很多实用的功能模块,其中就包括计时器模块,可以在Qt中轻松地实现各种计时器功能,比如实现周期性的定时任务、定时刷新界面等。本文将介绍如何使用Qt计时器,包括如何创建计时器、设置计时器参数、处理计时器事件等。 2. 创建计时器 首先,我们需要通…

    C 2023年5月22日
    00
  • Matlab如何实现函数重载?Matlab实现函数重载的方法

    Matlab是一门基于矩阵运算的高级编程语言,它支持函数重载。函数重载是指在同一作用域中可以定义多个同名函数,但是参数的类型、个数或者顺序不同。Matlab中实现函数重载可以提高代码的复用性和可读性,同时也能够提升程序的灵活性和可维护性。下面是Matlab实现函数重载的方法的完整攻略。 函数重载的基本原则 Matlab实现函数重载需要遵循以下的基本原则: 同…

    C 2023年5月22日
    00
  • C++面向对象实现五子棋小游戏

    C++面向对象实现五子棋小游戏攻略 A. 概述 本文将介绍如何通过C++面向对象的方式实现五子棋小游戏。本文的重点是通过面向对象的分析和设计,呈现出一个完整的OOP编程流程。具体的实现代码在这里不赘述,通过项目开发过程中的分析和设计,读者可以获得更为重要的启发。 B. 项目分析 1. 确定项目需求 我们首先需要确定实现五子棋小游戏(Gobang)需要满足的核…

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