Windows下的命令行BlackJack(21点)

Windows下的命令行BlackJack(21点)

编码文章call10242025-06-03 20:23:5114A+A-

近日电脑断网中不能上网,闲来无事,用批处理制作了一个Windows下的BlackJack,一边编程一边调试一边玩玩,还蛮上头的... :)

该批处理脚本接近600行,加入了保险、加倍的功能,未加入分牌功能(分牌复杂度直线飙升,需要更多时间精力),编写调试中碰到不少问题,最终也都一一解决了,当前完的成度还是比较高的,自己也比较满意。

编程思路================================>

设置总计可以抽取20张牌的deck牌堆数组,抽取牌deck[0]=%random%%%52,第一张牌抽取完成,抽取后续牌原则相同,但需要与前续的抽牌进行比较防止有抽重复现象。其中,将抽取的deck数组,分别赋予给相应的庄家和玩家的牌组A1poker[n]和B1poker[n]。然后,调用子函数分别显示各自的花色flower[n]和牌面值face[n]。花色是用的ASCII编码,如下图,该游戏只能在CMD的文字编码(CHCP)为65001(UTF-8)和936(GBK)下游戏。

程序中,需要对各自抽到的A数值进行记录,因为在BlackJack中A可以当1或11点计算,需要加以判别。庄家不满17点则强制抽牌,超过或等于17点则强制停牌不允许抽牌。

游戏规则================================>

庄家明牌为A,则玩家可以购买保险,保险金额为投注的1/2,保险赔率为1:2,庄家为BlackJack,玩家不是,则玩家失去所有押注。如果玩家是BlackJack,庄家不是,玩家直接赢得1.5倍押注。玩家第一次行动可以选择将筹码加倍,选择加倍后只有一次抽牌机会。玩家可以根据自己牌面数值和庄家的明牌选择要牌和停牌。如果要牌后超过21点爆牌则直接判负,失去所有押注。停牌后,则轮到庄家行动,庄家不满17点则强制抽牌,超过或等于17点则强制停牌不允许抽牌,庄家超过21点爆牌则玩家获胜,返还2倍押注。均为爆牌则根据牌面数值比较大小,更接近21点的一方获胜。

游戏总结================================>

该批处理脚本有2处延时循环,1处是购买保险后,庄家查验底牌时候,另1处是庄家行动回合,每一轮抽牌展示所抽到的牌。该2处延时循环可分别设置调整,设置延时恰当可以较好的提升游玩时的体验感。

该批处理脚本有2处延时循环,根据电脑及操作系统版本不同,延时时间有差异,会影响最终体验(用户可以自行在延时的地方优化调整)

最后附上部分源代码(留言后,版主视情发送源码)

@echo off
chcp 65001
REM ********************************************************************
REM Author: zsssj.github.io
REM Data: 2025-05-20
REM ********************************************************************
title BlackJack
mode con cols=68 lines=20 & color 03
setlocal enabledelayedexpansion

set face[0]=2
set face[1]=3
set face[2]=4
set face[3]=5
set face[4]=6
set face[5]=7
set face[6]=8
set face[7]=9
set face[8]=10
set face[9]=J
set face[10]=Q
set face[11]=K
set face[12]=A

set /a value[0]=2
set /a value[1]=3
set /a value[2]=4
set /a value[3]=5 
set /a value[4]=6
set /a value[5]=7
set /a value[6]=8
set /a value[7]=9
set /a value[8]=10
set /a value[9]=10 
set /a value[10]=10
set /a value[11]=10
set /a value[12]=11

set flower[0]=
set flower[1]=
set flower[2]=
set flower[3]=

for /l %%i in (0,1,3) do (
REM	echo !flower[%%i]!
)

REM ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
:restart
set /a poker=52
set /a turn=0
set /a playerTurn=10
set /a flag=0
set /a cash=1000
set /a beton=0
set /a stack=0
set /a insureFlag=0
set /a butFlag=0

for /l %%i in (0,1,20) do (
	set /a deck[%%i]=0
)

for /l %%i in (0,1,10) do (
	set /a A1poker[%%i]=0
)

for /l %%i in (0,1,10) do (
	set /a B1poker[%%i]=0
)

set /a cardNum=0
set /a playACardn=0
set /a playBCardn=0
set /a playAValue=0
set /a playBValue=0
set /a AAnum=0
set /a BAnum=0
set playACard=" "
set playBCard=" "
set playAflower=" "
set playBflower=" "

REM ====================================================================
:loop
echo **************************************************************
echo *                    Game for BlackJack                      *
echo *                         Good Luck^^!                         *
echo **************************************************************
REM ---BetOn------------------------------------------------------------
if !turn! EQU 0 if !playerTurn! EQU 10 (
echo 游戏前押注
echo -------------------------------
set "line=剩余筹码:"
set "line=!line!!cash!	"
set /a beton=50
echo !line!<nul
echo -------------------------------
echo 请选择本局投注金额
echo  a. 50
echo  b. 100
echo  c. 150
echo  d. 200
echo -------------------------------
set /p str="请在a-d中进行选择..."
if !str! EQU a ( set /a beton=50 )
if !str! EQU A ( set /a beton=50 )
if !str! EQU b ( set /a beton=100 )
if !str! EQU B ( set /a beton=100 )
if !str! EQU c ( set /a beton=150 )
if !str! EQU C ( set /a beton=150 )
if !str! EQU d ( set /a beton=200 )
if !str! EQU D ( set /a beton=200 )
if !beton! GTR !cash! ( set /a beton=!cash! )
set /a cash=!cash!-!beton!
if !beton! GTR 0 ( set /a playerTurn=1 )
cls 
goto :loop
)
点击这里复制本文地址 以上内容由文彬编程网整理呈现,请务必在转载分享时注明本文地址!如对内容有疑问,请联系我们,谢谢!
qrcode

文彬编程网 © All Rights Reserved.  蜀ICP备2024111239号-4