Pygame实战练习之纸牌21点游戏
21点想必是很多人童年时期的经典游戏,我们依旧能记得抱个老人机娱乐的场景,下面这篇文章主要给大家介绍了关于如何利用python写一个简单的21点小游戏的相关资料,需要的朋友可以参考下
导语
昨天不是周天嘛?
你们在家放松一般都会做什么呢?
周末逛逛街,出去走走看电影......这是你们的周末。
程序员的周末就是在家躺尸唐诗躺尸,偶尔加班加班加班,或者跟着几个朋友在家消遣时间打打麻将,扑克牌玩一下!
尤其是放长假【ps:也没啥假,长假就是过年】在老家的时候,亲戚尤其多,七大姑八大姨的一年好不容易聚一次,打打麻将跟扑克这是常有的事儿,联络下感情这是最快的方式~
说起打扑克,我们经常就是玩儿的二百四、炸金花、三个打一个那就是叫啥名字来着,容我想想......
话说真词穷,我们那都是方言撒,我翻译不过来普通话是叫什么了,我估计240你们也没听懂是啥,23333~
今天的话小编是带大家做一款21点的扑克游戏!
有大佬可优化一下这个代码,做一个精致豪华的界面就好了~~
正文
游戏规则:21点又名黑杰克,该游戏由2到6个人玩,使用除大小王之外的52张牌,游戏者的目标是使手中的牌的点数之和不超过21点且尽量大。当使用1副牌时,以下每种牌各一张(没有大小王):
(1)初始化玩家数:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <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)建立了玩家列表,电脑跟玩家对战。
1 2 3 4 5 6 7 8 | <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张明牌玩法都可以看到点数。
1 2 3 4 5 6 7 8 | <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)游戏为电脑跟玩家依次分发第三张暗牌,这是别人看不到的。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | <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)随机洗牌:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | <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)设置牌名字典:
1 2 3 4 5 6 7 8 9 10 11 12 13 | <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)判断胜负:
1 2 3 4 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 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 | <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> |
游戏效果:咳咳咳.......感觉这游戏看运气也看胆量!!
总结
哈哈哈!小编玩游戏比较废,你们要来试试嘛?无聊的时候可以摸摸鱼,打打酱油~
到此这篇关于Pygame实战练习之纸牌21点游戏的文章就介绍到这了
原文链接:https://blog.csdn.net/weixin_55822277/article/details/120130644