Ushio的游戏(HZNUOJ 2024程序设计基础综合作业 Hard )

Ushio的游戏(HZNUOJ 2024程序设计基础综合作业 Hard

注:此篇文章仅供学习使用,严禁抄袭以刷题量。

Description

Nagisa,如果你还在的话…我们就能凑一起打麻将了,还玩什么扑克牌啊!

Okazaki Ushio是一个乖巧懂事的小女孩。今天,在幼儿园里,Ushio的老师Fujibayashi Kyou教了Ushio一个名为“Five-card Stud”(即我们常说的“梭哈”)的扑克牌游戏。Ushio非常开心,回到家后便缠着爸爸Okazaki Tomoya一起玩扑克牌。

但是在玩牌的过程中,Ushio发现,这个游戏的规则对她来说实在是太复杂了,每玩一局,Ushio总是要算好久才能算出胜负。你能写个程序帮助Ushio计算游戏胜负吗?

“Five Card Stud”的游戏规则如下:

1.**无对(Zilch):**手中都是单牌(即不符合2~9中任何一条规则)。如果双方都是无对,则分别拿出点数最大的牌来比,大的一方赢(如果相等则比较第二大,以此类推)。

2.**一对(One Pair):**5张牌中有且仅有2张一样点数的牌称为一对。如果双方都是一对,则比较谁的对子的点数较大,如果对子一样大,则将非对子的3张牌按照无对的比较规则来进行大小比较。

3.**两对(Two Pairs):**5张牌中有2对具有相同点数的牌。若双方都是两对,先比较双方最大的一对,若最大的一对相等,则比较次大的一对,若次大的一对也相等,则比较单牌的大小。

4.**三条(Three of a kind):**5张牌中有且仅有3张相同点数的牌,且其余两张牌不成对。若双方都是三条,则比较三条的大小。(注:由于一共只有4张点数相同的牌,故不可能出现双方三条相等的情况,后面的满堂红和四条同理)

5.**顺子(Straight):**5张顺连的牌。若双方都是顺子,比较双方最大的那张牌的点数。(注:A,2,3,4,5不构成顺子,10,J,Q,K,A才是顺子)

6.同花(Flush):5张花色一样的牌。若双方都是同花,则按照无对的比较方法进行大小比较。

7.**满堂红(Full House):**3张同一点数的牌加上1对其它点数的牌。若双方都是满堂红,则比较双方牌中3张相同牌的点数大小。

8.**四条(Four of a Kind):**5张牌中有且仅有4张相同点数的牌。若双方都是四条,则比较双方牌中4张相同牌的点数大小。

9.**同花顺(Straight Flush):**花色相同的顺子。若双方都是同花顺,则比较双方最大那张牌的点数。

接下来双方出示自己的5张牌,先按牌型进行大小比较,牌型大的赢。若牌型相同,则按牌面大小进行比较(具体比较规则见上)。值得一提的是,这里使用的是只有52张的扑克牌(即没有大小王),且点数的大小顺序为:A>K>Q>J>10>9>8>7>6>5>4>3>2,扑克牌里一共有四种花色,分别为黑桃(Spade)、红桃(Heart)、草花(Club)和方块(Diamond)(在输入时分别用其首字母代表对应花色)。

Input

首先输入一个正整数T,代表T轮游戏。

对于每一轮游戏,输入10张牌,每张牌由“[点数][花色]”组成,其中前5张为Ushio的牌,后5张为Tomoya的牌。

Output

若Ushio赢,输出“Ushio shouri!”;若Tomoya赢,则输出“Papa shouri!”;若平局,输出“Mama!”。

Samples

input

3 KD 8C 8S 4C 7S 8D 10S KS 6S JD JS 5H QS 10S 7H JD QH 10D 7S 6D AD 2C 3D 4D 5D AS 2S 3C 4S 5H 

output

Ushio shouri! Papa shouri! Mama! 

题目分析:

(大)模拟

只能说这道题考验的是耐心,反正会出好多好多的错

还有千万不要加入自己的理解,题目让你怎么判断输赢就听他说就好了

没提到的就不要管他

注意几点:

1.A可以用14代替

2.读入时”10S“这种类型要小心

3.像两对这种在排序后的第二张和第四张就是对子的值(可以想一想,可以让程序更简单)

c++

#include <map>
#include <set>
#include <fstream>
#include <queue>
#include <deque>
#include <stack>
#include <vector>
#include <string>
#include <iostream>
#include <algorithm>
#include <iterator>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <cstdio>
#include <bitset>
#include <iomanip>
#define endl '\n'
#define int long long
#define Max(a, b) (((a) > (b)) ? (a) : (b))
#define Min(a, b) (((a) < (b)) ? (a) : (b))
#define BoBoowen ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
using namespace std;

vector<pair<int, char>> a(10);
vector<pair<int, char>> b(10);

int cmp1(pair<int, char> x, pair<int, char> y)
{
    if (x.first != y.first)
    {
        return x.first < y.first;
    }
    return x.second < y.second;
}

int dodo(vector<pair<int, char>> v)
{
    int flag = 1;
    for (int i = 1; i < 5; ++i)
    {
        if (v[i].first == v[i - 1].first + 1 && v[i].second == v[i - 1].second)
        {
            continue;
        }
        flag = 0;
    }
    if (flag)
    {
        return 9;
    }

    for (int i = 0; i < 2; ++i)
    {
        flag = 1;
        for (int j = i + 1; j < i + 4; ++j)
        {
            if (v[j].first == v[j - 1].first)
            {
                continue;
            }
            flag = 0;
        }
        if (flag)
        {
            return 8;
        }
    }

    if ((v[0].first == v[1].first && v[1].first == v[2].first && v[3].first == v[4].first) || (v[0].first == v[1].first && v[2].first == v[3].first && v[3].first == v[4].first))
    {
        return 7;
    }

    flag = 1;
    for (int i = 1; i < 5; ++i)
    {
        if (v[i].second == v[i - 1].second)
        {
            continue;
        }
        flag = 0;
    }
    if (flag)
    {
        return 6;
    }

    flag = 1;
    for (int i = 1; i < 5; ++i)
    {
        if (v[i].first == v[i - 1].first + 1)
        {
            continue;
        }
        flag = 0;
    }
    if (flag)
    {
        return 5;
    }

    for (int i = 0; i < 3; ++i)
    {
        int flag = 1;
        for (int j = i + 1; j < i + 3; ++j)
        {
            if (v[j].first == v[j - 1].first)
            {
                continue;
            }
            flag = 0;
        }
        if (flag)
        {
            return 4;
        }
    }

    int flag2 = 0;
    for (int i = 1; i < 5; ++i)
    {
        if (v[i].first == v[i - 1].first)
        {
            flag2 += 1;
        }
    }
    if (flag2 == 2)
    {
        return 3;
    }
    else if (flag2 == 1)
    {
        return 2;
    }
    else
    {
        return 1;
    }
}

int cmp(int x, int y)
{
    if (x > y)
    {
        return 1;
    }
    else if (x < y)
    {
        return 2;
    }
    else
    {
        if (x == 9)
        {
            if (a[4].first > b[4].first)
            {
                return 1;
            }
            else if (a[4].first < b[4].first)
            {
                return 2;
            }
            else
            {
                return 3;
            }
        }

        if (x == 8)
        {
            if (a[1].first > b[1].first)
            {
                return 1;
            }
            else if (a[1].first < b[1].first)
            {
                return 2;
            }
            else
            {
                return 3;
            }
        }

        if (x == 7)
        {
            if (a[2].first > b[2].first)
            {
                return 1;
            }
            else if (a[2].first < b[2].first)
            {
                return 2;
            }
            else
            {
                return 3;
            }
        }

        if (x == 6)
        {
            for (int i = 4; i >= 0; --i)
            {
                if (a[i].first > b[i].first)
                {
                    return 1;
                }
                else if (a[i].first < b[i].first)
                {
                    return 2;
                }
            }
            return 0;
        }

        if (x == 5)
        {
            if (a[4].first > b[4].first)
            {
                return 1;
            }
            else if (a[4].first < b[4].first)
            {
                return 2;
            }
            else
            {
                return 3;
            }
        }

        if (x == 4)
        {
            if (a[2].first > b[2].first)
            {
                return 1;
            }
            else if (a[2].first < b[2].first)
            {
                return 2;
            }
            else
            {
                return 3;
            }
        }

        if (x == 3)
        {
            if (a[3].first > b[3].first)
            {
                return 1;
            }
            else if (a[3].first < b[3].first)
            {
                return 2;
            }
            else if (a[1].first > b[1].first)
            {
                return 1;
            }
            else if (a[1].first < b[1].first)
            {
                return 2;
            }
            int all1 = 0;
            int all2 = 0;
            for (int i = 0; i < 5; ++i)
            {
                all1 += a[i].first;
                all2 += b[i].first;
            }
            all1 -= a[1].first * 2 + a[3].first * 2;
            all2 -= b[3].first * 2 + b[1].first * 2;
            // cout << all1 << all2;
            if (all1 > all2)
            {
                return 1;
            }
            else if (all1 < all2)
            {
                return 2;
            }
            else
            {
                return 0;
            }
        }

        if (x == 2)
        {
            int s1;
            int s2;
            for (int i = 1; i < 5; ++i)
            {
                if (a[i].first == a[i - 1].first)
                {
                    s1 = a[i].first;
                }
                if (b[i].first == b[i - 1].first)
                {
                    s2 = b[i].first;
                }
            }
            if (s1 > s2)
            {
                return 1;
            }
            else if (s1 < s2)
            {
                return 2;
            }
            else
            {
                for (int i = 4, j = 4; i >= 0, j >= 0;)
                {
                    if (a[i].first == s1)
                    {
                        i--;
                    }
                    else if (b[j].first == s2)
                    {
                        j--;
                    }
                    else
                    {
                        if (a[i].first > b[j].first)
                        {
                            return 1;
                        }
                        else if (a[i].first < b[j].first)
                        {
                            return 2;
                        }
                        i--;
                        j--;
                    }
                }
                return 0;
            }
        }

        if (x == 1)
        {
            for (int i = 4; i >= 0; --i)
            {
                if (a[i].first > b[i].first)
                {
                    return 1;
                }
                else if (a[i].first < b[i].first)
                {
                    return 2;
                }
            }
            return 0;
        }
    }
}

signed main()
{
    BoBoowen;

    int t;
    cin >> t;
    // vector<string> vv1;
    // vector<string> vv2;
    for (int tt = 0; tt < t; ++tt)
    {
        for (int i = 0; i < 5; ++i)
        {
            string s;
            cin >> s;
            if (s.size() == 3)
            {
                a[i].first = 10;
                a[i].second = s[2];
            }
            else
            {
                if (s[0] >= '0' && s[0] <= '9')
                {
                    a[i].first = s[0] - '0';
                }
                else if (s[0] == 'J')
                {
                    a[i].first = 11;
                }
                else if (s[0] == 'Q')
                {
                    a[i].first = 12;
                }
                else if (s[0] == 'K')
                {
                    a[i].first = 13;
                }
                else if (s[0] == 'A')
                {
                    a[i].first = 14;
                }
                a[i].second = s[1];
            }
        }
        for (int i = 0; i < 5; ++i)
        {
            string s;
            cin >> s;
            if (s.size() == 3)
            {
                b[i].first = 10;
                b[i].second = s[2];
            }
            else
            {
                if (s[0] >= '0' && s[0] <= '9')
                {
                    b[i].first = s[0] - '0';
                }
                else if (s[0] == 'J')
                {
                    b[i].first = 11;
                }
                else if (s[0] == 'Q')
                {
                    b[i].first = 12;
                }
                else if (s[0] == 'K')
                {
                    b[i].first = 13;
                }
                else if (s[0] == 'A')
                {
                    b[i].first = 14;
                }
                b[i].second = s[1];
            }
        }

        sort(a.begin(), a.begin() + 5, cmp1);
        sort(b.begin(), b.begin() + 5, cmp1);
        // for (int i = 0; i < 5; ++i)
        // {
        //     cout << a[i].first << ' ' << a[i].second << endl;
        // }

        int ans1 = dodo(a);
        int ans2 = dodo(b);
        // cout << ans1 << ' ' << ans2;

        int final = cmp(ans1, ans2);
        if (final == 1)
        {
            cout << "Ushio shouri!" << endl;
            // vv1.push_back("Ushio shouri!");
        }
        else if (final == 2)
        {
            cout << "Papa shouri!" << endl;
            // vv1.push_back("Papa shouri!");
        }
        else
        {
            cout << "Mama!" << endl;
            // vv1.push_back("Mama!");
        }
    }
    // for (auto it : vv1)
    // {
    //     cout << it << endl;
    // }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值