100个python算法超详细讲解:人机猜数

【100个python算法超详细讲解】@谷歌学术

1.问题描述
由计算机随机产生一个4位整数,请人猜这4位整数是多少。人输入一
个4位数后,计算机首先判断其中有几位猜对了,并且对的数字中有几位位
置也正确,将结果显示出来,给人以提示,请人再猜,直到人猜出计算机
随机产生的4位数是多少为止。
例如,计算机产生一个4位整数“1234”请人猜,可能的提示如下:

游戏结束。请编程实现该游戏。
2.问题分析
判断相同位置上的数字是否相同不需要特殊的算法。只要截取相同位
置上的数字进行比较即可。但在判断几位数字正确时,则应当注意:计算
机随机产生的是“1123”,而人所猜的是“1576”,则正确的数字只有1位。
程序中截取计算机随机产生的数的每位数字与人所猜的数字按位比
较。若有两位数字相同,则要记住所猜中数字的位置,使该位数字只能与
一位对应的数字“相同”。当截取下一位数字进行比较时,就不应再与上述
位置上的数字进行比较,以避免所猜的数中的一位与对应数中多位数字“相
同”的错误情况。
3.随机数
随机数,顾名思义就是随机产生的、无规则的数。在编程中,有时我
们不想手动从键盘输入数据,而想让计算机自动产生一些数据供我们使用
(例如生成100个两位数),这时就要用到随机数。
随机数的生成方法很简单,在Python中只需导入random模块即可,
random模块提供了生成随机数的相关方法,在第4章中已对random模块做了
详细的讲解,在此不再陈述。
4.程序框架
程序流程图如图7.6所示。

 

5.完整的程序
根据上面的分析,编写程序如下:

#!/usr/bin/python3
# -*- coding: utf-8 -*-
# @author : liuhefei
# @desc: 人机猜数
import random
if __name__ == "__main__":
z = random.randint(1000, 10000) # 随机生成[1000,10000)之间的数
# print("z = ", z)
print("机器输入四位数:****")
l = [0] * 4 # 存储4位随机数
c = 1 # 变量c为猜数次数计算器
while True:
g = int(input("请输入你猜的四位数:"))
a = z
j = 0 # 变量j表示数字正确的位数
k = 0 # 变量k表示位置正确的位数
l[0] = l[1] = l[2] = l[3] = 0
# 变量i表示原数中的第i位数。个位为第1位,千位为第4位
for i in range(1, 5):
s = g
m = 1
for t in range(1, 5): # 人所猜想的数
if a % 10 == s % 10: # 若第i位与人猜的第t位相同
# 若该位置上的数字尚未与其他数字“相同”
if m and t != l[0] and t != l[1] and t != l[2] and t != l[3]:
j += 1
m = 0
l[j-1] = t # 记录相同数字时,该数字在所猜数字中的位置
if i == t:
k += 1 # 若位置也相同,则计数器k加1
s //= 10
a //= 10
print("你猜的结果是:%dA%dB\n" %(j, k))
if k == 4:
print("****** 你赢了 ******")
break # 若位置全部正确,则人猜对了,退出
c += 1
print("你总共猜了 %d 次" %c)

 6.运行结果
在PyCharm下运行程序,先由计算机随机产生一个4位数,接着提示“请
输入你猜的四位数:”,输入猜的4位数后,计算机会给出一个判断结果,
接着再猜,直至猜对为止,运行结果如图7.7所示。

7.拓展训练
在一个3×3的棋盘上,?乙两个人进行对弈。已知两人轮流在棋盘上放
棋子,当某一方的棋子连成一条直线时(包括横线、竖线或斜线),则该
方获胜。请编写游戏程序来实现人机之间的比赛,并输出比赛结果。比赛
有3种结果,分别是输、赢和平局。 

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

Lee达森

创作不易,感谢打赏!

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

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

打赏作者

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

抵扣说明:

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

余额充值