现充|junyu33

猜数游戏

又是闲来无事,我扒出了竞赛时自己亲手编写的猜数游戏代码,并未对其进行改良,将网上流行的版本与小学数学结合起来,形成了如下代码。

//created by junyu33 in Feb. 3rd, 2020
#include <bits/stdc++.h>
using namespace std;
int ipt[10];
bool used[10];
void f(int a, char b, int c)
{
    int x = 0, z = 0, pa = a, pc = c;
    if (a == 0)
        x = ipt[a];
    else
        while (a)
        {
            int t = a % 10;
            x += ipt[t] * pow(10, z);
            z++;
            a /= 10;
        }

    cout << pa;

    int y = 0;
    z = 0;
    if (c == 0)
        y = ipt[a];
    while (c)
    {
        int t = c % 10;
        y += ipt[t] * pow(10, z);
        z++;
        c /= 10;
    }
    int preans;
    if (b == '+')
        preans = x + y;
    if (b == '*')
        preans = x * y;
    if (b == '-')
        preans = x - y;
    if (b == '/')
        preans = x / y;

    cout << b;
    cout << pc;

    int ans = 0;
    z = 0;
    if (preans == 0)
        y = ipt[a];
    while (preans)
    {
        int t = preans % 10;
        ans += ipt[t] * pow(10, z);
        z++;
        preans /= 10;
    }
    cout << "=" << ans << endl;
}
void show()
{
    for (int i = 0; i <= 9; i++)
        if (ipt[i] != i)
            cout << i << " " << ipt[i] << endl;
    system("pause");
    exit(0);
}
int main()
{
    srand((unsigned)time(NULL));
    cout << "the meanings of some numbers have been changed, enter expressions to find changes" << endl;
    cout << "for example, if 2 turns to be 5 and 5 turns to be 2,then 2*2=52" << endl;
    cout << "to increase difficulty, you could only use \"A+B\" or \"A*B\"" << endl;
    int n;
    cout << "input the number of changes from 0 to 10" << endl;
    cin >> n;
    memset(ipt, -1, sizeof(ipt));
    for (int p = 0; p < n;)
    {
        int a = rand()%10, b = rand()%10;
        if (a != b && !used[a])
        {
            p++;
            used[a] = 1;
            ipt[a] = b;
        }
    }
    for (int i = 0; i <= 9; i++)
        if (ipt[i] == -1)
            ipt[i] = i;
    int cnt=0;
    while (1)
    {
        again:;
        cnt++;
        cout << "input expression, pay attention that negative results will be replaced by 0" << endl;
        int a, c;char b;
        cin>>a>>b>>c;
        f(a, b, c);
        cout << "have an answer? input all changes, or input -1 to continue, or input -2 to show answer" << endl;
        int flag = 0;
        for (int i = 1; i <= n; i++)
        {
            int in, out;
            cin >> in;
            if (in == -1)
                goto again;
            if (in == -2)
                show();
            cin >> out;
            if (ipt[in] == out)
                flag++;
        }
        if (flag == n)
        {
            cout << "well done, you have finished it in " << cnt << " steps" <<endl; 
            system("pause");
            return 0;
        }
        else
            cout << "WA" << endl;
    }
}

游戏的规则嘤文说得很清楚,这里简要阐述一下:

变化规则:2 -> 5,5 -> 2

原式:2*2

第一次变:5*5

结果为:25

第二次变:52

其实我是编写了加减乘除四种函数,但减法会有负数变为0的特性,除法只有取整,在实际猜数的过程中应用价值不高。于是我就吓唬没拿到源码的人,让他们只用加与乘来规避bug的出现。

操作示例:(再按任意键继续就关了)

希望各位能享受这款有点小烧脑的原创作品!