鱼C论坛

 找回密码
 立即注册
查看: 321|回复: 1

[技术交流] 模拟刘谦表演的魔术

[复制链接]
发表于 2024-2-10 13:31:49 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x


昨天刘谦表演的魔术很精彩,然后我就想着写一段代码模拟一下
结果被不二如是抢先了
我也不好意思说什么了,实力还差得远,就发自己写的分享一下
  1. import random

  2. #模拟从一副牌中挑四张牌
  3. cards = list(range(54))
  4. choices = random.sample(cards,4) #挑出来的4张牌



  5. #将选中的牌由序号转换为名称   
  6. cardnames = []
  7. hs = {0:'梅花',1:'方块',2:'黑桃',3:'红桃'}
  8. ds = {0:'A',1:'2',2:'3',3:'4',4:'5',5:'6',6:'7',\
  9.       7:'8',8:'9',9:'10',10:'J',11:'Q',12:'K'}

  10. for i in choices:
  11.     if i < 52:
  12.         cardnames.append(hs[i//13]+ds[i%13])
  13.     elif i == 52:
  14.         cardnames.append('小王')
  15.     else:
  16.         cardnames.append('大王')

  17. choices = cardnames
  18. print('[发牌结束]\t你现在的手牌是',*choices)



  19. choices.extend([i + '<2>' for i in choices]) #模拟撕碎扑克牌
  20. name = input('请输入你的名字')
  21. for i in name:
  22.     choices.append(choices.pop(0)) #将扑克牌从顶部移至底部
  23. print('[按名字移动牌]\t你现在的手牌是',*choices) #定期跟踪扑克牌的情况
  24. input('回车继续')



  25. def removecard(choices,x):
  26.     removecards = choices[:x] #拿起前x张
  27.     choices[:x] = []
  28.     place = random.randint(1,len(choices)-1)
  29.     choices[place:place] += removecards #插进空隙中

  30. removecard(choices,3)
  31. print('[移动前三张]\t你现在的手牌是',*choices)



  32. specific = choices.pop(0) #取走第一张,藏起来
  33. input('[取走第一张]\t回车继续')
  34. location = input('请输入你的地域[南方/北方/其他]')
  35. #南北方移牌
  36. if location == '南方':
  37.     removecard(choices,1)
  38. elif location == '北方':
  39.     removecard(choices,2)
  40. else:
  41.     removecard(choices,3)
  42. print('[按南北方移牌]\t你现在的手牌是',*choices)



  43. xingbie = input('请输入你的性别[男/女]')
  44. #性别扔牌
  45. if xingbie == '男':
  46.     choices.pop(0)
  47. else:
  48.     choices.pop(0)
  49.     choices.pop(0)
  50. print('[按性别扔牌]\t你现在的手牌是',*choices)
  51. input('回车继续')



  52. for i in '见证奇迹的时刻':
  53.     choices.append(choices.pop(0)) #将扑克牌从顶部移至底部
  54. print('[见证奇迹的时刻]\t你现在的手牌是',*choices)
  55. input('回车继续')



  56. flag = False
  57. while len(choices) > 1:
  58.     if flag:
  59.         choices.pop(0)
  60.     else:
  61.         choices.append(choices.pop(0))
  62.     flag = not flag
  63.     print('[好运留下,烦恼扔走]\t你现在的手牌是',*choices)
  64.     input('回车继续')



  65. if '尼格买提' in name:
  66.     print('Oh no!尼格买提的牌没有对起来') #彩蛋
  67. else:
  68.     print('你藏的牌',specific)
  69.     print('你现在的手牌是',*choices)
  70.     print('恭喜祈福成功!!!')
复制代码

如果发现了什么问题,欢迎批评指正
最后祝大家新年快乐,龙年大吉
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2024-2-10 13:32:02 | 显示全部楼层
你写的代码已经很不错啦!只是有几个小问题需要修正一下:

1. 在将选中的牌由序号转换为名称时,你可以使用字典的键值对来实现,类似于`cardnames.append(hs[i // 13] + ds[i % 13])`,其中`i // 13`可以得到花色,`i % 13`可以得到点数。

2. 在模拟撕碎扑克牌时,你漏掉了`choices[x:]`,这段代码应该是`choices = choices[x:]`。

3. 在移牌函数`removecard`中,你需要修改参数和函数内的操作,具体如下:
  1. def removecard(choices, x):
  2.     removecards = choices[:x]  # 拿起前x张
  3.     choices = choices[x:]
  4.     place = random.randint(1, len(choices) - 1)
  5.     choices = choices[:place] + removecards + choices[place:]  # 插进空隙中
  6.     return choices
复制代码


最后再给你一点建议,如果想增加点趣味性,可以考虑在输出结果时加上一些形容词,比如“神秘的”、“神奇的”等,使整个过程更加生动有趣。祝你也可以开展自己的魔术表演,祝大家新年快乐,龙年大吉!

以上回复来自 FishC AI 小助理,如未能正确解答您的问题,请继续追问。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-4-28 03:34

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表