拼搏

拼搏

打扑克嘛?Python教你“经典纸牌游戏21点”玩法

admin
打扑克嘛?Python教你“经典纸牌游戏21点”玩法-第1张-游戏相关-拼搏

导语


​昨天不是周天嘛?


你们在家放松一般都会做什么呢?


周末逛逛街,出去走走看电影......这是你们的周末。


程序员的周末就是在家躺尸唐诗躺尸,偶尔加班加班加班,或者跟着几个朋友在家消遣时间打打麻将,扑克牌玩一下!


尤其是放长假【ps:也没啥假,长假就是过年】在老家的时候,亲戚尤其多,七大姑八大姨的一年好不容易聚一次,打打麻将跟扑克这是常有的事儿,联络下感情这是最快的方式~

​​说起打扑克,我们经常就是玩儿的二百四、炸金花、三个打一个那就是叫啥名字来着,容我想想......


​话说真词穷,我们那都是方言撒,我翻译不过来普通话是叫什么了,我估计240你们也没听懂是啥,23333~


今天的话小编是带大家做一款21点的扑克游戏!


有大佬可优化一下这个代码,做一个精致豪华的界面就好了~~



正文


游戏规则:21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。当使用1副牌时,以下每种牌各一张(没有大小王):



(1)初始化玩家数:


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">def iniGame():    global playerCount, cards    while(True):        try:            playerCount = int(input('输入玩家数:'))        except ValueError:            print('无效输入!')            continue        if playerCount < 2:            print('玩家必须大于1!')            continue        else:            break    try:        decks = int(input('输入牌副数:(默认等于玩家数)'))    except ValueError:        print('已使用默认值!')        decks = playerCount    print('玩家数:', playerCount, ',牌副数:', decks)    cards = getCards(decks)  # 洗牌</span></span></span>

(2)建立了玩家列表,电脑跟玩家对战。


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">def createPlayerList():    global playerList    playerList = []    for i in range(playerCount):        playerList += [{'id': '', 'cards': [], 'score': 0}].copy()        playerList[i]['id'] = '电脑' + str(i+1)    playerList[playerCount-1]['id'] = '玩家'    random.shuffle(playerList)  # 为各玩家随机排序</span></span></span>

(3)开始会设置2张明牌玩法都可以看到点数。


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">def gameStart():    print('为各玩家分2张明牌:')    for i in range(playerCount):  # 为每个玩家分2张明牌        deal(playerList[i]['cards'], cards, 2)        playerList[i]['score'] = getScore(playerList[i]['cards'])  # 计算初始得分        print(playerList[i]['id'], ' ', getCardName(playerList[i]['cards']),              ' 得分 ', playerList[i]['score'])        time.sleep(1.5)</span></span></span>


(4)游戏为电脑跟玩家依次分发第三张暗牌,这是别人看不到的。


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">def gamePlay():    for i in range(playerCount):        print('当前', playerList[i]['id'])        if playerList[i]['id'] == '玩家':  # 玩家            while(True):                print('当前手牌:', getCardName(playerList[i]['cards']))                _isDeal = input('是否要牌?(y/n)')                if _isDeal == 'y':                    deal(playerList[i]['cards'], cards)                    print('新牌:', getCardName(playerList[i]['cards'][-1]))                    # 重新计算得分:                    playerList[i]['score'] = getScore(playerList[i]['cards'])                elif _isDeal == 'n':                    break                else:                    print('请重新输入!')        else:  # 电脑            while(True):                if isDeal(playerList[i]['score']) == 1:  # 为电脑玩家判断是否要牌                    deal(playerList[i]['cards'], cards)                    print('要牌。')                    # 重新计算得分:                    playerList[i]['score'] = getScore(playerList[i]['cards'])                else:                    print('不要了。')                    break        time.sleep(1.5)</span></span></span>

(5)随机洗牌:


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">def getCards(decksNum):    cardsList = ['Aa', 'Ab', 'Ac', 'Ad',                 'Ka', 'Kb', 'Kc', 'Kd',                 'Qa', 'Qb', 'Qc', 'Qd',                 'Ja', 'Jb', 'Jc', 'Jd',                 '0a', '0b', '0c', '0d',                 '9a', '9b', '9c', '9d',                 '8a', '8b', '8c', '8d',                 '7a', '7b', '7c', '7d',                 '6a', '6b', '6c', '6d',                 '5a', '5b', '5c', '5d',                 '4a', '4b', '4c', '4d',                 '3a', '3b', '3c', '3d',                 '2a', '2b', '2c', '2d']    cardsList *= decksNum       # 牌副数    random.shuffle(cardsList)   # 随机洗牌    return cardsList</span></span></span>

(6)设置牌名字典:


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">cardNameDict = {'Aa': '黑桃A', 'Ab': '红桃A', 'Ac': '梅花A', 'Ad': '方片A',                'Ka': '黑桃K', 'Kb': '红桃K', 'Kc': '梅花K', 'Kd': '方片K',                'Qa': '黑桃Q', 'Qb': '红桃Q', 'Qc': '梅花Q', 'Qd': '方片Q',                'Ja': '黑桃J', 'Jb': '红桃J', 'Jc': '梅花J', 'Jd': '方片J',                '0a': '黑桃10', '0b': '红桃10', '0c': '梅花10', '0d': '方片10',                '9a': '黑桃9', '9b': '红桃9', '9c': '梅花9', '9d': '方片9',                '8a': '黑桃8', '8b': '红桃8', '8c': '梅花8', '8d': '方片8',                '7a': '黑桃7', '7b': '红桃7', '7c': '梅花7', '7d': '方片7',                '6a': '黑桃6', '6b': '红桃6', '6c': '梅花6', '6d': '方片6',                '5a': '黑桃5', '5b': '红桃5', '5c': '梅花5', '5d': '方片5',                '4a': '黑桃4', '4b': '红桃4', '4c': '梅花4', '4d': '方片4',                '3a': '黑桃3', '3b': '红桃3', '3c': '梅花3', '3d': '方片3',                '2a': '黑桃2', '2b': '红桃2', '2c': '梅花2', '2d': '方片2'}</span></span></span>

(7)判断胜负:


<span style="color:#333333"><span style="background-color:#ffffff"><span style="background-color:#f8f8f8">def showWinAndLose():    loserList = []  # [['id', score], ['id', score], ...]    winnerList = []  # [['id', score], ['id', score], ...]    winnerCount = 0    loserCount = 0    for i in range(playerCount):        if playerList[i]['score'] > 21:  # 爆牌直接进入败者列表            loserList.append([playerList[i]['id'],  playerList[i]['score']])        else:  # 临时胜者列表            winnerList.append([playerList[i]['id'], playerList[i]['score']])    if len(winnerList) == 0:  # 极端情况:全部爆牌        print('全部玩家爆牌:')        for i in range(len(loserList)):            print(loserList[i][0], loserList[i][1])    elif len(loserList) == 0:  # 特殊情况:无人爆牌        winnerList.sort(key=lambda x: x[1], reverse=True)  # 根据分数值排序胜者列表        for i in range(len(winnerList)):  # 计算最低分玩家数量            if i != len(winnerList)-1:                if winnerList[-i-1][1] == winnerList[-i-2][1]:                    loserCount = (i+2)                else:                    if loserCount == 0:                        loserCount = 1                    break            else:                loserCount = len(loserList)        if loserCount == 1:            loserList.append(winnerList.pop())        else:            while(len(loserList) != loserCount):                loserList.append(winnerList.pop())        for i in range(len(winnerList)):  # 计算最高分玩家数量            if i != len(winnerList)-1:                if winnerList[i][1] == winnerList[i+1][1]:                    winnerCount = (i+2)                else:                    if winnerCount == 0:                        winnerCount = 1                    break            else:                winnerCount = len(winnerList)        while(len(winnerList) != winnerCount):            winnerList.pop()        print('获胜:')        for i in range(len(winnerList)):            print(winnerList[i][0], winnerList[i][1])        print('失败:')        for i in range(len(loserList)):            print(loserList[i][0], loserList[i][1])    else:  # 一般情况:有人爆牌        winnerList.sort(key=lambda x: x[1], reverse=True)  # 根据分数值排序胜者列表        for i in range(len(winnerList)):  # 计算最高分玩家数量            if i != len(winnerList)-1:                if winnerList[i][1] == winnerList[i+1][1]:                    winnerCount = (i+2)                else:                    if winnerCount == 0:                        winnerCount = 1                    break            else:                winnerCount = len(winnerList)        while(len(winnerList) != winnerCount):            winnerList.pop()        print('获胜:')        for i in range(len(winnerList)):            print(winnerList[i][0], winnerList[i][1])        print('失败:')        for i in range(len(loserList)):            print(loserList[i][0], loserList[i][1])</span></span></span>

游戏效果:咳咳咳.......感觉这游戏看运气也看胆量!!



​总结​


哈哈哈!小编玩游戏比较废,你们要来试试嘛?无聊的时候可以摸摸鱼,打打酱油~


制作不易,记得一键三连哦!! 如果需要本文完整的代码+图片素材。


Python新手安装包、免费激活码、等等更多Python资料 【私信小编06】即可免费领取哦!!

标签 lolvsdota2playercount