社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

Python写个益智小游戏来锻炼大脑

Crossin的编程教室 • 3 年前 • 362 次点击  

大家好,欢迎来到 Crossin的编程教室 !

最近一段时间,我感觉自己大脑出现了衰退的症状,说话口误逐渐增多,也常常忘记事情。

前两天在 B 站上看到一个两人玩的小游戏,叫做 “珠玑棋” ,发现这对锻炼大脑有一些好处。无奈找不到人一起玩,于是我决定用 Python 写一个简单的程序来自己玩。

游戏规则

珠玑棋的规则非常简单。它分为两方:攻击方和防守方。具体流程如下:

  1. 防守方写一个4位数字,每位数字不能重复
  2. 攻击方有10次猜测的机会,在每次机会里面,攻击方可以说出一个4位数,让防守方检查。
  3. 定义两个字母 A 和 B
  4. 攻击方说出的4位数里面,每有任何一位或者多位的数字和位置都对,则 A+1。例如防守方的答案是1234,攻击方的答案是6274,那么就是2A
  5. 在第4步检查以后,如果攻击方剩下的数字里面,有一位或者多位数字,在防守方剩下的数字里面,但位置不对,则 B+1。例如防守方的数字是1234,攻击方的数字是4190,就是2B。
  6. 防守方给出 A 和 B 的值,攻击方根据这两个值修正自己的猜测数。如果10次内猜对了,那么攻击方胜利。如果超过10次都猜不对,则防守方胜利。
  7. 特别说明,在匹配数字的时候,首先检查数字和位置都对的情况。检查完成以后,再检查数字对位置不对的情况。并且这个时候,是攻击方的剩余数字从左至右依次到防守方的剩余数字中检查。每检查一个数字,就把这个数字从攻击方和防守方的数字里面同时剔除。所以对于防守方的数字1234,如果攻击方的数字为4437,那么检查结果应该是1A1B。因为一开始把数字3剔除了,攻击方剩余447,防守方剩余124.然后攻击方的第一个4和防守方的4匹配上了以后也会剔除。变成攻击方剩余47,防守方剩余12.此时防守方已经没有4了。

在这个游戏规则里面,防守方的作用仅仅是检查结果而已,并没有攻防对抗,所以我们可以用程序来代替防守方。

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(111):
    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来同时迭代guessanswer,从而实现逐位一一对应检查。

下面再来处理数字对,但位置不对的情况:

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次猜测都失败了,运行效果如下图所示:

如果才对了,运行效果如下图所示:

计算过程如下图所示:

至此,珠玑棋的命令行版本就完成了。希望这个小游戏能帮助大家锻炼一下大脑。

如果文章对你有帮助,欢迎转发/点赞/收藏~

作者:kingname
来源:未闻Code


_往期文章推荐_

用python写一个简单的贪吃蛇游戏




如需了解付费精品课程教学答疑服务
请在Crossin的编程教室内回复: 666

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/124444
 
362 次点击