游戏规则
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里的引用是啥,怎么实现的呀?
所以,一个类的方法,可以改变另一个类的状态么?怎么实现的呀?
查了一些资料后,嘿嘿,用类变量就行了啦!
第二次更改 算法错误的代码
这次把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)
能玩,但是不能对所有的数据进行玩耍,呜呜呜。