C#实现扑克游戏(21点)的示例代码

目录
  • 一、游戏介绍
    • 1.1 游戏规则
    • 1.2 牌点计算
    • 1.3 判断胜负
  • 二、游戏设计
    • 2.1 游戏流程
    • 2.2 玩家类
    • 2.3 AI类
  • 三、参考代码

一、游戏介绍

1.1 游戏规则

21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。

1.2 牌点计算

A至10牌,按其原点数计算;J、Q、K都算作10点。

1.3 判断胜负

二十一点玩法规则和概率在二十一点游戏中,拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21点的玩家称为爆牌。拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21点之间判负。

二、游戏设计

2.1 游戏流程

发牌:

玩家和AI每人发两张牌,由手牌点数和大的玩家优先选择是否在牌堆中取牌

取牌:

手牌点数和小于21,等待1中优先选择后再顺时针轮到其他玩家选择是否取牌

取牌后:

若牌点大于21则直接判负出局,场上只剩1人,直接游戏结束;否则重复2-3

若牌点小于等于21则轮到下家取牌,重复2-3

游戏结束

其他玩家取牌后都超过21点,只剩1人,直接获胜

所有玩家都选择不取牌后,按规则比较所有玩家手牌点数和,牌点大的获胜。

2.2 玩家类

由玩家自己选择是否继续拿牌。(输入Y继续拿牌,N为不拿牌)

2.3 AI类

简化AI逻辑,发牌后AI手牌和为4-8时继续拿牌,一直到17点或17点以上不再拿牌;因为此时再拿牌就有一半以上的概率超过21点。

三、参考代码

using System;

namespace _21dian
{
    using System;
    using System.Collections.Generic;

    namespace Game21Points
    {
        class Project
        {
            static void Main(string[] args)
            {
                Console.WriteLine("----- 游戏开始 -----");

                // 扑克牌
                List<int> cards = new List<int>()
                {
                    1,  2,  3,  4,  5,  6,  7,  8,  9,  10, 11, 12, 13,
                    14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26,
                    27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39,
                    40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, 51, 52
                };

                // 创建对象
                Poker poker = new Poker(cards);
                Player player = new Player();
                AIPlayer ai = new AIPlayer();

                // --> 玩家入场
                player.playerName = "Czhenya";
                ai.playerName = "AI";

                poker.AddPlayer(player);
                poker.AddPlayer(ai);

                // 事件关系绑定
                poker.GameSratrHandler += player.GameStart;
                poker.GameSratrHandler += ai.GameStart;

                // 游戏开始
                poker.GameStart();

                // 每人发两张牌
                poker.SendCard();
                poker.SendCard();

                // 询问取牌
                poker.TaskCard();

                Console.ReadKey();
            }
        }

        abstract class AbsPlayer
        {
            public string playerName;
            public bool IsContinueTakeCard = true;
            public List<int> handCards = new List<int>();

            public abstract void GameStart();

            public virtual void SendCard(int card)
            {
                handCards.Add(card);
            }

            public abstract bool TakeCard();

            public bool GameOver()
            {
                bool isGameOver;
                if (HandCardsPoint > 21)
                {
                    isGameOver = true;
                }
                else
                {
                    isGameOver = !IsContinueTakeCard;
                }
                return isGameOver;
            }

            public int HandCardsPoint { get { return PokeTools.HandCardsSum(handCards); } }
        }

        class Player : AbsPlayer
        {
            public override void GameStart()
            {
                handCards.Clear();
                Console.WriteLine("玩家整理了一下衣服,准备开局;");
            }

            public override void SendCard(int card)
            {
                handCards.Add(card);
                Console.WriteLine("玩家发牌:" + PokeTools.PokerBrandByPoint(card));
            }

            public override bool TakeCard()
            {
                Console.WriteLine("当前您的手牌点数和为:" + HandCardsPoint);
                Console.WriteLine("是否继续取牌(Y/N)?");
                string readStr = Console.ReadLine();
                // 输入Y取牌,其他为不取牌
                IsContinueTakeCard = readStr.Equals("Y");
                return IsContinueTakeCard;
            }
        }

        class AIPlayer : AbsPlayer
        {
            public override void GameStart()
            {
                handCards.Clear();
                Console.WriteLine("AI:清理一下内存,与之一战;");
            }

            public override void SendCard(int card)
            {
                base.SendCard(card);
                Console.WriteLine("AI发牌:" + PokeTools.PokerBrandByPoint(card));
            }

            public override bool TakeCard()
            {
                // 手牌数点数小于17,就继续取牌
                return HandCardsPoint < 17;
            }
        }

        class Poker
        {
            List<AbsPlayer> players = new List<AbsPlayer>();
            public Action GameSratrHandler;
            public Action<int> SendCardHandler;
            public Func<int, bool> TaskCardHandler;
            // 发牌用
            List<int> sendCards;

            public Poker(List<int> cards)
            {
                // 复制一份发牌用
                sendCards = new List<int>(cards);
            }

            public void AddPlayer(AbsPlayer player)
            {
                players.Add(player);
            }

            public void GameStart()
            {
                for (int i = 0; i < players.Count; i++)
                {
                    if (!players[i].GameOver())
                    {
                        players[i].GameStart();
                    }
                }
            }

            /// <summary>
            /// 发牌 -- 会剔除已经发过的牌
            /// </summary>
            public void SendCard()
            {
                for (int i = 0; i < players.Count; i++)
                {
                    players[i].SendCard(SendOneCard());
                }
            }

            int SendOneCard()
            {
                // 随机发一张牌
                Random random = new Random();
                int index = random.Next(0, sendCards.Count);
                // 取到牌值
                int cardPoint = sendCards[index];
                // 从手牌中移除 --> 为避免发到相同的牌
                sendCards.RemoveAt(index);

                return cardPoint;
            }

            public void TaskCard()
            {
                for (int i = 0; i < players.Count; i++)
                {
                    // 选择取牌后再发一张牌
                    if (players[i].TakeCard())
                    {
                        players[i].SendCard(SendOneCard());
                    }
                    Console.WriteLine($"玩家:{players[i].playerName} 手牌:{PokeTools.ShowHandCard(players[i].handCards)}");
                }

                if (!GameOver())
                {
                    TaskCard();
                }
            }

            public bool GameOver()
            {
                int playerCount = 0;
                for (int i = 0; i < players.Count; i++)
                {
                    if (!players[i].GameOver())
                    {
                        playerCount++;
                    }
                }

                bool isGameOver = playerCount <= 1;

                if (isGameOver)
                {
                    Console.WriteLine("游戏结束:");

                    List<AbsPlayer> playerList = new List<AbsPlayer>();
                    int maxPoint = 0;
                    for (int i = 0; i < players.Count; i++)
                    {
                        if (players[i].HandCardsPoint > 21)
                        {
                            Console.WriteLine($"玩家:{players[i].playerName} 爆牌了"  );
                        }
                        else
                        {
                            playerList.Add(players[i]);
                            if (maxPoint < players[i].HandCardsPoint)
                            {
                                maxPoint = players[i].HandCardsPoint;
                            }
                        }
                    }

                    if (playerList.Count == 0)
                    {
                        Console.WriteLine("平局");
                    }
                    else if (playerList.Count == 1)
                    {

                        Console.WriteLine($"玩家:{playerList[0].playerName} 赢了");
                    }
                    else
                    {
                        for (int i = 0; i < playerList.Count; i++)
                        {
                            if (maxPoint == playerList[i].HandCardsPoint)
                            {
                                Console.WriteLine($"玩家:{playerList[i].playerName} 赢了");
                            }
                        }
                    }
                }
                return isGameOver;
            }
        }
    }

    class PokeTools
    {
        /// <summary>
        /// 根据牌点返回牌名 如:14 ->红桃3
        /// </summary>
        /// <param name="card"></param>
        /// <returns></returns>
        public static string PokerBrandByPoint(int card)
        {
            if (card > 52 || card <= 0)
            {
                Console.WriteLine("不是扑克牌点");
                return "不是扑克牌点";
            }

            string[] flowerColor = new string[4] { "黑桃", "红桃", "梅花", "方片" };
            string[] points = new string[13] { "K", "A", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q" };
            int huaSe = (card - 1) / 13;
            int point = card % 13;

            // 返回花色 + 牌点 如:红桃3
            return flowerColor[huaSe] + points[point];
        }

        /// <summary>
        /// 手牌求和
        /// </summary>
        /// <param name="handCards"></param>
        /// <returns></returns>
        public static int HandCardsSum(List<int> handCards)
        {
            // "K", "2", "3", "4", "5", "6", "7", "8", "9", "10", "J", "Q"
            int[] points = new int[13] { 10, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 10, 10 };
            int sumRes = 0;

            for (int i = 0; i < handCards.Count; i++)
            {
                sumRes += points[handCards[i] % 13];
            }

            return sumRes;
        }

        // 显示手牌
        public static (string, string) ShowHandCard(List<int> handCards)
        {
            string resStr = "";
            for (int i = 0; i < handCards.Count; i++)
            {
                resStr += PokeTools.PokerBrandByPoint(handCards[i]);
                if (handCards.Count - 1 != i)
                {
                    resStr += ",";
                }
            }

            return (resStr, "牌点和:" + PokeTools.HandCardsSum(handCards));
        }
    }
}

测试结果:

到此这篇关于C#实现扑克游戏(21点)的示例代码的文章就介绍到这了,更多相关C#扑克游戏内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • C#实现简单打字小游戏

    本文实例为大家分享了C#实现简单打字小游戏的具体代码,供大家参考,具体内容如下 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.For

  • C#代码实现扑克牌排序的几种方式

    扑克牌游戏,总是能用到很多的手牌排序,总结了几种方式供参考,顺便记录一下方便以后使用. 我做的这个是由(1-13:黑桃A-K || 14 - 26:红桃 || 27 - 39:梅花 || 39 - 52 : 方片 || 53.54:小王.大王)表示的一副扑克牌,这样对数组除以13等于扑克花色(如:25/13 = 2 是红桃),对数组值取模等于扑克点数(如:25%13 = 12 是Q),这样25就表示了红桃Q的扑克牌. 当处理特殊规则的时候单独写一个List,在组拼就可以了. 比如说:赖子斗地主的

  • C#实现贪吃蛇小游戏

    本文实例为大家分享了C#实现贪吃蛇小游戏的具体代码,供大家参考,具体内容如下 之前一直想写一个贪吃蛇小游戏,上个周末终于有时间做了一个,现在和大家分享. 界面 界面比较简单,一个按钮和一个积分器组成.基本逻辑:每五个食物出现一次大食物,小食物1分,大食物5分.控制:撞墙和缠绕时,游戏暂停. 代码详解 详细介绍下代码 一.代码分详解 1.界面是在pc上,所以移动以上下左右键来控制移动,为了及时响应,所以增加如下代码 protected override bool ProcessDialogKey(

  • C#实现坦克大战游戏

    本文实例为大家分享了C#实现坦克大战游戏的具体代码,供大家参考,具体内容如下 前言 该程序主要对原始的坦克大战游戏进行了简单的还原.目前程序可以做到自动生成敌方坦克且敌方能够随机发射子弹,我方坦克也能做到边发射子弹边移动.唯一的不足之处就是还没有完整通关的设置以及障碍的设置. 界面效果图 图1 部分代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; u

  • C#实现猜数字小游戏

    本文实例为大家分享了C#实现猜数字小游戏的具体代码,供大家参考,具体内容如下 效果如图: 代码: using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; namespace _1csz {

  • C#实现石头剪刀布游戏

    本文实例为大家分享了C#实现石头剪刀布的具体代码,供大家参考,具体内容如下 代码 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Windows.Fo

  • C#实现扑克游戏(21点)的示例代码

    目录 一.游戏介绍 1.1 游戏规则 1.2 牌点计算 1.3 判断胜负 二.游戏设计 2.1 游戏流程 2.2 玩家类 2.3 AI类 三.参考代码 一.游戏介绍 1.1 游戏规则 21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大. 1.2 牌点计算 A至10牌,按其原点数计算:J.Q.K都算作10点. 1.3 判断胜负 二十一点玩法规则和概率在二十一点游戏中,拥有最高点数的玩家获胜,其点数必须等于或低于21点:超过21

  • JAVA实现经典游戏坦克大战的示例代码

    目录 前言 主要设计 功能截图 代码实现 总结 前言 小时候大家都玩过坦克大战吧,熟悉的旋律和丰富的关卡陪伴了我们一整个寒暑假,还记得传说中的经典坦克大战 吗?那些怀旧的记忆,伴随着我们一起走过来的经典坦克大战,刚开始那战战兢兢,屡屡被敌人坦克击毁的情景历历在目.现在好了,再也不用担心敌人坦克了,可 以横冲直撞,横扫敌人坦克了.快哉!!! <坦克大战>游戏以坦克战斗为主题,用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 可以生成不同的地图,消灭地

  • Java实现经典游戏推箱子的示例代码

    目录 前言 主要设计 功能截图 代码实现 核心类 声音播放类 总结 前言 <推箱子>推箱子是一个古老的游戏,目的是在训练你的逻辑思考能力.在一个狭小的仓库中,要求把木箱放到指定的位置,稍不小心就会出现箱子无法移动或者通道被堵住的情况,所以需要巧妙的利用有限的空间和通道,合理安排移动的次序和位置,才能顺利的完成任务. 游戏是用java语言实现,采用了swing技术进行了界面化处理,设计思路用了面向对象思想. 主要需求 控制搬运工上下左右移动,来将箱子推到指定地点 主要设计 1.游戏面板生成显示

  • Java实现经典游戏Flappy Bird的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心类 工具类 总结 前言 <布谷鸟闯关-简单版>是一个基于java的布谷鸟闯关游戏,摁上键控制鸟的位置穿过管道间的缝隙,需要做碰撞检测,监听键盘事件,背景图片的切换,障碍物管道产生时y轴上需要随机位置. 主要设计 设计游戏界面,用swing实现 设计背景 设计移动墙 设计布谷鸟 设计障碍物 设计背景音乐和音效 由几个关键的布尔类型变量start,crash,over是产生键键盘事件时用来控制界面显示的弹框的 操作:空格键开始游戏,ente

  • Java实现经典游戏黄金矿工的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏核心类 钩子类 总结 前言 <黄金矿工>游戏是一个经典的抓金子小游戏,它可以锻炼人的反应能力..该游戏中,可以通过“挖矿”获得积分,游戏道具:有3瓶药水,在回收绳子抓金子的时候速度稍快点. 主要设计 设计游戏界面,用swing实现 随机创建金块算法 随机创建石块算法 计时系统设计 积分系统设计 设置鼠标事件,鼠标左键出钩子:鼠标右键开始游戏,确认吃药水等功能. 功能截图 游戏开始: 抓金子 代码实现 游戏核心类 public class GameW

  • Java实现经典游戏泡泡堂的示例代码

    目录 前言 主要设计 功能截图 代码实现 游戏启动类 核心监听类 核心线程类 总结 前言 <泡泡堂I>是一个基于java的自制游戏,游戏设计为双人pk积分赛模式,在这个模式里面,玩家只要率先达到一定分数既可以赢得比赛.玩家可以通过炸箱子可以得到少量的分数,也可以通过炸掉对手然后戳破包围对手的水泡得到大量分数.而玩家如果被泡泡爆炸击中,会被泡泡包裹一段时间,在这段时间内不可以移动和放泡泡,需要等时间过去或者被对手戳破水泡才能获得自由.但如果玩家被自己放的泡泡炸中,会扣一定的分数. 主要设计 设计

  • C语言实现飞机游戏(豪华版)的示例代码

    目录 前言 一.飞机显示与控制 二.发射子弹 三.击中敌机 四.多台敌机 五.发射散弹 前言 这是飞机游戏的第三版,我们已经实现了基础版和进阶版的飞机游戏  ,但是存在的问题很明显:已经发射出去的子弹会随着飞机位置的实时改变而改变,并且不能实现连发.如果第一次看此文章,可能有部分代码(例如基本游戏框架,清屏功能,键盘控制,数据处理)不了解其功能,建议看看之前写的博客用c实现最简单的飞机游戏和用c实现进阶版飞机游戏 应用数组,可以更方便地记录复杂的数据,实现更复杂的显示.逻辑判断与控制.本篇文章利

  • C语言实现飞机游戏(进阶版)的示例代码

    目录 前言 一.代码重构 二.新式子弹代替激光 三.优化敌方战机 四.增加积分模块 五.更好的清屏功能 前言 没有学习函数,以上功能都在main()中实现是有点痛苦的.在学了函数之后会模块化重构相应的游戏,大家经历过上面的痛苦才能真正理解函数的好处.如果只是被动地学习语法知识,做些简单的算法题,是很难体会到函数封装的重要性的. 我们前面制作的用c语言实现一个最简单的飞机游戏但存在如下缺陷: 可能会遇到子弹运动时无法输入 键盘控制比较卡 不按键时敌人不会自动移动等问题,且敌人只出现一次 屏幕图标闪

  • Python实现21点小游戏的示例代码

    目录 游戏玩法 代码 - v1 测试 代码 - v2 测试 游戏玩法 游戏玩法: 该游戏由 2 到 6 个人玩,使用除大小王之外的 52 张牌, 游戏者的目标是使手中的牌的点数之和不超过 21 点且尽量大. 有着悠久的历史.黑杰克简称为21点,1700年左右法国赌场就有这种21点的纸牌游戏. 1931年,当美国内华达州宣布赌博为合法活动时,21点游戏第一次公开出现在内华达州的赌场俱乐部, 15年内,它取代掷骰子游戏,而一举成为非常流行的赌场庄家参与的赌博游戏. 代码 - v1 import ra

  • Python实现炸金花游戏的示例代码

    今天的第二个作品,哈哈哈哈,搞起来感觉还挺有意思的,不过代码里纸牌J,Q,K,A几个数字被我替换成了11,12,13,14......主要是没有想到简单的办法让其比较,索性都用数字了,我太菜了,希望有大佬指点一下. 代码如下: import random   #导入随机数函数 def puke():     """     生成一副52张的扑克牌(除去大小王)     :return:     """     list1 = ['黑桃', '红桃

随机推荐