现有的用户?据a href="//www.parkandroid.com/account/login/?next=/wiki/programming-blackjack/" id="problem-login-link-alternative" class="btn-link ax-click" data-ax-id="clicked_login_from_generic_modal" data-ax-type="button" data-is_modal="true" data-next="/wiki/programming-blackjack/">登录据/a>
已经有一个帐户?据a href="//www.parkandroid.com/account/login/?next=/wiki/programming-blackjack/" class="ax-click" data-ax-id="clicked_signup_modal_login" data-ax-type="link">这里登录。据/a>
我们可以使用我们的编程技能的一个方向是游戏开发。在这里,我们将建立一个基于文本的Blackjack引擎,使我们能够扮演遵循传统房屋规则的经销商。二十一点的逻辑很简单,但足够很复杂,我们可以获得在以后制作更复杂的游戏的宝贵经验。正如我们所说,与商业Blackjack平台相比,此引擎具有多种简化:据/p>
通过使用TK等GUI系统,通过将游戏逻辑折叠成面向对象的游戏设计,并建立一个会计系统以跟踪芯片数量,标签和赌注。据/p>
对于那些喜欢跟随的人,这里是据a target="_blank" rel="nofollow" href="https://d18l82el6cdm1i.cloudfront.net/uploads/documents/blackjack_no_class-L5wNHW6Ohu.py">完整的代码据/a>。据/p>
要提醒自己,二十一点规则如下:据/p>
玩家和经销商从随机牌接收两张牌。在我们的情况下,我们将使用单个甲板,尽管赌场通常使用由六个甲板组成的“鞋”。据/p>
在头两张牌分发给发牌人和玩家后,玩家会被问到是否想要另一张牌(称为“击中”),或者是否对已经获得的牌感到满意(称为“留下”)。目标是使你的卡值的总和接近21,而不超过21。如果我们正好投进21,我们就有21点,无可匹敌。如果我们超过21,我们就会“破产”,输掉这一轮。球员可以在任何时候停止击球。据/p>
数字卡(2到10)值得显示的数字,面部卡值10,ACE可以值得1或11.例如,如果我们的前两张牌是千斤顶和ACE,我们想要要计算ACE,因为10 + 11 = 21 = 21,我们有二十一点,但是,如果我们已经有一只手18岁,那就决定击中,并得到一个王牌,我们想把它算作1,由于将其计数为11,我们将让我们成为29岁,我们会陷入困境。据/p>
一旦我们的手完成,经销商会试图这样做。经销商必须继续击中,直到他们到达17岁。如果他们在没有破坏的情况下超过17岁,他们可以留下来。据/p>
最后,游戏通过简单的规则解决据/p>
如果玩家有二十一点,他们赢了,除非经销商也有二十一点,在这种情况下,游戏是一个领带。据/p>
如果经销商胸围和玩家没有,那么玩家赢了。据/p>
如果玩家胸部,经销商赢了。据/p>
如果玩家和经销商都不要破产,那么谁最接近21胜。据/p>
我们需要玩Blackjack的第一件事是一块随机的卡片。首先,我们将编写完成此操作的代码。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14据/pre> |
|
我们用列表奠定了卡片的等级和套装,然后写了一个简单的功能据code>get_deck()据/code>使用列表理解构造牌组。据/p>
最后,我们使用了Python的据code>随机的据/code>库,具有用于生成随机性的各种功能。特别是,我们雇用据code>洗牌据/code>,它采用任何列表并以随机顺序返回它,以便将我们的卡片洗牌。据/p>
通过解决此功能,我们可以处理玩家和经销商的前两张牌。我们使用破坏性据code>流行音乐据/code>从列表中返回最后一个元素并将其从列表中删除的操作作为副作用。我们还定义了一个布尔变量,以跟踪玩家是否仍然积极投注(他们没有被破坏,并且没有要求用目前的手“留”)据/p>
1 2 3 4 5 6据/pre> |
|
在开始21点游戏时,玩家会从洗牌的桥牌中随机分到两张牌。据/p>
您编写以下代码来模拟处理初始手的行为。要测试代码,您会处理一只手据span class="katex">
1据/span>0.据/span>6.据/span>时间并记录玩家在前两张牌上发布二十一牌的次数。如果代码正确写入,您希望找到什么据span class="katex">
F据/span>^据/span>黑人杰克据/span>,初始手的一小部分是二十一点?据/p>
假设和细节据/strong>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16据/pre>
从据/span>随机的据/span>进口据/span>洗牌据/span>#定义卡排名和西装据/span>排名据/span>=据/span>[据/span>_据/span>为了据/span>_据/span>在据/span>范围据/span>(据/span>2据/span>那据/span>11.据/span>)据/span>+据/span>[据/span>'杰克'据/span>那据/span>'女王'据/span>那据/span>'王'据/span>那据/span>'高手'据/span>]据/span>西装据/span>=据/span>[据/span>'铲'据/span>那据/span>'心 '据/span>那据/span>'钻石'据/span>那据/span>'俱乐部'据/span>]据/span>def据/span>get_deck.据/span>():据/span>“”“返回一个新的卡片。”“”据/span>返回据/span>[[据/span>秩据/span>那据/span>适合据/span>]据/span>为了据/span>秩据/span>在据/span>排名据/span>为了据/span>适合据/span>在据/span>西装据/span>]据/span>#获得一张卡片,随机洗牌据/span>甲板据/span>=据/span>get_deck.据/span>()据/span>洗牌据/span>(据/span>甲板据/span>)据/span>#发牌和发他们的头两张牌据/span>Player_Hand.据/span>=据/span>[据/span>甲板据/span>。据/span>流行音乐据/span>(),据/span>甲板据/span>。据/span>流行音乐据/span>()]据/span>
接下来,我们编写一个接受一个列表,其中包含手的卡片作为表单中的元组据code>(等级,西装)据/code>。逻辑很简单。首先,我们编写一个辅助函数,采用单张卡,并根据我们上面概述的方案返回其值。默认情况下,我们计算每个据code>高手据/code>作为11.我们将此功能映射到手上并将值的总和存储为据code>tmp_value.据/code>。据/p>
第二个主要的逻辑是计算手上的a的总数。然后我们检查手值是否小于或等于21。如果不是,而手里有a,就减11。如果手小于21,我们返回手。否则,如果手上有第二张a,我们再减11,再检查一下。我们继续这样做,直到我们用尽所有的牌。据/p>
最后一步是返回手的值。如果我们有一个分数21,我们会返回一个包含分数的字符串表示的两个条目列表,以及分数的整数值。作为一项公约,我们将萧条归结为100。据/p>
12 34 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据/pre> |
|
我们代码的下一件事是游戏逻辑。正如我们上面所概述的那样,我们必须询问球员是否想击中或留下来,并继续向他们询问,直到他们破产,或者他们决定留下来。对于玩家的决定至关重要的一条信息是他们目前的统计,因此,我们每次都会在询问响应之前打印玩家的手和当前的目前。据/p>
只要球员的手不是一个破产,我们就使用Python提出了这个问题据code>RAW_INPUT.据/code>功能,可以采用键盘输入。为方便起见,我们采取据code>1据/code>象征着“打我”,和据code>0.据/code>象征“呆”。如果他们要打,我们就再打据code>流行音乐据/code>甲板,将新卡附加到我们目前的手,并立即将新绘制的卡打印到屏幕。如果他们要求留下来,我们改变价值据code>球员_in.据/code>到据code>错误的据/code>并继续转向经销商。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 17 18 19 20 21 22据/pre> |
|
此时,我们计算玩家的分数,以及经销商的当前分数(在他的前两张牌上)。如果玩家的手不是胸围,我们打印经销商的计数和当前手。然后,虽然经销商的手价值小于17,但经销商被击中。经销商击中后,我们打印了新卡。通过设计,当经销商超过17时,这种环路停止。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13据/pre> |
|
此时,游戏几乎完成。剩下的是检查玩家的分数和经销商的分数,以根据我们上面概述的得分规则列表。要开始,我们获得标签,以及经销商手的得分。接下来,我们只是枚举可能的最终状态,并询问我们哪一个比赛满足。根据结果,我们打印到宣布胜利者的屏幕。据/p>
1 2 3 4 5 6 7 8 9 10据/pre> |
|
考虑下面的两个样本游戏。据/p>
首先,我们正在处理一个据span class="katex"> ♡据/span>和4据span class="katex"> ♡据/span>,这给了我们15.然后我们继续画三张牌(q据span class="katex"> ♠据/span>,2据span class="katex"> ♡据/span>,3据span class="katex"> ♡据/span>)让我们不到20岁。绘制另一个王牌不太可能,所以我们留下来。据/p>
在这个过程中,我们的一个据span class="katex"> ♡据/span>从11到1的价值下降,以免陷入困境。据/p>
经销商被迫袭击他的13起,画出9据span class="katex"> ♠据/span>,并胸围。据/p>
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 18 19 20 21 21 22 23 23 29 29 29 29 29 29 32 32据/pre>python blackjack_no_class.py你目前在15岁时用[['ace','heart'],[4,'心脏']]击中还是留下来?(点击= 1,stay = 0)1你画出['女王','spade']你当前在15岁时用手[['ace','heart'],[4,'heart'],['女王','Spade']]击中或留下来?(点击= 1,stay = 0)1你画出[2,'心']你当前在17左右用手[['ace','heart'],[4,'heart'],['女王'','Spade'],[2,'心脏']]击中还是留下来?(点击= 1,stay = 0)1你画出[3,'心']你目前用手['ace','heart'],[4,'heart'],['女王'','Spade'],[2,'心'],[3,'心脏']]击中还是留下来?(点击= 1,stay = 0)0经销商用手13 [[10,'俱乐部'],[3,'Spade']]经销商绘制[9,'Spade']你打败了经销商!据/code>
在第二个案例中,我们是那些去胸围的人,该计划告诉我们我们已经这样做了。在这种情况下,经销商赢了。据/p>
1 2 3 4 5 6 7 8 9 10据/pre>你目前在12岁时用手[[8,'spade'],[4,'钻石']]击中或留下来?(点击= 1,Stay = 0)1你画出['女王','钻石']你目前在胸围!用手[[8,'spade'],[4,'钻石'],['女王','钻石']]经销商赢了!据/code>
现有的用户?据a href="//www.parkandroid.com/account/login/?next=/wiki/programming-blackjack/" id="problem-login-link-alternative" class="btn-link ax-click" data-ax-id="clicked_login_from_problem_modal" data-ax-type="button" data-is_modal="true" data-next="/wiki/programming-blackjack/">登录据/a>
问题加载......据/p>
注意加载......据/p>
设置加载......据/p>