C语言程序设计之扑克游戏

问题描述

C语言项目课设、小 游 戏 源 码 免 费 下 载 链 接 如 下:

c语言项目课设小游戏源码资料压缩包.zip-C文档类资源-CSDN下载c语言项目课设小游戏源码资料压缩包.zipc语言项目课设小游戏源码资料压缩包.zipc语言项目课设小更多下载资源、学习资料请访问CSDN下载频道.https://download.csdn.net/download/chengxuyuanlaow/86749012

亚当和夏娃用一副52张的普通牌玩纸牌游戏。规则很简单,两人面对面坐在桌子的两侧。每人从牌堆中取出k张牌,看了之后,将牌面朝下放在桌子上。亚当的牌从左边的1到k编号,夏娃的牌从右边的1到k编号(所以夏娃的第i张牌与亚当的第i张牌相对)。卡片正面朝上,积分如下:

如果亚当的第i(i∈ {1,…,k})张牌胜过夏娃的第i张牌,那么亚当得1分。

如果夏娃的第i张牌胜过亚当的第i张牌,那么夏娃得一分。

点数较高的牌总是胜过点数较低的牌:3胜2、4胜3、…。1张A牌胜过每1张牌,除了(可能)另1张A牌。

如果两张牌的点数相同,那么牌的花色就决定了谁赢:红桃胜过所有其他牌,黑桃胜过除红桃以外的所有花色,方块只胜过梅花,梅花不胜过任何一种花色。

例如,红桃10胜过黑桃10,黑桃10胜过方块10,方块10胜过梅花10。

这应该是一场机会游戏,但最近夏娃大部分时间都赢了,原因是她已经开始使用有标记的牌。换言之,她在亚当把牌翻过来之前就知道他桌上有哪些牌。利用这些信息,她可以先排好自己的牌,以便获得尽可能多的积分。

你的任务是,根据亚当和夏娃的牌,确定夏娃如果打得最好会得到多少分。

输入

输入包括多组测试用例。第一行输入将包含一个正整数N,给出测试用例的数量。

每个测试用例从一行开始,该行带有一个正整数k<=26,这是每个玩家获得的牌数。

下一行描述了亚当放在桌子上的k张牌,从左到右。

再下一行描述了夏娃的k张牌(但她还没有把它们放在桌子上)。卡片由两个字符描述,第一个是它的点数(2、3、4、5、6、7、8、9、T、J、Q、K或A),第二个是它的花色(C、D、S或H,分别表示梅花、方块、黑桃或红桃)。牌之间用空格隔开。因此,如果亚当的牌是梅花10,红桃2和方块J,那可以描述为 TC 2H JD。

输出

对于每个测试用例,如果夏娃选择了最佳的方式将卡片排列在桌子上,输出其最多得分。

输入样例

3

1

JD

JH

2

5D TC

4C 5H

3

2H 3H 4H

2D 3D 4D

输出样例

1

1

2

(1)编程思路。

由于需要对扑克牌进行排序,而采用牌面字符串不方便进行排序,因此可以编写函数int getVal(char card[5])将52张扑克牌中的某张由card字符串指定的牌面转换为对应的整数值(8~59之一)。转换时,牌面2C=8、2D=9、2S=10、2H=11、…、AC=56、AD=57、AS=58、AH=59。

扑克牌的一张牌面包含点数和花色两个信息,可以将点数2~9分别取2~9,T、J、Q、K分别取10、11、12、13,A取14,四种花色C、D、S、H分别取0、1、2、3,这样每张牌按牌面可映射为一个整数值,映射公式为: 牌面值=点数*4+花色。

 这样,对扑克牌的排序就可以转换为对整数的排序。

输入亚当和夏娃各自所取的K张牌后,将每张牌按牌面转换为一个整数值并分别保存到数组A和数组E中,然后将数组A和E分别按从小到大的顺序排列好。

为了求出夏娃的最多得分,可以采用贪心法求解。

贪心策略是:如果夏娃当前最大的牌可以赢亚当最大的牌,那么让这两张牌比大小,赢得1分;如果夏娃当前最小的牌能赢亚当最小的牌,那么让这两牌比大小,赢得1分;如果上面两个条件都不满足,就让夏娃当前最小的牌和亚当当前最大的牌比大小,让亚当得1分,但用掉其最大的牌。

(2)源程序。

#include <stdio.h>
void sort(int a[],int n)
{
    int i,j,tmp;
    for (i=0;i<n-1;i++)
        for (j=0;j<n-1-i;j++)
           if (a[j]>a[j+1])
           {
              tmp=a[j]; a[j]=a[j+1]; a[j+1]=tmp;
           }
}
int value(char card[])
{
    int p,s;
    if (card[0]>='2' && card[0]<='9')
        p=card[0]-'0';
    else if (card[0]=='T') p=10;
    else if (card[0]=='J') p=11;
    else if (card[0]=='Q') p=12;
    else if (card[0]=='K') p=13;
    else if (card[0]=='A') p=14;
    if (card[1]=='C') s=0;
    else if (card[1]=='D') s=1;
    else if (card[1]=='S') s=2;
    else if (card[1]=='H') s=3;
    return 4*p+s;
}
int main()
{
   int n;
   scanf("%d",&n);
   while (n--)
   {
       int a[27],e[27];
       int k;
       scanf("%d",&k);
       char card[3];
       int i;
       for (i=0;i<k;i++)
       {
           scanf("%s",card);
           a[i]=value(card);
       }
       for (i=0;i<k;i++)
       {
           scanf("%s",card);
           e[i]=value(card);
       }
       sort(a,k);
       sort(e,k);
       int cnt=0;
       int aBegin=0,aEnd=k-1;
       int eBegin=0,eEnd=k-1;
       while (eBegin<=eEnd)
       {
           if (e[eBegin]>a[aBegin])
           {
               aBegin++;  eBegin++;  cnt++;
           }
           else if (e[eEnd]>a[aEnd])
           {
               aEnd--;  eEnd--;  cnt++;
           }
           else
           {
               eBegin++;   aEnd--;
           }
       }
       printf("%d\n",cnt);
   }
   return 0;
}

  • 1
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
以下是一个简单的C语言程序设计21点扑克游戏的代码: ```c #include <stdio.h> #include <stdlib.h> #include <time.h> int main() { int player_score = 0, dealer_score = 0; int player_cards[5], dealer_cards[5]; int player_card_count = 0, dealer_card_count = 0; int i, card; srand(time(NULL)); // 初始化玩家和庄家的手 player_cards[player_card_count++] = rand() % 13 + 1; dealer_cards[dealer_card_count++] = rand() % 13 + 1; // 玩家先抽一张 player_cards[player_card_count++] = rand() % 13 + 1; player_score = player_cards[0] + player_cards[1]; printf("你的手: %d %d (总分: %d)\n", player_cards[0], player_cards[1], player_score); // 庄家抽一张 dealer_cards[dealer_card_count++] = rand() % 13 + 1; dealer_score = dealer_cards[0]; printf("庄家的手: %d ? (总分: ?)\n", dealer_cards[0]); // 玩家决定是否继续抽 while (player_score < 21) { printf("是否继续抽 (y/n)? "); char choice; scanf(" %c", &choice); if (choice == 'n') { break; } card = rand() % 13 + 1; player_cards[player_card_count++] = card; player_score += card; printf("你抽到了 %d (总分: %d)\n", card, player_score); } // 庄家继续抽直到总分大于等于17 while (dealer_score < 17) { card = rand() % 13 + 1; dealer_cards[dealer_card_count++] = card; dealer_score += card; } // 输出庄家的手和总分 printf("庄家的手: "); for (i = 0; i < dealer_card_count; i++) { printf("%d ", dealer_cards[i]); } printf("(总分: %d)\n", dealer_score); // 判断胜负 if (player_score > 21) { printf("你爆了,庄家获胜!\n"); } else if (dealer_score > 21) { printf("庄家爆了,你获胜!\n"); } else if (player_score > dealer_score) { printf("你的总分大于庄家,你获胜!\n"); } else if (player_score < dealer_score) { printf("你的总分小于庄家,庄家获胜!\n"); } else { printf("你和庄家的总分相同,平局!\n"); } return 0; } ``` 这个程序使用了随机数生成器来模拟扑克的抽取。玩家先抽两张,然后可以选择是否继续抽,直到总分大于等于21或者选择停止抽。庄家会先抽一张,然后根据规则继续抽,直到总分大于等于17。最后程序会判断双方的总分,输出胜负结果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

猰貐的新时代

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值