python模拟简单的扑克牌游戏

这个代码实现的是J来家游戏,规则是这样的:

两个玩家随机平分一副扑克牌中的纸牌,然后从最上面出牌,名牌摆出,如果玩家出的牌是J,则将已经落地的名牌全部收归自己,放到自己牌的最下方,再出一张牌;如果出的牌在摆出的牌中存在了,则将刚出的牌和相同的牌之间的所有扑克牌归为自己;如果出的牌不满足上述两种条件,则对方出牌,规则同上。

这里的规则其实很简单,要注意的一点就是需要使用递归编程,因为玩家出牌不是一人只出一手牌,而是当你出了J或者底牌中存在的扑克牌时候,在收回底落地的名牌之后,需要再次出一张牌。代码如下所示:

import random
import time

def cards_init():
    source_cards = [ ['3',4],['4',4],['5',4],['6',4],['7',4],['8',4],['9',4],['10',4],['J',4],['Q',4],['K',4],['A',4],['2',4]] #除去大小王的扑克牌
    player_1 = []   #抓牌前玩家palyer_1手牌
    player_2 = []   #抓牌前玩家palyer_2手牌
    indexs = [ i for i in range(52) ]   #对52张牌进行索引
    index_player_1 = []  #玩家palyer_1手牌索引
    index_player_2 = []  #玩家palyer_1手牌索引
    for i in range(26):
        index = random.choice(indexs)   #为玩家player_1随机分配扑克牌
        index_player_1.append( index )  #为玩家player_1随机分配扑克牌
        indexs.remove(index)            #牌已经被抓走,则在底牌中删除这张牌

        index = random.choice(indexs)
        index_player_2.append(index)
        indexs.remove(index)

    for i in index_player_1:   #将分配到的牌放到手里
        player_1.append( source_cards[ i//4 ][0] )

    for i in index_player_2:
        player_2.append( source_cards[ i//4 ][0] )

    return player_1, player_2

player_1, player_2 = cards_init()  #游戏的初始化
print(player_1)
print(player_2)
lover = input('希望谁为获胜者?player1 or player2 or impartial: ')    #加了一个玩赖的设置
if lover=='player1':
    while 'J' in player_2:
        player_2.remove('J')

if lover=='player2':
    while 'J' in player_1:
        player_1.remove('J')
print(player_1)
print(player_2)

land_cards = []    #打出的扑克牌
is_end = False     #游戏是否结束的标志




'''
push_card(players)是游戏的逻辑设置,使用了递归。如果玩家的底牌数量为零,则游戏结束;如果出的牌在底牌中不存在并且不是J,则下一个玩家出牌;如果出的牌在底牌中存在,
则将出的牌和相同的牌之间的所有牌归为自己,再重新出牌;如果出的牌为J,则将所有的底牌都归为自己。
'''
def push_card(players):
    if len(players)<5:  #检测玩家是否还有底牌
        print('game over')
        is_end=True      #将游戏的结束标志设置为True
        return -1

    temp_card = players[0]    #获得玩家的出牌信息

    if temp_card not in land_cards and temp_card != 'J':    #出的牌再底牌中不存在,并且不是J
        print('玩家手牌为:', players)
        print('底牌为:', land_cards)
        print('出牌为:', temp_card)
        print('不能收牌')
        print()
        time.sleep(1)
        land_cards.append(temp_card)    #将玩家的出牌追加到底牌的末尾
        del players[0]    #在玩家手牌中删除已经出过的牌
        return -2
    elif temp_card in land_cards:    #出的牌在底牌中存在
        print('玩家手牌为:', players)
        print('底牌为:', land_cards)
        print('出牌为:', temp_card)
        print('收牌')
        time.sleep(1)
        cut = land_cards[land_cards.index(temp_card):]    #截取底牌中与玩家出牌相同的纸牌之间的所有纸牌
        for i in range( land_cards.index(temp_card), len(land_cards) ):    #将截取后的牌在底牌中删除
            del land_cards[-1]
        players.extend(cut)    #将截取到的纸牌追加到玩家手牌的末尾
        players.append(temp_card)  #将玩家打出的纸牌收归到末尾
        del players[0]    #删除刚刚出手的纸牌
        print('收牌后为:',players)
        print()
        push_card(players)    #递归调用
    elif temp_card=='J':    #如果玩家的出牌为J
        print('玩家手牌为:', players)
        print('J来家')
        print('底牌为:', land_cards)
        print('出牌为:', temp_card)
        time.sleep(1)
        players.extend(land_cards)    #将所有底牌收回来
        players.append(temp_card)
        for i in range(len(land_cards)):    #将底牌列表中的所有牌删除
            del land_cards[-1]
        del players[0]
        print('收牌后为:', players)
        print()
        push_card(players)

while not is_end:    #游戏循环
    push_card(player_1)
    push_card(player_2)

这个代码也可以到github上下载,地址为:https://github.com/t20134297/simple-poker-game

在最开始编写代码的时候本想做一个可视化的过程,可是后来太懒了,再加上作可视化,需要解决一下Python当中那个伪线程的问题,就没有实现它,不过可以fork我的代码,备不住哪天心血来潮了就补充一下这个内容。

  • 2
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 你好,我可以回答这个问题。要用 Python 编写扑克牌游戏,可以使用面向对象编程的思想,将扑克牌、玩家、游戏等对象进行抽象和封装。可以使用 random 模块来随机洗牌和发牌,使用条件语句和循环语句来实现游戏规则和判断胜负。具体实现可以参考相关的教程和代码示例。 ### 回答2: 扑克牌游戏是一种经典的纸牌游戏,现在我们可以用Python来实现一个简单扑克牌游戏程序。 首先,我们需要一个扑克牌的类来表示每一张牌。每张扑克牌有一个花色(黑桃、红桃、梅花、方块)和一个点数(A、2、3、4、5、6、7、8、9、10、J、Q、K)。 然后,我们需要一个扑克牌的集合,称之为牌堆。牌堆可以由一个列表来表示,其中每个元素都是一个扑克牌对象。我们可以使用循环来创建这个牌堆,依次将每种花色和点数的扑克牌添加到列表中。 接下来,我们需要一个函数来洗牌。我们可以使用random模块中的shuffle函数来实现这一步。只需要将牌堆列表作为shuffle函数的参数,就可以随机打乱牌堆中的扑克牌顺序。 然后,我们需要两个玩家,可以用两个列表来表示。开始游戏时,每个玩家从牌堆中抽取一定数量的扑克牌作为初始手牌。 接着,我们需要一个比较函数来判断两张牌之间的大小关系。根据扑克牌的点数大小进行比较,依次比较两张牌的点数大小,如果点数相同,则比较花色大小。 最后,我们需要一个主循环来进行游戏,直到有玩家的手牌为零或者牌堆中没有剩余的牌。每一轮游戏,两位玩家各自出一张牌进行比较,点数大的一方获得对方出的牌,并将这两张牌放入自己的手牌末尾。重复进行直到游戏结束。 以上是一个简单扑克牌游戏Python实现。当然,这只是一个最基础的实现,你可以根据自己的需求自由添加更多的规则和功能。 ### 回答3: 扑克牌游戏是一种非常经典的游戏,我们可以用Python来编写一个简单的版本。 首先,我们将创建一个包含52张扑克牌的牌组。每张牌都有花色和点数属性。我们可以使用字典或者类来表示每张扑克牌。然后,我们可以将所有的扑克牌放入一个列表中,表示为一个牌组。 接下来,我们需要编写一些功能来模拟游戏过程。我们可以定义一个函数来洗牌,即随机打乱牌组中的牌的顺序。然后,我们可以定义一个函数来发牌,将牌从牌组中分发给玩家和庄家。玩家和庄家可以根据自己的需求选择是否继续要牌,直到他们满意为止。我们可以定义一个函数来计算玩家和庄家的点数,然后比较点数大小来确定游戏结果。 最后,我们可以编写一个主函数来驱动整个游戏的流程。在主函数中,我们可以调用上述功能函数,让玩家和庄家交替进行游戏,直到游戏结束为止。在每一轮游戏结束后,我们可以询问玩家是否继续进行下一轮游戏。 总结起来,用Python编写一个扑克牌游戏主要涉及到创建牌组、洗牌、发牌、计算点数和判断结果等功能函数的编写,以及主函数的编写来驱动整个游戏的流程。这样,我们就可以使用Python模拟一个简单扑克牌游戏了。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值