白冥 发表于 2025-3-14 11:28:11

【Python】【原创】21点游戏

简介      

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


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


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


bj = Blackjack()
bj.start_game()

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

你的回合      
      输入窗口会在你的回合中提醒你是否要牌,或者结束你的回合:
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点获得胜利,或者因爆牌输掉之前:
hit
hit
hit      再或者你觉得你势在必得,或者见好就收,你可以停牌:
stand      很快,你将验收你的成果,或是赢的游戏,或是输掉结局,更或者你会罕见地获得一份“和平”:
winfaileven      无论如何,这都是一份很简单的游戏,你只负责做出选择,还是说,并不是?


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

SUITS = ['梅花', '方块', '红心', '黑桃']
RANKS = ['A', '2', '3', '4', '5', '6', '7', '8', '9', '10', 'J', 'Q', 'K']
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}

class Blackjack:
   
    def __init__(self):
      self._deck = []
      self._banker = []
      self._player = []
      self.is_start = False
      self.has_end = False
    def _shuffle(self):
      deck = [(suit, rank) for suit in SUITS for rank in RANKS]
      random.shuffle(deck)
      return deck
    def _hit(self):
      return self._deck.pop()
    def peek(self):
      if self.is_start:
            return self._banker
      return None
    def start_game(self):
      self.has_end = False
      self._deck = self._shuffle()
      self._player.clear()
      self._banker.clear()
      self._player.append(self._hit())
      self._banker.append(self._hit())
      self._player.append(self._hit())
      self._banker.append(self._hit())
      self.is_start = True
      self.is_your_turn = True
      result = self._player_turn()
      print(result)
      self.is_start = False
    def _dot(self):
      banker_dots = 0
      player_dots = 0
      banker_aces = 0
      player_aces = 0
      for _, rank in self._player:
            match rank:
                case 'A':
                  player_aces += 1
                case _:
                  player_dots += DOT
      if player_dots + 11 + player_aces - 1 <= 21 and player_aces != 0:
            player_dots += 11 + player_aces - 1
      else:
            player_dots += player_aces
      for _, rank in self._banker:
            match rank:
                case 'A':
                  banker_aces += 1
                case _:
                  banker_dots += DOT
      if banker_dots + 11 + banker_aces - 1 <= 21 and banker_aces != 0:
            banker_dots += 11 + banker_aces - 1
      else:
            banker_dots += banker_aces
      return player_dots, banker_dots
    def your_cards(self):
      return self._player[:]
    def _player_turn(self):
      player_dots, banker_dots = self._dot()
      if player_dots == 21 and banker_dots == 21:
            return 'even'
      elif player_dots == 21:
            return 'win'
      elif banker_dots == 21:
            return 'fail'
      while True:
            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.'):
                case 'hit':
                  self._player.append(self._hit())
                  player_dots, _ = self._dot()
                  if player_dots > 21:
                        return 'fail'
                  elif player_dots == 21:
                        return 'win'
                case 'stand':
                  result = self._banker_turn()
                  return result
                case _:
                  continue
    def see_banker_cards(self):
      if self.has_end:
            return self._banker[:]
    def _banker_turn(self):
      while True:
            player_dots, banker_dots = self._dot()
            if banker_dots < 17:
                self._banker.append(self._hit())
            elif 17 <= banker_dots <= 21:
                if player_dots < banker_dots:
                  self.has_end = True
                  return 'fail'
                elif player_dots == banker_dots:
                  self.has_end = True
                  return 'even'
                else:
                  self.has_end = True
                  return 'win'
            elif banker_dots > 21:
                self.has_end = True
                return 'win'
      

万俟 发表于 2025-3-14 11:43:34

感觉这个游戏设计虽然简单,人多的时候玩起来真的还挺上头的

娱乐法师火布偶 发表于 2025-3-14 12:21:07

21点从规则设置上本质还是庄家有利的游戏

随缘 发表于 2025-3-14 13:17:38

真尴尬。不会只有我心里幻想的是某一种用身体做赌注的游戏才进来的吧

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

天呢在这个版块还能看到这种东西,来支持一下

Kumo 发表于 2025-3-14 20:09:00

惹,刚从如山的python代码里出来(晕),可以用代码每步算一算概率,决定是继续抽还是停牌,当然赌狗赌到最后应有尽有(

柏芸 发表于 2025-3-14 23:10:07

很有趣的样子耶,要是身边有人能一起玩就好了

cdcai 发表于 2025-3-15 01:08:40

有玩的截图吗,还是全代码游戏?

3150904279 发表于 2025-3-15 01:42:52

所以说,这个就是单纯的用py做了一个21点游戏吗?还是说有隐藏的玄机?

you9632587 发表于 2025-3-15 07:42:08

之前也在部分游戏里见过内置21点的小游戏,有些为了避免玩家太大心理落差会做成有保底机制,或者rpg类型的做成和幸运挂钩,毕竟游戏里的不是要坑玩家钱而且让玩家玩的

zhnlwwdzz 发表于 2025-3-15 10:22:51

感觉看上去超有意思呢,要是身边能有伙伴一起参与玩就太棒啦。

书の妖怪 发表于 2025-3-15 11:09:33

看了下代码确实非常经典的规则,甚至连庄家的17点默认规则也是一样;P

shuaitong555 发表于 2025-3-15 11:38:44

这个很经典的游戏了 难得在这里遇到这种

芸__彩 发表于 2025-3-16 10:29:40

挺经典的游戏,第一次了解这个游戏是在星露谷上(雾)

tadpole 发表于 2025-3-17 12:45:40

当年大一作业就是用递归写21点的计算器,不过规则放宽了可以用四则运算

百变小阴 发表于 2025-3-17 14:16:47

我确实知道21点这游戏,但不知道Python也能直接用代码做呢?感觉很多游戏里的小游戏都一样是这么制造的?

大河内太 发表于 2025-3-17 17:15:50

之前玩过一个脱衣扑克的3D小黄油
不过可以逃课就没看玩法惹{:6_169:}
页: [1] 2
查看完整版本: 【Python】【原创】21点游戏