数字棒球游戏是这样玩的:先由甲在心里想一个4位数,比如3092,不足4位的以0补足,比如12被认为是0012,这个数被称为目标。乙来猜这个数,方法是这样的,他先随机对甲说一个数,比如5382,甲告诉乙5382里有几个ball几个strike。所谓ball是指5382中有几个数出现在目标中,因为数字3和2都出现过,所以这里有ball=2。所谓strike是指在这2个ball中有几个位置是正确的。比如,上例中数字2的位置正确,所以strike=1。乙随后会进行分析,然后再猜一个数,甲再告诉乙ball和strike分别等于几。这个过程不断重复,直到乙猜出目标。注意,strike永远小于等于ball。以下是一个例子:

甲:我想好了一个四位数
乙:0115
甲:ball=1,strike=0
乙:5623
甲:ball=0,strike=0
乙:1798
甲:ball=1,strike=1
乙:8088
甲:ball=3,strike=1
乙:4088
甲:猜对了!

本节的目标是编写一个程序,人类出题,电脑来猜。大家看到这个问题很容易想到这样一个思路,当猜测5382得知ball=2,strikes=1时,意味着目标的形状像5*3*,5**3,*35*,*3*5,58**,5**8,......。把所有这些可能的模式记下来,然后在其中随机挑选一个,比如*35*,再随机拼出一个数据比如1359,让人类告知对比结果,再用结果更新上面的模式,......。这个过程比较复杂,事实上,我们还有一个简洁的思考方式:逆向思维+数据结构。

所谓逆向思维,就是说,不去试图建立目标的模式,而是反过来,排除不可能的模式。比如猜测5382得b2s1,那就把0~9999这一万个数中与5382对比不是b2s1的数排除。这样做的结果是确定的,不像正向思维得到的那么多的模式都是不确定的。

逆向思维的数据结构是一个含有0~9999这10000个数的列表candidates,每个数又用含有4个数字的列表表示。比如123就用[0, 1, 2, 3]表示。电脑首先从candidates中随机挑选一个数A猜测,人类告知ball和strike的值后,程序从candidates中删除一些数,这些数与A对比后的结果与上述ball及strike不等。然后电脑再从精简后的candidates里随机挑选一个数猜测,重复以上过程,直到乙猜出了这个数为止。

可见,只要建立了合适的数据结构——哪怕这个数据结构很简单——问题的困难也能迎刃而解。代码如下:

Python解决数字棒球游戏

# 文件: p04_03_ball_strike.py
import randomdef get_candidates(num=4):  # 获取所有4位候选数return [to_list(i, num) for i in range(int(10**num))]def to_list(n, num):  # 把数n转为num位数字列表result = []for _ in range(num):result.insert(0, n % 10)n //= 10return resultdef get_balls_strikes(goal, guess): # 获取两个数对比后的结果balls = 0goal_copy = goal.copy()for digit in guess:if digit in goal_copy:balls += 1pos = goal_copy.index(digit)goal_copy[pos] = -1  # 每找到一个数就填上-1strikes = 0for d1, d2 in zip(guess, goal):  # 按位对比if d1 == d2:strikes += 1return balls, strikesdef guess(candidates):  # 从候选数中随机挑选一个数return candidates[random.randint(0, len(candidates)-1)]def extract(candidates, guess, balls, strikes):# 删除不可能的候选数for i in range(len(candidates)-1, -1, -1):bs, ss = get_balls_strikes(candidates[i], guess)if ss != strikes or bs != balls:  # 如果对比结果不匹配del candidates[i]def to_str(digit_list):return ''.join([chr(ord('0') + d) for d in digit_list])if __name__ == '__main__':num = 4goal = input('请输入目标,一个最多%d位的正整数:' % num)goal = to_list(int(goal), num)candidates = get_candidates()guesses = 0while True:g = guess(candidates)guesses += 1print("我猜:", to_str(g))if g == goal:breakballs, strikes = get_balls_strikes(goal, g)print("\tballs =", balls, "strikes =", strikes)extract(candidates, g, balls, strikes)print('猜对了,共猜了%d次' % guesses)

程序运行的结果如下:

请输入目标,一个最多4位的正整数:3450
我猜: 5848balls = 2 strikes = 0
我猜: 4553balls = 3 strikes = 1
我猜: 4365balls = 3 strikes = 0
我猜: 3574balls = 3 strikes = 1
我猜: 3450
猜对了,共猜了5次

Python解决数字棒球游戏相关推荐

  1. Python|猜数字小游戏

    Python Python猜数字小游戏 说明 分析 代码实现 补充说明 Python猜数字小游戏 说明 通常由两个人参与,一个人设置一个数字,一个人猜数字,当猜数字的人说出一个数字,由出数字的人告知是 ...

  2. Python实现数字推盘游戏重排九宫8-puzzle

    Python实现数字推盘游戏重排九宫8-puzzle 数字推盘游戏是一种经典的智力拼图游戏,玩家需要移动数字块,将它们按照正确的顺序排列.而8-puzzle就是数字推盘游戏中最经典的版本之一.本文将介 ...

  3. Python Tkinter——数字拼图游戏详解版

    Python Tkinter 实践系列--数字拼图游戏详解版 import random #Python中的random是一个标准库用于生成随机数.随机整数.还有随机从数据集取数据. import t ...

  4. Python Tkinter——数字拼图游戏

    Python Tkinter 实践系列--数字拼图游戏 tkinter模块,掌握窗口创建.消息循环等tkinter的基本架构 读取并显示图片,处理键盘事件 导入random库,导入python中的tk ...

  5. python猜数字小游戏制作

    教大家做一个简易的猜数字的游戏,但确实蛮简单的,我这个四年级的小盆友也才学了一天,所以给那些不会的教一下. 我们先来看导入模块: """ 简易python猜数小游戏&qu ...

  6. Python猜数字小游戏

    猜数字小游戏是利用while循环来获取用户输入,判断用户猜测数字与正确答案的大小,小于或大于则跳过本次循环,等于结束循环,输出猜测次数.代码如下: import randomtarget_number ...

  7. python猜数字统计游戏次数_猜数字游戏(Python)

    在Python3中工作.在 我对Python还比较陌生(只有几个星期的知识).在 这个程序给我的提示是写一个随机数游戏,用户必须猜出随机数(1到100之间),如果不正确,就会提示它太低或太高.然后用户 ...

  8. 「Python」数字推盘游戏-pygame

    pygame初识 本文是课本上的pygame小项目,是一个游戏设计-数字推盘 数字推盘简介: 数字推盘的载体内嵌了n×n个方块的凹槽板,凹槽中的方块均刻有或写有1 ~ n×n之内的不同数字.常见的有3 ...

  9. python猜数字小游戏你真的会吗?

    十二行代码搞定一个猜数字的小游戏,话不多说,直接上代码!如有不足还请大佬指正! from random import randint b=randint(1,1000) print("猜猜我 ...

  10. python猜数字小游戏(内附完整源码)

    代码如下: import random t=random.randint(0,99999) print("※=========☺========※=▇破产抽奖轮盘▆=※=======☹=== ...

最新文章

  1. php数组包含对象吗,在包含数组的PHP对象上调用方法
  2. 利用属性封装复杂的选项
  3. python报错_python 常见报错
  4. 【转】带你玩转Visual Studio——03.带你了解VC++各种类型的工程
  5. [Java]java反射随笔
  6. HTML文件属于void值吗,使用HTML :: TreeBuilder查找html文件中的值
  7. 四管前级怎么去掉高低音音调_一些歌曲音调太高怎么才能唱上去??
  8. Python按位异或运算符^应用案例一则:查找只出现一次的数字
  9. 设计模式-模板方法模式(15)
  10. PL\SQL结构控制、异常
  11. Mac下配置ndk/adb
  12. 淘淘商城系列——Redis的安装
  13. 不能创建对象qmdispatch_关于系统弹出错误:429 , ActiveX 部件不能创建对象 的解决方法...
  14. 计算机主机内的零件有什么用,ROM和RAM分别是什么?有什么区别?与电脑的什么配件的作用是一? 爱问知识人...
  15. Python3 获取法定节假日
  16. 怎么做才可以把电脑上的照片给做成视频?-markdown编辑器
  17. correl函数相关系数大小意义_相关系数越大,说明两个变量之间的关系就越强吗...
  18. ZigBee协调器,ZigBee智能节点盒
  19. 网站服务器费用是什么,建网站费用都包含什么
  20. 北京理工大学统考计算机在线作业,北京理工大学计算机统考网上作业答案

热门文章

  1. 为什么程序猿 996 会猝死,而企业家 007 却不会?
  2. 舵机控制 —— 一篇就够
  3. STM32l151 使用滴答计时器精准延时1us,1ms
  4. 搜狐的本色和张朝阳的本分
  5. 便捷式计算机无线功能按钮,便携式wlan热点是什么 如何设置【图解】
  6. 第六章-博弈论之Stackelberg博弈
  7. virtualxposed使用教程_VirtualXposed框架虚拟机——无需root体验xposed框架
  8. 有什么软件可以测试游戏视频数据,免费录制游戏视频软件有哪些?看完你就知道了...
  9. Activiti工作流表之间的关系
  10. PNP和NPN三极管区别