当前位置:网站首页>Poker Game in C# -- Introduction and Code Implementation of Blackjack Rules
Poker Game in C# -- Introduction and Code Implementation of Blackjack Rules
2022-07-31 18:33:00 【Chen's words must be done】
C# 之 扑克游戏 -- 21Some rules introduction and code implementation
一,游戏介绍
1.1 游戏规则
21, also known as black jack,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大.
1.2 Card point calculation
A至10牌,按其原点数计算;J、Q、K都算作10点.
1.3 判断胜负
二十一点玩法规则和概率在二十一点游戏中,拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21点的玩家称为爆牌.拥有最高点数的玩家获胜,其点数必须等于或低于21点;超过21Sentenced to between negative.
二,游戏设计
2.1 游戏流程
发牌:
玩家和AI每人发两张牌,By hand points and big players preference whether to take CARDS in a pile of CARDS取牌:
手牌点数和小于21,等待1Priority in clockwise turn again after other players choose whether to take cardTake after:
If the card point greater than21Directly to the negative out,On the left1人,直接游戏结束;否则重复2-3
If the card points less than or equal to21It is buyers take card,重复2-3游戏结束
Other players get after all over21点,只剩1人,直接获胜
After all players chose not to take the card,According to the rules to compare all players hand points and,Some brand of the big win.
2.2 玩家类
By taking card players to choose whether to continue.(输入YContinue to take card,NIs don't take card)
2.3 AI类
简化AI逻辑,发牌后AIHand and as4-8Continue to take the card,一直到17点或17Above no longer take card;Because at this time to take card more than more than half of the probability21点.
三,参考代码
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);
// Relationship between event binding
poker.GameSratrHandler += player.GameStart;
poker.GameSratrHandler += ai.GameStart;
// 游戏开始
poker.GameStart();
// 每人发两张牌
poker.SendCard();
poker.SendCard();
// Ask to take card
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("Players to sort out the clothes,准备开局;");
}
public override void SendCard(int card)
{
handCards.Add(card);
Console.WriteLine("Players licensing:" + PokeTools.PokerBrandByPoint(card));
}
public override bool TakeCard()
{
Console.WriteLine("Your current hand points and as:" + HandCardsPoint);
Console.WriteLine("Whether or not to continue to take card(Y/N)?");
string readStr = Console.ReadLine();
// 输入Y取牌,The other is not take card
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()
{
// Hand a few points less than17,Will continue to take the card
return HandCardsPoint < 17;
}
}
class Poker
{
List<AbsPlayer> players = new List<AbsPlayer>();
public Action GameSratrHandler;
public Action<int> SendCardHandler;
public Func<int, bool> TaskCardHandler;
// Licensing with
List<int> sendCards;
public Poker(List<int> cards)
{
// A copy of licensing with
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>
/// 发牌 -- Would eliminate has sent a card
/// </summary>
public void SendCard()
{
for (int i = 0; i < players.Count; i++)
{
players[i].SendCard(SendOneCard());
}
}
int SendOneCard()
{
// Randomly send a card
Random random = new Random();
int index = random.Next(0, sendCards.Count);
// To brand value
int cardPoint = sendCards[index];
// Removed from the hand --> In order to avoid to the same card
sendCards.RemoveAt(index);
return cardPoint;
}
public void TaskCard()
{
for (int i = 0; i < players.Count; i++)
{
// Select take card again after hair card
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} Got a card" );
}
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>
/// According to the card point returns brand 如:14 ->红桃3
/// </summary>
/// <param name="card"></param>
/// <returns></returns>
public static string PokerBrandByPoint(int card)
{
if (card > 52 || card <= 0)
{
Console.WriteLine("Not poker points");
return "Not poker points";
}
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;
// Return to design and color + 牌点 如:红桃3
return flowerColor[huaSe] + points[point];
}
/// <summary>
/// Hand sum
/// </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, "Card point and:" + PokeTools.HandCardsSum(handCards));
}
}
}
测试结果:
边栏推荐
- &lt;artifactId&gt;ojdbc8&lt;/artifactId&gt;「建议收藏」
- MySQL - single function
- 杰理语音芯片ic玩具芯片ic的介绍_AD14NAD15N全系列开发
- Write a database document management tool based on WPF repeating the wheel (1)
- matplotlib ax bar color 设置ax bar的颜色、 透明度、label legend
- Go basic part study notes
- Introduction of Jerry voice chip ic toy chip ic_AD14NAD15N full series development
- Golang 必知必会Go Mod命令
- go基础部分学习笔记记录
- 移动web开发02
猜你喜欢

AcWing 1282. Search Keyword Problem Solution ((AC Automata) Trie+KMP)+bfs)

IP协议从0到1

架构师04-应用服务间加密设计和实践

ECCV 2022 华科&ETH提出首个用于伪装实例分割的一阶段Transformer的框架OSFormer!代码已开源!...

Unity 之 音频类型和编码格式介绍

Huawei's top engineers lasted nine years "anecdotal stories network protocol" PDF document summary, is too strong

Kotlin协程:续体、续体拦截器、调度器

【PIMF】OpenHarmony 啃论文俱乐部—盘点开源鸿蒙三方库【3】

程序员如何学习开源项目,这篇文章告诉你

MATLAB程序设计与应用 2.4 MATLAB常用内部函数
随机推荐
Taobao/Tmall get Taobao password real url API
MySQL---Basic select statement
【AcWing】第 62 场周赛 【2022.07.30】
[TypeScript] OOP
IP协议从0到1
Handling Write Conflicts under Multi-Master Replication (1)-Synchronous and Asynchronous Conflict Detection and Conflict Avoidance
Masterless replication system (2) - read and write quorum
MySQL---Subqueries
Go1.18升级功能 - 模糊测试Fuzz 从零开始Go语言
iNeuOS工业互联网操作系统,设备运维业务和“低代码”表单开发工具
程序员如何学习开源项目,这篇文章告诉你
多主复制下处理写冲突(1)-同步与异步冲突检测及避免冲突
35道MySQL面试必问题图解,这样也太好理解了吧
Chinese encoding Settings and action methods return values
ojdbc8 "Recommended Collection"Go record - slice
Golang——从入门到放弃
ThreadLocal
Huawei mobile phone one-click to open "maintenance mode" to hide all data and make mobile phone privacy more secure
Kotlin coroutines: continuation, continuation interceptor, scheduler