对C++实现的简单24点小游戏的小小改动

写在最前面:笔者使用的是Dev-C++,小改动的内容相当简单无脑

首先话不多说,直接附上原文链接

https://blog.csdn.net/bluecraft_m/article/details/124197561

我知道你们会有人懒得点开,所以直接上源代码(侵删)

#include<iostream>
#include<string>
#include <stdlib.h>
#include<time.h>
using namespace std;
char card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' };
char buf[4];
double nums[4];
char ope[4] = { '+','-','*','/' };
 
 
void cre() { 
    int i = 0;
    int j;
    cout << "生成的四张牌面为:";
    srand((unsigned)time(0));
    for (i = 0; i<4; i++) {
        j =rand() % 13;
        buf[i] = card[j];
    }
    cout << buf[0] << ";" << buf[1] << ";" << buf[2] << ";" << buf[3] << "" << endl;
    for (i = 0; i<4; i++) {
        if (buf[i] == 'A') nums[i] = 1;
        else if(buf[i] == '2') nums[i] = 2;
        else if (buf[i] == '3') nums[i] = 3;
        else if (buf[i] == '4') nums[i] = 4;
        else if (buf[i] == '5') nums[i] = 5;
        else if (buf[i] == '6') nums[i] = 6;
        else if (buf[i] == '7') nums[i] = 7;
        else if (buf[i] == '8') nums[i] = 8;
        else if (buf[i] == '9') nums[i] = 9;
        else if (buf[i] == '10') nums[i] = 10;
        else if (buf[i] == 'J') nums[i] = 11;
        else if (buf[i] == 'Q') nums[i] = 12;
        else if (buf[i] == 'K') nums[i] = 13;
    }
}
 
double calcute(double a, double b, char index) {
    if (index == '+') return a + b;
    else if (index == '-') return a - b;
    else if (index == '*') return a*b;
    else if (index == '/')
        if (b != 0)
            return a / b; 
}
 
void exh() {
    double temp[3], tem[2]; 
    double sum;
    int judge = 0; 
    for (int i = 0; i < 4; i++) { 
        for (int j = 0; j < 4; j++) { 
            for (int k = 0; k < 4; k++) { 
                for (int m = 0; m < 3; m++) {
                    if (nums[m + 1] == 0 && ope[i] == '/') break;
                    temp[m] = calcute(nums[m], nums[m + 1], ope[i]);
                    temp[(m + 1) % 3] = nums[(m + 2) % 4];
                    temp[(m + 2) % 3] = nums[(m + 3) % 4]; 
                    for (int n = 0; n < 2; n++) {
                        if (temp[n + 1] == 0 && ope[j] == '/') break;
                        tem[n] = calcute(temp[n], temp[n + 1], ope[j]);
                        tem[(n + 1) % 2] = temp[(n + 2) % 3]; 
                        if (tem[1] == 0 && ope[k] == '/') break;
                        sum = calcute(tem[0], tem[1], ope[k]); 
                        if (sum == 24) { 
                            judge = 1;  
                            if (m == 0 && n == 0)
                                cout << "((" << nums[0] << ope[i] << nums[1] << ")" << ope[j] << nums[2] << ")" << ope[k] << nums[3] << "=" << sum << endl;
                            else if (m == 0 && n == 1)
                                cout << "(" << nums[0] << ope[i] << nums[1] << ")" << ope[k] << "(" << nums[2] << ope[j] << nums[3] << ")=" << sum << endl;
                            else if (m == 1 && n == 0)
                                cout << "(" << nums[0] << ope[j] << "(" << nums[1] << ope[i] << nums[2] << ")" << ope[k] << nums[3] << "=" << sum << endl;
                            else if (m == 1 && n == 1)
                                cout << nums[0] << ope[k] << "((" << nums[1] << ope[i] << nums[2] << ")" << ope[j] << nums[3] << ")=" << sum << endl;
                            else if (m == 2 && n == 0)
                                cout << "(" << nums[0] << ope[j] << nums[1] << ")" << ope[k] << "(" << nums[2] << ope[i] << nums[3] << ")=" << sum << endl;
                            else if (m == 2 && n == 0)
                                cout << nums[0] << ope[k] << "(" << nums[1] << ope[j] << "(" << nums[2] << ope[i] << nums[3] << "))=" << sum << endl;
                        }
                    }
                }
            }
        }
    }
    if (judge == 0)
        cout << "这四张扑克牌无法找到一个合理的解" << endl; 
}
int main() {
    int i;
    int select = 1;
    cout<< " ################################################" << endl
        << " #            #" << endl
        << " #    欢迎进入24点游戏    #" << endl
        << " #            #" << endl
        << " ################################################" << endl;
 
    while (select) {
        cout<< " ################################################" << endl
            << " #            #" << endl
            << " #    是否开始游戏     #" << endl
            << " #            #" << endl
            << " #   0.是    1.否    #" << endl
            << " #            #" << endl
            << " ################################################" << endl;
        cout << "请输入你的选择(0或1):";
        cin >> i;
        switch (i) {
            case 0:
                cre();
                exh();
                break;
            case 1:
                select = 0;
                break;
            default:
                cout << "请在0和1之间选择!" << endl;
        }
    }
    return 0;
}

运行截图:

 

 

 

 

 

 可以发现源代码功能其实很完整,整个代码最核心的部分就是计算随机抽到的四张牌否可以算出24点,如果可以就把每一种算法一一列出,这一部分功能笔者不打算改动(其实是改出了bug最后只能改回来了)。既然准备拿它来作为第一次作业的练手材料进行增量开发,那就给它加一点小功能吧。

先在全局变量中加入计数,用count统计总轮数,countf统计其中的无解次数,countt统计其中的有解次数,v是成功率。

int count=0,countf=0,countt=0;
float v;

既然加了计数功能,那当然要让玩家能看到啦

    while (select) {
        cout<< " ################################################" << endl
            << " #         当前总轮数:"  <<count<<"\t\t        #" << endl
            << " #         当前成功次数:"<<countt<<"\t\t        #" << endl
            << " #         当前失败次数:"<<countf<<"\t\t        #" << endl
            << " ################################################" << endl
            << " #                 是否开始游戏                 #" << endl
            << " #                                              #" << endl
            << " #            0.是             1.否             #" << endl
            << " #                                              #" << endl
            << " ################################################" << endl;
    v=(double)countt/count;                
    cout<<"本次游戏的成功率为"<<v<<endl;     if(v>=0.5) cout<<"很幸运嘛!"<<endl;

小功能加上了,自然也要把界面调整的美观一点。下面附上我改完后的完整代码和运行截图

#include<iostream>
#include<string>
#include <stdlib.h>
#include<time.h>
using namespace std;
char card[] = { 'A','2','3','4','5','6','7','8','9','10','J','Q','K' };
char buf[4];
double nums[4];
char ope[4] = { '+','-','*','/' };
int count=0,countf=0,countt=0;
float v;
 
void cre() { 
    int i = 0;
    int j;
    count++;
    cout<< " ################################################" << endl; 
    cout<< " ##              当前为第"<<count<<"轮游戏\t       ##" << endl; 
    cout<< " ##        生成的四张牌面为:";
    srand((unsigned)time(0));
    for (i = 0; i<4; i++) {
        j =rand() % 13;
        buf[i] = card[j];
    }
    cout << buf[0] << ";" << buf[1] << ";" << buf[2] << ";" << buf[3] << "。         ##" << endl;
    for (i = 0; i<4; i++) {
        if (buf[i] == 'A') nums[i] = 1;
        else if(buf[i] == '2') nums[i] = 2;
        else if (buf[i] == '3') nums[i] = 3;
        else if (buf[i] == '4') nums[i] = 4;
        else if (buf[i] == '5') nums[i] = 5;
        else if (buf[i] == '6') nums[i] = 6;
        else if (buf[i] == '7') nums[i] = 7;
        else if (buf[i] == '8') nums[i] = 8;
        else if (buf[i] == '9') nums[i] = 9;
        else if (buf[i] == '10') nums[i] = 10;
        else if (buf[i] == 'J') nums[i] = 11;
        else if (buf[i] == 'Q') nums[i] = 12;
        else if (buf[i] == 'K') nums[i] = 13;
    }
}
 
double calcute(double a, double b, char index) {
    if (index == '+') return a + b;
    else if (index == '-') return a - b;
    else if (index == '*') return a*b;
    else if (index == '/')
        if (b != 0)
            return a / b; 
}
 
void exh() {
    double temp[3], tem[2]; 
    double sum;
    int judge = 0; 
    for (int i = 0; i < 4; i++) { 
        for (int j = 0; j < 4; j++) { 
            for (int k = 0; k < 4; k++) { 
                for (int m = 0; m < 3; m++) {
                    if (nums[m + 1] == 0 && ope[i] == '/') break;
                    temp[m] = calcute(nums[m], nums[m + 1], ope[i]);
                    temp[(m + 1) % 3] = nums[(m + 2) % 4];
                    temp[(m + 2) % 3] = nums[(m + 3) % 4]; 
                    for (int n = 0; n < 2; n++) {
                        if (temp[n + 1] == 0 && ope[j] == '/') break;
                        tem[n] = calcute(temp[n], temp[n + 1], ope[j]);
                        tem[(n + 1) % 2] = temp[(n + 2) % 3]; 
                        if (tem[1] == 0 && ope[k] == '/') break;
                        sum = calcute(tem[0], tem[1], ope[k]); 
                        if (sum == 24) { 
                            judge = 1;  
                            if (m == 0 && n == 0)
                                cout << " ##\t\t((" << nums[0] << ope[i] << nums[1] << ")" << ope[j] << nums[2] << ")" << ope[k] << nums[3] << "=" << sum <<"\t\t       ##"<< endl;
                            else if (m == 0 && n == 1)
                                cout << " ##\t\t(" << nums[0] << ope[i] << nums[1] << ")" << ope[k] << "(" << nums[2] << ope[j] << nums[3] << ")=" << sum <<"\t\t       ##"<< endl;
                            else if (m == 1 && n == 0)
                                cout << " ##\t\t(" << nums[0] << ope[j] << "(" << nums[1] << ope[i] << nums[2] << ")" << ope[k] << nums[3] << "=" << sum <<"\t\t       ##"<< endl;
                            else if (m == 1 && n == 1)
                                cout << " ##\t\t"<<nums[0] << ope[k] << "((" << nums[1] << ope[i] << nums[2] << ")" << ope[j] << nums[3] << ")=" << sum <<"\t\t       ##"<< endl;
                            else if (m == 2 && n == 0)
                                cout << " ##\t\t(" << nums[0] << ope[j] << nums[1] << ")" << ope[k] << "(" << nums[2] << ope[i] << nums[3] << ")=" << sum <<"\t\t       ##"<< endl;
                            else if (m == 2 && n == 0)
                                cout << " ##\t\t"<< nums[0] << ope[k] << "(" << nums[1] << ope[j] << "(" << nums[2] << ope[i] << nums[3] << "))=" << sum <<"\t\t       ##"<< endl;
                        }
                    }
                }
            }
        }
    }
    if (judge == 1)    countt++;
    if (judge == 0){
        cout<< " ##      这四张扑克牌无法找到一个合理的解      ##" << endl; 
        countf++;
    }        
    cout<< " ################################################" << endl<<endl;
    system("pause");
    system("cls");
}
int main() {
    int i;
    int select = 1;
    cout<< " ################################################" << endl
        << " #                                              #" << endl
        << " #               欢迎进入24点游戏               #" << endl
        << " #                                              #" << endl
        << " ################################################" << endl<<endl;
 
    while (select) {
        cout<< " ################################################" << endl
            << " #         当前总轮数:"  <<count<<"\t\t        #" << endl
            << " #         当前成功次数:"<<countt<<"\t\t        #" << endl
            << " #         当前失败次数:"<<countf<<"\t\t        #" << endl
            << " ################################################" << endl
            << " #                 是否开始游戏                 #" << endl
            << " #                                              #" << endl
            << " #            0.是             1.否             #" << endl
            << " #                                              #" << endl
            << " ################################################" << endl;
        cout << "请输入你的选择(0或1):";
        cin >> i;
        system("cls");
        switch (i) {
            case 0:
                cre();
                exh();
                break;
            case 1:
                select = 0;
                v=(double)countt/count;
                cout<<"本次游戏的成功率为"<<v<<endl; 
                if(v>=0.5)    cout<<"很幸运嘛!"<<endl; 
                break;
            default:
                cout << "请在0和1之间选择!" << endl;
        }
    }
    return 0;
}

 

 

 

 

 

 求各位大佬不要细看孩子只想交个作业

 

posted @ 2023-03-09 01:09  紫电纱  阅读(140)  评论(0)    收藏  举报