Python算法设计 - 猜数字

文章介绍了BullsandCows游戏的规则,玩家需猜出一个四位数字。Python代码实现了生成随机数字、玩家猜测、计算bulls和cows的数量以及使用生成器优化内存效率。通过`sample`函数获取随机数,`permutations`得到全排列,`score`函数计算匹配度。
摘要由CSDN通过智能技术生成

一、游戏介绍

给出一个四位数字(X),游戏者猜一个结果(Y),将 X 和 Y 进行对比,提示有多少个数字和位置都正确的叫做 bulls,还提示有多少数字正确但位置不对的叫做 cows,根据这些信息来引导我们继续猜测正确的数字

例如:X:1234

       Y:3216

结果 bulls:1(个) cows:1(个),也写成1B1C,B 就是 bulls,C 就是 cows

二、目标

写一个算法,实现生成 X、生成猜测数字 Y、判断 X 是否和 Y 相同的过程

三、Python算法实现


from random import choice, sample
from itertools import permutations

def score(x, y):
    bulls = sum(i == j for i, j in zip(x, y))
    cows = len(set(x) & set(y)) - bulls
    return bulls, cows


def player1(player2):
    secret = sample(range(10), 4)

    tip = next(player2)
    while True:
        b, c = score(secret, tip)
        if b < 4:
            print(b, 'bulls', c, 'cows')
            tip = player2.send((b, c))
        else:
            print('猜中了!')
            break

def player2():
    tips = list(permutations(range(10), 4))

    while True:
        tip = choice(tips)
        print(tip, '?')
        bc = yield tip
        tips = [i for i in tips if score(i, tip) == bc]

player1(player2())

注意:

  • sample(数据范围,数据长度),该函数能够从指定的数据范围和指定的数据长度返回随机的数据
  • itertools.permutations()返回可迭代对象的所有数学全排列方
  • choice() 方法返回一个列表,元组或字符串的随机项
  • sample()和choice()是模块random中的函数,permutations()函数是itertools模块中的
  • 为了减少数据存储,利用yeild构建生成器,与next配合使用,数据用多少,读多少,不需要一次性将所有的数据读进来,yield是一个生成器,生成器中有函数next(),next可以接着上次yield运行的地方,继续运行下面的函数。它与return关键字都有返回函数值的功能

输出结果
在这里插入图片描述

数字炸弹是一种简单的游戏,通常用在编程练习或者面试中来考察对特定编程语言的掌握情况,以及对算法设计的理解。游戏的目标是找到一个数字,这个数字满足一系列的条件,这些条件通常是由游戏的“炸弹”(规则制定者)设置的。玩家需要根据炸弹给出的提示,通过编写程序来一步步缩小可能的数字范围,直到找到正确的数字。 在Python中,实现数字炸弹游戏的基本思路是这样的: 1. 游戏开始时,炸弹会生成一个随机的目标数字,这个数字可以是炸弹指定的任何范围内的整数。 2. 玩家编写程序,通过输入猜测的数字来询问炸弹这个数字是否正确,或者离目标数字有多近。 3. 炸弹根据玩家的输入给出反馈,反馈可能是: - 数字太高了 - 数字太低了 - 数字正确 - 数字太高,且距离正确数字有特定的距离 - 数字太低,且距离正确数字有特定的距离 玩家需要根据这些反馈信息调整猜测的范围,并继续猜测,直到找到正确的数字。 下面是一个简单的Python示例代码,实现了一个基本的数字炸弹游戏逻辑: ```python import random def generate_number(range_start, range_end): return random.randint(range_start, range_end) def give_hint(guess, target): if guess < target: return "低了" elif guess > target: return "高了" else: return "正确" # 游戏设置 range_start = 1 range_end = 100 target_number = generate_number(range_start, range_end) guess = None attempts = 0 print(f"数字炸弹启动!范围在 {range_start} 到 {range_end} 之间。") # 游戏主循环 while guess != target_number: guess = int(input("猜一个数字:")) attempts += 1 hint = give_hint(guess, target_number) print(hint) if hint == "正确": print(f"恭喜你!正确答案就是 {target_number}。你一共猜了 {attempts} 次。") break ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

炒青椒不放辣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值