C#试玩程序设计试题——拱猪计分

题目链接:
https://wenku.baidu.com/view/d8253e24f90f76c660371ac2.html?from=search
问题描述:
拱猪是一种有趣的扑克牌游戏。即使你不知道他的玩法,你也可以由他的计分方式来了解他的趣味性。假设在此我们仅考虑四个人的拱猪牌局,本题要求你根据下面的积分规则,在牌局结束时计算四位玩家所得分数。
1.我们分别以S、H、D及C来代表黑桃,红心,方块及梅花,并以数字1至13来代表A、2、… Q、K等牌点,例如: H1为红心A, S13为黑桃K。

2.牌局结束时,由各玩家持有的有关计分的牌(计分牌)计算得分。计分牌仅有S12 (猪), 所有红心牌,D11(羊)及C10 (加倍)等16张牌。其他牌均弃之不计。若未持有这16张牌之中的任意一张, 则以得零分计。

3.若持有C10的玩家只有该张牌而没有其他牌则得+50分,若除了C10还有其他计分牌,则将其他计分牌所得分数加倍计算。

4.若红心牌不在同一家,则H1至H13等13张牌均以负分计,其数值为-50,-2,-3,-4,-5,-6,-7. -8,-9,-10, -20, -30, -40.而且S12和D11分别以-100和+100分计算。

5.若红心牌H1至H13均在同一家,有下列情形:
a) 所有红心牌以+200分计算
b) 若S12、D11均在吃下所有红心牌的这一 家,则此玩家得+500分
c)而C10还是以前面的原则计算分数

例一:
	若玩家持有计分牌如下: (每列代表玩家所持有之牌)
	S12  H3  H5  H13 
	D11  H8  H9
	C10  H1  H2  H4  H6  H7
	H10  H11 H12

	则各玩家得分依次序为: -148, +83, -138 及-60。
	
例二:
	若各玩家持有计分牌如下(第四个玩家未持有任何计分牌)
	H1  H2  H3  H4  H5  H6  H7  H8  H9  H10  H11  H12  H13
	S12 C10
	D11
	则各玩家得分依次序为: +200, -200, +100 及0。
	
例三:
	若有一玩家持有所有16张计分牌,则得分+1000分,其余玩家均得零分。

输入:
每个输入文件有多组数据组成,每组测试数据有四行,每一行第一个数为该玩家所持有计分牌的总数,而后列出其所持有的所有计分牌,牌数与各计分牌均以一个以上的空格分开。
相邻两组测试数据之间不会有空白行,读到四家持牌数都为零表示文件结束。
输出:
每一行输出一组测试数据对应的结果,一次输出各玩家所得分数,共四个整数(含正负号,0除外),相邻两个整数之间用一个空格隔开,符号和数字之间不可以有空格。每组输出之间不需要空白行。

输入样本:
4 S12 H3 H5 H13
3 D11 H8 H9
6 C10 H1 H2 H4 H6 H7
3 H10 H11 H12
13 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13
2 S12 C10
1 D11
0
0
0
0
0
输出样本:
-148 +83 -138 -60
+200 - 200 +100 0

思路=====================================================================
只要按题目分类讨论扑克牌的分布算分就行(顺便补充了下除题目样本外的其他情况)
在这里插入图片描述

List<string> readLineStrings = new List<string> {// 方便测试
                "4 S12 H3 H5 H13",
                "3 D11 H8 H9",
                "6 C10 H1 H2 H4 H6 H7",
                "3 H10 H11 H12",
                "13 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13",
                "2 S12 C10",
                "1 D11",
                "0",
                "1 C10 C2",
                "15 S12 D11 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13",
                "0",
                "0",
                "0",
                "16 C10 S12 D11 H1 H2 H3 H4 H5 H6 H7 H8 H9 H10 H11 H12 H13",
                "0",
                "0",
                "0",
                "0",
                "0",
                "0",
            };

            List<string> countsCards = new List<string> // 记分牌
            {
                "S12", "D11","C10"
            };

            for (int i = 1; i <= 13; i++)
            {
                countsCards.Add("H" + i);
            }

            for (int i = 0; i < readLineStrings.Count - 4; i++)
            {
                List<string> pokes = new List<string>();
                pokes.AddRange(readLineStrings[i].Split());
                //pokes.RemoveAt(0);
                pokes.RemoveAll((poke) => {
                    return !countsCards.Contains(poke);
                });

                if (pokes.Any())
                {
                    bool hasC10 = pokes.Contains("C10");
                    int H_count = pokes.Count((poke) => {
                        return poke.StartsWith("H");
                    });
                    bool hasS12= pokes.Contains("S12");
                    bool hasD11= pokes.Contains("D11");

                    if (pokes.Count == 1 && hasC10)
                    {
                        Console.Write("+50 ");// 若持有C10的玩家只有该张牌而没有其他牌则得+50分
                    }
                    else if (pokes.Count == 16)
                    {
                        Console.Write("+1000 ");// 若有一玩家持有所有16张计分牌,则得分+1000分,其余玩家均得零分。
                    }
                    else if (pokes.Count((poke) => { return poke.StartsWith("H"); }) == 13) // 若红心牌H1至H13均在同一家
                    {
                        if (pokes.Count == 13)
                        {
                            Console.Write("+200 ");// 所有红心牌以+200分计算
                        }
                        else if (pokes.Contains("S12") && pokes.Contains("D11"))
                        {
                            Console.Write("+500 ");// 若S12、D11均在吃下所有红心牌的这--家,则此玩家得+500分
                        }
                    }
                    else
                    {
                        int count = 0;
                        for (int j = 0; j < pokes.Count; j++)
                        {
                            switch (pokes[j])
                            {
                                case "H11":
                                    count -= 20;
                                    break;
                                case "H12":
                                    count -= 30;
                                    break;
                                case "H13":
                                    count -= 40;
                                    break;
                                case "H1":
                                    count -= 50;
                                    break;
                                case "S12":
                                    count -= 100;
                                    break;
                                case "D11":
                                    count += 100;
                                    break;
                                default:
                                    if (pokes[j].StartsWith("H"))
                                    {
                                        count -= int.Parse(pokes[j].TrimStart('H'));
                                    }
                                    break;
                            }
                        }

                        if (hasC10)
                        {
                            count *= 2;
                        }
                        Console.Write(count+" ");
                    }

                }
                else // 若未持有这16张牌之中的任意一张,则以得零分计。
                {
                    Console.Write("0 ");
                }

                if (i % 4==3) 
                {
                    Console.WriteLine();
                }
            }
            Console.ReadKey();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值