python- 小猫钓鱼纸牌游戏

游戏规则

1. 一副扑克平均分成两份,每人拿一份。并且都不看牌面,背面朝上放置成一叠。

2. 每个人每次出最上面的那张牌。

        2.1 如果有和桌面上的牌大小一样的,就把两张相同的牌和中间夹的牌全部取走,并依次放到自己手中牌的末尾。

        2.2 如果没有和自己的牌大小一样的,则下个人出牌。

3. 当任意一个人的牌出完时,游戏结束,手中有牌的获胜。

思路

1. 要用书上的测试例子,所以这里假设每个人只拿六张牌。

2. 输出:打牌过程,谁赢了,赢家手里的牌,桌上的牌。

3. 玩家手里的牌数,是队列(queue),从前往后对应牌的从上到下。出牌(play)是出queue[0],赢牌(win)是添加一叠牌到末尾。所以,class player对应的方法有,play()、win()。

4. 桌面上的牌,对应着栈(stack),从前往后对应牌的从上到下。玩家出牌对应的是stack的末尾添加了一张牌。应该对这张牌进行判断是否有相同数值存在于stack中,如果有则把中间的移除;如果没有则添加进stack。所以,stack对应的方法有isExist()。

5. 把移除的牌添加到刚刚的玩家queue里,对应win操作。

6. 判断谁赢了,输出各种结果。

代码

第一次尝试,错误代码

class player():
    def __init__(self,queue):
        if len(queue)!=6 :
            raise Exception("wrong cards numbers")
        else:
            self.queue=queue
        self.initCards=[] # 桌面上的牌

    # 出牌
    def play(self):
        self.card=self.queue[0]
        self.queue=self.queue[1:]
        return self.card
    
    # 玩家出牌后的结果
    def win(self):
        # 如果打出的牌在桌上不存在
        if not self.isExist(self.card):
            # 桌子上多一张牌
            self.initCards.append(self.card)
        # 如果打出的牌在桌上存在,就把桌子上的牌赢回来
        else:
            # 找相同的牌的位置i
            for i in range(len(self.initCards)):
                if self.initCards[i]==self.card:
                    return i
            # 移除桌上的牌
            outCards=self.initCards[i:]+self.card
            self.initCards=self.initCards[:i]
            # 把牌添加到自己这里
            self.queue.append(outCards)
        return self.queue

    # 判断卡片是否存在桌子上
    def isExist(self,card):
        return card in self.initCards
    

# 创建两个玩家
player1=player([2,4,1,2,5,6])
player2=player([3,1,3,5,6,4])

# 操作。假设起始是player1先出牌
while player1.queue and player2.queue:
    if player1.queue:
        player1.play()
        print("player1",player1.win(),player1.initCards)
    if player2.queue:
        player2.play()
        print("player2",player2.win(),player2.initCards)

分析错误:initCards被player2重建了。啊,去求助!

我:我有一个类,我创建了两个实例,想要这两个实例改变同一个list。可我的类方法要用到这个list。我该,怎么改?

雷雷:要引用,不要复制。或者,简单一点,你就写个类,把list放在这个类里。

所以,python里的引用是啥,怎么实现的呀?

所以,一个类的方法,可以改变另一个类的状态么?怎么实现的呀?

查了一些资料后,嘿嘿,用类变量就行了啦!

Python 实例方法、类方法和静态方法_Leo的博客-CSDN博客_python实例方法

第二次更改 算法错误的代码

这次把initCards改为类变量了。就可以每次都更改[]啦,而不是每次都在重新创建新的实例对象属性。

class player():
    # 类变量
    initCards=[] # 桌面上的牌

    def __init__(self,queue):
        if len(queue)!=6 :
            raise Exception("wrong cards numbers")
        else:
            self.queue=queue
        

    # 出牌
    def play(self):
        self.card=self.queue[0]
        self.queue=self.queue[1:]
        return self.card
    
    # 玩家出牌后的结果
    def win(self):
        # 如果打出的牌在桌上不存在
        if not self.isExist(self.card):
            # 桌子上多一张牌
            player.initCards.append(self.card)
        # 如果打出的牌在桌上存在,就把桌子上的牌赢回来
        else:
            # 找相同的牌的位置i
            for i in range(len(player.initCards)):
                if player.initCards[i]==self.card:
                    return i
            # 移除桌上的牌
            outCards=player.initCards[i:]+self.card
            player.initCards=player.initCards[:i]
            # 把牌添加到自己这里
            self.queue.append(outCards)
        return self.queue

    # 判断卡片是否存在桌子上

    def isExist(self,card):
        return card in player.initCards
    

# 创建两个玩家
player1=player([2,4,1,2,5,6])
player2=player([3,1,3,5,6,4])

# 操作。假设起始是player1先出牌
while player1.queue and player2.queue:
    if player1.queue:
        player1.play()
        print("player1",player1.win(),player1.initCards)
    if player2.queue:
        player2.play()
        print("player2",player2.win(),player2.initCards)

# 输出,是错误的啦!
player1 [4, 1, 2, 5, 6] [2]
player2 [1, 3, 5, 6, 4] [2, 3]
player1 [1, 2, 5, 6] [2, 3, 4]
player2 [3, 5, 6, 4] [2, 3, 4, 1]
player1 3 [2, 3, 4, 1]  # 错误,没有把相同的牌添加到玩家身上,而且把桌上的牌减掉
player2 1 [2, 3, 4, 1]
player1 0 [2, 3, 4, 1] # 都0了,怎么还在运行。
player2 [6, 4] [2, 3, 4, 1, 5]
player1 4 [2, 3, 4, 1, 5]
player2 [4] [2, 3, 4, 1, 5, 6]
player1 5 [2, 3, 4, 1, 5, 6]
player2 2 [2, 3, 4, 1, 5, 6]

看看逻辑,哪里出了问题?

错误1:直接就return了耶,不会执行后面的啦。所以要把return i 删掉,换成要执行的步骤!

错误2:这个可以一直玩下去耶!我觉得代码没有什么问题!但是是真的可以一直赢牌活下去。所以针对这种情况,到达一定数量后强制退出?(之后再填坑)

第三次改 可以对某些数据进行play了

class player():
    # 类变量
    initCards=[] # 桌面上的牌

    def __init__(self,queue):
        if len(queue)!=6 :
            raise Exception("wrong cards numbers")
        else:
            self.queue=queue
        

    # 出牌
    def play(self):
        self.card=self.queue[0]
        self.queue=self.queue[1:]
        return self.card
    
    # 玩家出牌后的结果
    def win(self):
        # 如果打出的牌在桌上不存在
        if not self.isExist(self.card):
            # 桌子上多一张牌
            player.initCards.append(self.card)
        # 如果打出的牌在桌上存在,就把桌子上的牌赢回来
        else:
            # 找相同的牌的位置i
            for i in range(len(player.initCards)):
                outCards=[]
                if player.initCards[i]==self.card:
                    outCards=player.initCards[i:]
                    player.initCards=player.initCards[:i]
                    break
            outCards.append(self.card)
            self.queue=self.queue+outCards
        return self.queue

    # 判断卡片是否存在桌子上

    def isExist(self,card):
        return card in player.initCards
    

# 创建两个玩家
player1=player([2,4,1,2,5,6])
player2=player([3,1,3,5,6,4])

# 操作。假设起始是player1先出牌
while player1.queue and player2.queue:
    if player1.queue:
        player1.play()
        print("player1",player1.win(),player1.initCards)
    if player2.queue:
        player2.play()
        print("player2",player2.win(),player2.initCards)

能玩,但是不能对所有的数据进行玩耍,呜呜呜。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值