当前位置: 高中信息技术 / 综合题
  • 1. (2022·浙江模拟) 小林在玩一种纸牌游戏——纸牌钓鱼。他对牌做了如下处理:

    1)取两副纸牌去除大小王,共104张,其中▲表示黑桃,○表示红心,★表示梅花,◇表示方块,将牌按顺序叠好,成为原始牌叠;

    2)对原始牌叠洗牌:进行104次洗牌,每次将面上的第一张牌随机插在牌叠中,成为洗牌牌叠;

    3)摸牌:从洗牌牌叠中从上向下连续摸牌,使得摸到的牌里没有重复的牌(同花色、同点数视为重复的牌),这样连接的牌数量最多时即为最长无重复牌叠。

    现设计Python程序模拟这个游戏:先显示原始牌叠,洗牌后再显示洗牌牌叠,摸牌后显示最长无重复牌叠张数、起点及终点,并显示最长无重复牌叠的信息。运行结果如第所示。

    1. (1) 实现上述功能的Python程序如下,请在划线处填入合适的代码。

      from random import randint

      def dayin(head,tail):               #打印牌叠

          pt=head; k=0

          while :

              print(str(pai[pt][0])+'-'+str(pai[pt][1]),end='||')

              pt=pai[pt][1]; k=k+1

              if k==13: print(); k=0

          print('\n','*'*105)

      dic={0:'▲',1:'○',2:'★',3:'◇',4:'A',5:'2',6:'3',7:'4',8:'5',9:'6',10:'7',11:'8',12:'9',13:'10',14:'J',15:'Q',16:'K'}

      pai=[]; head=- 1; k=0

      while k<104:

          pai.append([ ,head])

          head=len(pai)- 1; k=k+1

      print('原始的牌叠')

      dayin(head,- 1)        #打印原始牌叠

      k=0

      while k<=103:

          x=randint(0,103)

          i=0;pt=head

          while i<x:

              pt=pai[pt][1]

              i+=1

          if pt!=head:

              nhead=pai[head][1]

             

              pai[pt][1]=head

              head=nhead

          k+=1

      print('洗牌后的牌叠')

      dayin(head,- 1)        #打印洗牌牌堆

      f={}

      for i in range(4):

          for j in range(4,17):

              f[dic[i]+dic[j]]=False

      L=ans=0; i=j=head

      while j!=- 1:

          m=pai[j][0]

          if not f[m]:

              f[m]=True; L=L+1

              if L>ans: ans=L; pt=j; qt=i

                  j=pai[j][1]

              else:

                  while  :

                      f[pai[i][0]]=False

                      L=L- 1

                      i=pai[i][1]

      print('最长无重复牌叠%d 张'%ans,'起点',qt,'终点',pt)

      dayin(  )

    2. (2) 程序最后的加框处代码有错,请改正。

微信扫码预览、分享更方便