摄影:产品经理
腰花
最近一段时间,我感觉自己大脑出现了衰退的症状,说话口误逐渐增多,也常常忘记事情。
前两天在 B 站上看到一个两人玩的小游戏,叫做“珠玑棋”[1],发现这对锻炼大脑有一些好处。本来想跟产品经理一起玩玩,但产品经理不屑于玩这种游戏。所以我决定用 Python 写一个简单的程序来自己玩。
珠玑棋的规则非常简单。它分为两方:攻击方和防守方。具体流程如下:
在这个游戏规则里面,防守方的作用仅仅是检查结果而已,并没有攻防对抗,所以我们可以用程序来代替防守方。
首先我们来生成防守方的4位数字。由于4位数字不相等,所以我们使用 Python 的随机数来生成:
import random
data = [str(x) for x in range(10)]
random.shuffle(data) # shuffle 会直接修改列表本身,所以不用赋值
if data[0] == '0': # 如果首尾为0,那么取后四位
answer = data[-4:]
else: # 首尾不为0,取前4位
answer = data[:4]
由于要检查的数据通过 input 输入,所以为了保持类型一致,我们都使用字符串来表示。
运行效果如下图所示:
接下来,让玩家连续进行10次尝试,每次输入一个4位数:
for i in range(1, 11):
while True:
guess = input(f'进行第{i}次尝试,请输入一个4位数:')
if len(guess) == 4:
break
print('请输入4位数。')
运行效果如下图所示:
接下来,首先检查位置和数字都正常的情况:
def match_num_and_position(guess, answer):
A = 0
for guess_num, answer_num in zip(guess, answer): # 逐位检查攻击方和防守方的答案数字
if guess_num == answer_num:
A += 1
else:
guess_left_num.append(guess_num)
answer_left_num.append(answer_num)
return guess_left_num, answer_left_num
这里,使用zip
来同时迭代guess
和answer
,从而实现逐位一一对应检查。
接下来,我们来寻找数字对,但位置不对的情况:
def match_num(guess, answer):
B = 0
for num in guess:
if num in answer:
B += 1
answer.remove(num) # .remove 是一个原地操作,不需要赋值
return B
这个代码就比较简单了。把guess
剩下的数字一个一个到答案剩下的数字里面去查询,如果找到了,B 就加1.然后从答案里面删除这个数字。接着查找 guess 的下一个数字。
完整的代码如下图所示:
如果10次猜测都失败了,运行效果如下图所示:
如果才对了,运行效果如下图所示:
计算过程如下图所示:
至此,珠玑棋的命令行版本就完成了。希望这个小游戏能帮助大家锻炼一下大脑。
如果大家对这个游戏有兴趣的话,我们可以继续出几篇文章,把它转变成一个网页,这样可玩性会高不少。
[1]
“珠玑棋”: https://www.bilibili.com/video/BV1Zg411j7PM?from=search&seid=12099065957511854031