GameMale
登陆 / 注册 搜索

USERCENTER

SEARCHSITE

搜索

查看: 1545|回复: 22
收起左侧

[技术交流] 【Python】【原创】21点游戏

[复制链接] |关注本帖

邪恶的面具海盗弯钩神秘的红茶冒险用绷带魔法石碑箭术卷轴质量效应三部曲

     楼主| 白冥 发表于 2025-3-14 11:28:11 | 显示全部楼层 |阅读模式 <
    简介      

            21点(Blackjack)是一款非常流行的纸牌游戏,玩家的目标是通过手中的牌尽量接近21点,且不能超过21点。如果玩家点数超过21点,则视为“爆掉”,庄家获胜。如果庄家的点数超过21点,则玩家获胜。本游戏的规则遵循经典的21点游戏规则。


    安装与配置      
            在使用此代码之前,您需要安装Python环境,并确保具备安装有Python 3.10及以上版本:本游戏代码是用Python编写的。您可以从Python官网下载并安装Python。


    安装步骤      
            从Python官网下载安装包,按照安装向导安装Python。安装过程中确保勾选了“Add Python to PATH”选项,这样您可以在终端或命令行中直接使用Python。安装完成后,打开命令行(Windows用户可以打开CMD,Mac用户可以打开终端),输入以下命令以验证安装是否成功:
    1. python --version
    复制代码
            如果显示Python版本号,则安装成功。
    将提供的21点游戏代码文件保存为一个.py文件,例如blackjack.py。
            确保代码文件位于您可以方便访问的位置。
            在命令行中,导航到存储代码的文件夹,并运行以下命令来启动游戏:
    1. python blackjack.py
    复制代码

    实例化对象      
          要玩游戏,请在命令行输入:


    1. bj = Blackjack()
    2. bj.start_game()
    复制代码


    看牌      
            若想知道你的手牌,请在命令行输入:
    1. bj.your_cards()
    复制代码
            游戏未结束前,你可以查看庄家的第一张牌(明牌):
    1. bj.peek()
    复制代码
            游戏结束后,你可以看庄家的手牌,复盘你的得失:
    1. bj.see_banker_cards()
    复制代码


    你的回合      
            输入窗口会在你的回合中提醒你是否要牌,或者结束你的回合:
    1. During your turn, you can continue choose "hit" for one more card until you get 21, or fail to bust, or choose "stand" your turn.
    复制代码
            你可以选择要牌,在你得到21点获得胜利,或者因爆牌输掉之前:
    1. hit
    2. hit
    3. hit
    复制代码
            再或者你觉得你势在必得,或者见好就收,你可以停牌:
    1. stand
    复制代码
            很快,你将验收你的成果,或是赢的游戏,或是输掉结局,更或者你会罕见地获得一份“和平”:
    1. win
    复制代码
    1. fail
    复制代码
    1. even
    复制代码
            无论如何,这都是一份很简单的游戏,你只负责做出选择,还是说,并不是?


    源代码      
            源代码见下,非常简单易懂:
    1. import random

    2. SUITS = ['梅花', '方块', '红心', '黑桃']
    3. RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
    4. DOT = {'2': 2, '3': 3, '4': 4, '5': 5, '6': 6, '7': 7, '8': 8, '9': 9, '10': 10, 'J': 10,  'Q': 10, 'K': 10}

    5. class Blackjack:
    6.    
    7.     def __init__(self):
    8.         self._deck = []
    9.         self._banker = []
    10.         self._player = []
    11.         self.is_start = False
    12.         self.has_end = False
    13.     def _shuffle(self):
    14.         deck = [(suit, rank) for suit in SUITS for rank in RANKS]
    15.         random.shuffle(deck)
    16.         return deck
    17.     def _hit(self):
    18.         return self._deck.pop()
    19.     def peek(self):
    20.         if self.is_start:
    21.             return self._banker[0]
    22.         return None
    23.     def start_game(self):
    24.         self.has_end = False
    25.         self._deck = self._shuffle()
    26.         self._player.clear()
    27.         self._banker.clear()
    28.         self._player.append(self._hit())
    29.         self._banker.append(self._hit())
    30.         self._player.append(self._hit())
    31.         self._banker.append(self._hit())
    32.         self.is_start = True
    33.         self.is_your_turn = True
    34.         result = self._player_turn()
    35.         print(result)
    36.         self.is_start = False
    37.     def _dot(self):
    38.         banker_dots = 0
    39.         player_dots = 0
    40.         banker_aces = 0
    41.         player_aces = 0
    42.         for _, rank in self._player:
    43.             match rank:
    44.                 case 'A':
    45.                     player_aces += 1
    46.                 case _:
    47.                     player_dots += DOT[rank]
    48.         if player_dots + 11 + player_aces - 1 <= 21 and player_aces != 0:
    49.             player_dots += 11 + player_aces - 1
    50.         else:
    51.             player_dots += player_aces
    52.         for _, rank in self._banker:
    53.             match rank:
    54.                 case 'A':
    55.                     banker_aces += 1
    56.                 case _:
    57.                     banker_dots += DOT[rank]
    58.         if banker_dots + 11 + banker_aces - 1 <= 21 and banker_aces != 0:
    59.             banker_dots += 11 + banker_aces - 1
    60.         else:
    61.             banker_dots += banker_aces
    62.         return player_dots, banker_dots
    63.     def your_cards(self):
    64.         return self._player[:]
    65.     def _player_turn(self):
    66.         player_dots, banker_dots = self._dot()
    67.         if player_dots == 21 and banker_dots == 21:
    68.             return 'even'
    69.         elif player_dots == 21:
    70.             return 'win'
    71.         elif banker_dots == 21:
    72.             return 'fail'
    73.         while True:
    74.             match input('During your turn, you can continue choose "hit" for one more card until you get 21, or fail to bust, or choose "stand" your turn.'):
    75.                 case 'hit':
    76.                     self._player.append(self._hit())
    77.                     player_dots, _ = self._dot()
    78.                     if player_dots > 21:
    79.                         return 'fail'
    80.                     elif player_dots == 21:
    81.                         return 'win'
    82.                 case 'stand':
    83.                     result = self._banker_turn()
    84.                     return result
    85.                 case _:
    86.                     continue
    87.     def see_banker_cards(self):
    88.         if self.has_end:
    89.             return self._banker[:]
    90.     def _banker_turn(self):
    91.         while True:
    92.             player_dots, banker_dots = self._dot()
    93.             if banker_dots < 17:
    94.                 self._banker.append(self._hit())
    95.             elif 17 <= banker_dots <= 21:
    96.                 if player_dots < banker_dots:
    97.                     self.has_end = True
    98.                     return 'fail'
    99.                 elif player_dots == banker_dots:
    100.                     self.has_end = True
    101.                     return 'even'
    102.                 else:
    103.                     self.has_end = True
    104.                     return 'win'
    105.             elif banker_dots > 21:
    106.                 self.has_end = True
    107.                 return 'win'
    108.         
    复制代码


    评分

    参与人数 2追随 +2 收起 理由
    anotherfish + 1
    三分春色描来易 + 1

    查看全部评分

    回复

    使用道具 举报

    艾吉奥位于左侧的随从已派遣远征

      万俟 发表于 2025-3-14 11:43:34 | 显示全部楼层 <
      感觉这个游戏设计虽然简单,人多的时候玩起来真的还挺上头的
        收起(2)
      回复

      举报

      John Reese裸体克里斯位于左侧的随从已派遣远征自定义男从Homunculus虚空之海的鲸永浴爱河黄粱一梦【新春限定】果体 隆新神的赐福永远的克叔

        娱乐法师火布偶 发表于 2025-3-14 12:21:07 | 显示全部楼层 <
        回复

        举报

        牧羊人驯化红龙幼崽

          15022362119 发表于 2025-3-14 13:17:38 | 显示全部楼层 <
          回复

          举报

          猎鹰图腾寻觅森林羊男眼镜蛇图腾【新手友好】昆進GM論壇進階勛章牧羊人

            crossing488 发表于 2025-3-14 13:38:28 | 显示全部楼层 <
            感觉像是学python的大学生写的课程作业这是可以说的吗
            回复

            举报

            驯化黑龙幼崽瑞雪兆丰年,生灵万物新驯化红龙幼崽沙漠羽蛋锻造卷轴漂洋小船莱托·厄崔迪暗红矿土

              abc29754 发表于 2025-3-14 14:51:12 | 显示全部楼层 <
              21点基本是赌博类游戏的入门了,基本多多少少都接触过,简单的规则和玩法吸引不少人,看过一些赌博类动画,好像挺多作弊或者一些细节的特殊手段
              回复

              举报

                zhenxianglaoge 发表于 2025-3-14 18:10:38 | 显示全部楼层 <
                回复

                举报

                  p0v0q 发表于 2025-3-14 19:10:12 | 显示全部楼层 <
                  回复

                  举报

                  赛博朋克2077铁牛

                    Kumo 发表于 2025-3-14 20:09:00 | 显示全部楼层 <
                    惹,刚从如山的python代码里出来(晕),可以用代码每步算一算概率,决定是继续抽还是停牌,当然赌狗赌到最后应有尽有(
                    回复

                    举报

                    暗红矿土木柴堆没有梦想的咸鱼纯爷们阿齐斯位于左侧的随从已派遣远征裸体克里斯丛林的鸟飞走了初遇朱迪幸福的小阿尔

                      柏芸 发表于 2025-3-14 23:10:07 | 显示全部楼层 <
                      回复

                      举报

                      凯登‧阿兰科位于左侧的随从已派遣远征炙热的格拉迪欧拉斯【夏日限定】夏日的泰凯斯新神的赐福死灵之书灵魂之椅

                        cdcai 发表于 2025-3-15 01:08:40 | 显示全部楼层 <
                        回复

                        举报

                        达拉然男用贞操带漂洋小船沙漠羽蛋雪王的心脏破损的旧书不曾寄出的信件荒野大镖客:救赎 II

                          3150904279 发表于 2025-3-15 01:42:52 | 显示全部楼层 <
                          回复

                          举报

                          裸体克里斯位于左侧的随从已派遣远征

                            you9632587 发表于 2025-3-15 07:42:08 | 显示全部楼层 <
                            之前也在部分游戏里见过内置21点的小游戏,有些为了避免玩家太大心理落差会做成有保底机制,或者rpg类型的做成和幸运挂钩,毕竟游戏里的不是要坑玩家钱而且让玩家玩的
                            回复

                            举报

                            GM論壇勛章【新手友好】昆進牧羊人森林羊男『搓粉团珠』风雪之家神奇宝贝大师球铁牛

                              zhnlwwdzz 发表于 2025-3-15 10:22:51 | 显示全部楼层 <
                              回复

                              举报

                              Joker位于左侧的随从已派遣远征小小舞台『 弗霖的琴』肉乖乖業火死鬥男巫之歌泰比里厄斯【夏日限定】夏日的泰凯斯史莱姆牧场

                                书の妖怪 发表于 2025-3-15 11:09:33 | 显示全部楼层 <
                                回复

                                举报

                                牧羊人

                                  shuaitong555 发表于 2025-3-15 11:38:44 | 显示全部楼层 <
                                  回复

                                  举报

                                    芸__彩 发表于 2025-3-16 10:29:40 | 显示全部楼层 <
                                    回复

                                    举报

                                    驯化红龙幼崽【新手友好】昆進崭新的白袜GM論壇初心者畢業證書牧羊人

                                      tadpole 发表于 2025-3-17 12:45:40 | 显示全部楼层 <
                                      回复

                                      举报

                                      敖蜃星雷霆晶球雪王的心脏破损的旧书不曾寄出的信件男用贞操带漂洋小船夜魔护符

                                        百变小阴 发表于 2025-3-17 14:16:47 | 显示全部楼层 <
                                        我确实知道21点这游戏,但不知道Python也能直接用代码做呢?感觉很多游戏里的小游戏都一样是这么制造的?
                                        回复

                                        举报

                                        永远的克叔裸体克里斯猫咪点唱机【夏日限定】夏日的泰凯斯保卫领土【新春限定】果体 隆破碎的圣水瓶業火死鬥传奇亚瑟‧摩根

                                          大河内太 发表于 2025-3-17 17:15:50 | 显示全部楼层 <
                                          回复

                                          举报

                                          您需要登录后才可以回帖 登录 | 立即注册

                                          本版积分规则

                                          文字版|手机版|小黑屋|GameMale

                                          GMT+8, 2025-5-2 13:03 , Processed in 0.141098 second(s), 142 queries , Redis On.

                                          Copyright © 2013-2025 GameMale

                                          All Rights Reserved.

                                          快速回复 返回列表