最近在学习python,并用python写了一个小时候玩的益智游戏,猜数字游戏,python语言真的是简洁啊,上来就是写代码逻辑,不用加一堆外壳的东西,话不多说,贴代码,取个名字叫guessL1.py,L1顾名思义是初级版本,就是能玩而已,后面会出个稍微高级一点的版本,加点智能化(AI)的东西。

#*********************************L1********************************

import random

print("/*******************************猜数字游戏***********************************/ \

游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!")

total='123456789'

answer=random.sample(total,4)

for guessTimes in range(6):

guess=""

for inputErros in range(3):

guess=input("请输入4位1-9的不重复数字:")

if guess.isdigit()==True and len(guess)==4:

guessSet=set(guess)

if len(guessSet)==4 and guessSet.isdisjoint(set('0')):

break

else:

print("您没有理解游戏规则,游戏结束。")

break

A=0

B=0

for j in range(4):

if guess[j]==answer[j]:

A+=1

else:

for k in range(4):

if guess[j]==answer[k]:

B+=1

if A<4:

if guessTimes<5:

print("%dA%dB,您还有%d次机会。" %(A,B,5-guessTimes))

else:

print("很遗憾您没有猜对,答案是%s,再玩一局吧。" %(answer))

else:

print("恭喜您猜对了!")

break

先玩一局吧,python3 guessL1.py,开始

/*******************************猜数字游戏***********************************/ 游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!

请输入4位1-9的不重复数字:1234

1A0B,您还有5次机会。

请输入4位1-9的不重复数字:5678

0A2B,您还有4次机会。

请输入4位1-9的不重复数字:7839

1A2B,您还有3次机会。

请输入4位1-9的不重复数字:7694

1A1B,您还有2次机会。

请输入4位1-9的不重复数字:7982

0A3B,您还有1次机会。

请输入4位1-9的不重复数字:1897

恭喜您猜对了!

初战告捷!很牛逼的样子。下面简单说一下我玩这游戏的思路(说着说着就啰嗦了。。。):

第一步,1234,没啥说的,因为4位数字是随机的,第一步输啥都行

第二步,5678,第一步反馈是1A0B,说明1234中有一位数字猜对了,那么另外三位数字,就分布在56789中,就尝试5678好了

接下来,第三步要开始动脑了,这里结合第一步和第二步的反馈结果进行猜测,第二步反馈0A2B,说明5678中有两位数字对了(位置不对),第一步1234有一位数字对了(位置也对),加起来3位数字对了,那么最后一位数字9肯定是对的,这里再假定5678中78是对的,位置调整一下,1234中假定3是对的,位置不变,然后就是9,看看运气如何吧

第三步,7839,反馈1A2B

有点接近了,这里9数字肯定是对的,位置可能不对吧,因为总共才有1位位置是对的,9换一下位置,3对的概率是1/4,姑且假设他不对吧,换成4,78假设是对的吧,假设7的位置也对,换成76试试,

第四步,7694,反馈1A1B

有点崩溃,7694不是一个好的尝试,在9数字肯定对的情况下,764只有一位是对的,返回第三步,7839有三位是对的,789应该是对的吧,换回来,3和4都尝试过了,再尝试一下2

第五步,7982,反馈0A3B,结果还不错,猜测789数字是对的,2也不对,那第一步就剩1了,参考第一步的反馈,1肯定在第一位,第四步中7694反馈1A1B,只有7和9是对的,7的位置显然不对,那9的位置就是对的,9在第三位,剩下7和8的位置,根据第二步5678反馈0A2B,8肯定不在第四位,那8只能在第二位了,7在第四位,大概这样吧1897

第六步,1897,恭喜您猜对了!

其实,这不是一个很完美的猜数字过程,人脑就是这样,无法时刻精确抓住所有信息,比如第四步猜7694,显然7894更合适点,还有第五步7982也不合适,因为既然选择2,根据第一步反馈结果,应该把2放在第二位,不过就因为玩的过程中的模糊和不确定性,最终猜对数字时才有了更多的喜悦(辛苦没白费)

#*********************************L2**************************

多玩几局游戏,有了稍微深入一点的思考,整个猜数字的过程,还是有一个相对固定的思路的,初次接触可能有点没头绪,慢慢的就找到方法和套路了,这就是常说的经验吧,我发觉我6步内猜出数字的概率还是挺高的。那么能不能改进一下游戏,把玩家的经验体现在游戏里,一般游戏里常有提示或者锦囊啥的,就加这个吧,每做完一步,就给个提示,下一步猜什么合适,或者还剩下多少可能,这个提示,玩家可以选择查看,或者不查看,把每步的提示连起来,就是电脑模拟人玩游戏的过程(AI),听起来就高大上了,虽然是很简单的AI,话不多说,先贴代码

import random

import time

def runGame(testAnswer):

for i in range(10):

playGuess(testAnswer);

if i==9:

print("您已经玩了10局了,休息一下吧。")

else:

again=input("您还想再玩一局吗?输入y再玩一局,按其他键退出:")

if again!='y':

break

def playGuess(testAnswer):

print("/*******************************猜数字游戏***********************************/ \

游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!")

answer=getAnswer(testAnswer)

answerSet=answerSetInit(set())

for guessTimes in range(6):

for inputErros in range(3):

guess=input("请输入4位1-9的不重复数字:")

if guess.isdigit()==True and len(guess)==4:

guessSet=set(guess)

if len(guessSet)==4 and guessSet.isdisjoint(set('0')):

break

else:

print("您没有理解游戏规则,游戏结束。")

return

A,B=compareAnswer(guess,answer)

if A<4:

if guessTimes<5:

print("%dA%dB,您还有%d次机会。" %(A,B,5-guessTimes))

delCount=answerSetDelNum(answerSet,guess,A,B)

answerSetUpd(answerSet,guess,A,B)

helpFlag=input("输入h查看帮助,按其他键继续游戏:")

if helpFlag=='h':

print("本次排除可能答案:%d个,剩余:%d个" %(delCount,len(answerSet)))

print(helpInfo(answerSet))

if len(answerSet)<=200:

print(answerSet)

print("推荐数字:",suggestedNum(answerSet,100) )

else:

print("很遗憾您没有猜对,答案是%s,再玩一局吧。" %(answer))

else:

print("恭喜您猜对了!")

break

def guessTrainner(testAnswer):

start =time.time()

answer=getAnswer(testAnswer)

print (answer)

answerSet=answerSetInit(set())

for i in range(6):

inputStrMax=suggestedNum(answerSet,100)

print('第%d步----' %(i+1), end="")

print('尝试:' +inputStrMax, end="")

print('----', end="")

AMax,BMax = compareAnswer(inputStrMax, answer)

print('反馈:%dA%dB' % (AMax, BMax), end="")

print('----', end="")

print('排除可能答案:%d个' % (answerSetDelNum(answerSet,inputStrMax,AMax,BMax)))

answerSetUpd(answerSet,inputStrMax,AMax,BMax)

if AMax==4:

elapsed = (time.time() - start)

print("猜数字成功,总用时:%f秒,总步数:%d。" %(elapsed,i+1))

break

elif i==5:

print("猜数字失败!")

def getAnswer(testAnswer):

total = '123456789'

answer = random.sample(total, 4)

if testAnswer > 999:

answer = str(testAnswer)

return answer

def compareAnswer(inputStr,answerStr):

A=0

B=0

for j in range(4):

if inputStr[j]==answerStr[j]:

A+=1

else:

for k in range(4):

if inputStr[j]==answerStr[k]:

B+=1

return A,B

def answerSetInit(answerSet):

answerSet.clear()

for i in range(1234,9877):

seti=set(str(i))

if len(seti)==4 and seti.isdisjoint(set('0')):

answerSet.add(str(i))

return answerSet

def answerSetUpd(answerSet,inputStr,A,B):

answerSetCopy=answerSet.copy()

for answerStr in answerSetCopy:

A1,B1=compareAnswer(inputStr,answerStr)

if A!=A1 or B!=B1:

answerSet.remove(answerStr)

def answerSetDelNum(answerSet,inputStr,A,B):

i=0

for answerStr in answerSet:

A1, B1 = compareAnswer(inputStr, answerStr)

if A!=A1 or B!=B1:

i+=1

return i

def helpInfo(answerSet):

answer0=set()

answer1=set()

answer2=set()

answer3=set()

for answerStr in answerSet:

answer0.add(answerStr[0])

answer1.add(answerStr[1])

answer2.add(answerStr[2])

answer3.add(answerStr[3])

helpInfoStr="提示:第一位可能是"+"|".join(answer0)+",第二位可能是"+"|".join(answer1)+",第三位可能是"+"|".join(answer2)+",第四位可能是"+"|".join(answer3)

return helpInfoStr

def suggestedNum(answerSet,lvl):

suggestedNum=''

delCountMax=0

if len(answerSet) > lvl:

suggestedNum = list(answerSet)[0]

else:

for inputStr in answerSet:

delCount = 0

for answerStr in answerSet:

A,B = compareAnswer(inputStr, answerStr)

delCount += answerSetDelNum(answerSet, inputStr,A,B)

if delCount > delCountMax:

delCountMax = delCount

suggestedNum = inputStr

if delCount == delCountMax:

if suggestedNum == '' or int(suggestedNum) > int(inputStr):

suggestedNum = inputStr

# print(inputStr+'-----'+str(delCount)+'-----'+str(delCountMax)+'-----'+suggestedNum)

return suggestedNum

代码量翻了不少倍!玩玩看!

➜ python python3 -c "import guess;guess.runGame(1)"

/*******************************猜数字游戏***********************************/ 游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!

请输入4位1-9的不重复数字:1234

2A0B,您还有5次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:2904个,剩余:120个

{'1538', '8264', '1268', '9634', '6934', '7236', '8734', '1297', '8534', '1674', '1974', '1754', '7834', '1287', '1537', '5236', '1279', '6534', '1637', '7934', '1954', '1784', '1738', '6734', '9834', '7254', '1539', '5934', '7238', '8254', '1964', '6238', '5274', '1295', '1594', '6274', '6235', '5834', '8294', '8235', '1864', '1739', '1298', '9238', '1894', '6294', '1984', '1684', '9734', '6284', '1938', '8274', '1584', '9534', '8634', '8934', '1836', '1639', '6254', '1735', '1564', '1694', '7239', '5734', '9274', '6237', '1286', '6239', '1267', '1935', '5239', '5634', '9254', '9237', '5237', '1638', '7534', '1854', '1289', '1574', '1276', '1794', '7264', '8237', '5238', '1278', '1764', '1936', '5264', '1937', '1259', '7235', '9236', '1635', '8239', '9284', '7634', '1839', '5294', '7294', '9264', '1874', '8236', '1285', '1296', '1256', '1837', '1835', '1257', '1265', '1654', '7284', '1269', '1258', '1736', '6834', '5284', '1275', '9235', '1536'}

提示:第一位可能是7|5|6|9|1|8,第二位可能是7|5|6|9|8|2,第三位可能是7|5|6|9|8|3,第四位可能是7|5|6|9|8|4

推荐数字: 1538

请输入4位1-9的不重复数字:1538

0A1B,您还有4次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:108个,剩余:12个

{'8264', '7254', '5274', '8294', '6284', '8274', '6254', '9254', '5264', '9284', '5294', '7284'}

提示:第一位可能是7|5|6|9|8,第二位可能是2,第三位可能是7|5|6|9|8,第四位可能是4

推荐数字: 5264

请输入4位1-9的不重复数字:5264

恭喜您猜对了!

您还想再玩一局吗?输入y再玩一局,按其他键退出:y

/*******************************猜数字游戏***********************************/ 游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!

请输入4位1-9的不重复数字:1234

0A2B,您还有5次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:2184个,剩余:840个

提示:第一位可能是7|5|6|9|8|2|3|4,第二位可能是7|5|6|9|1|8|3|4,第三位可能是7|5|6|9|1|8|2|4,第四位可能是7|5|6|9|1|8|2|3

推荐数字: 4378

请输入4位1-9的不重复数字:4378

1A1B,您还有4次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:692个,剩余:148个

{'4752', '8329', '7319', '4517', '3972', '5346', '7392', '5472', '4527', '7315', '2648', '9471', '4761', '6382', '8319', '4157', '9382', '4197', '4729', '7352', '7128', '7361', '4862', '4725', '4829', '4185', '3628', '6349', '8316', '2386', '9148', '3572', '3158', '7329', '8362', '3518', '2458', '4693', '6381', '4627', '4953', '4762', '2973', '4715', '5382', '8351', '4819', '9345', '6327', '7391', '2475', '8391', '9381', '4581', '4682', '5173', '4917', '3928', '4653', '6428', '4861', '4927', '7325', '3672', '7316', '4825', '6173', '4681', '2871', '4892', '2476', '8352', '2718', '9317', '4593', '6317', '7351', '8392', '2948', '4719', '5428', '5148', '3528', '7362', '8361', '9472', '5418', '7326', '3618', '2389', '4792', '2479', '6345', '3176', '4851', '2468', '4815', '2357', '2673', '9428', '9346', '4563', '8326', '8172', '3571', '4716', '8315', '4891', '6471', '9173', '4189', '4582', '8325', '6148', '9327', '2498', '4981', '4852', '4982', '2548', '4816', '4826', '2397', '9418', '5471', '4963', '5327', '3168', '3175', '5349', '6472', '4791', '3918', '6418', '2573', '3971', '3179', '2385', '5381', '4617', '3671', '5317', '4186', '2367', '4751', '4167', '3198', '4726'}

提示:第一位可能是7|5|6|9|8|2|3|4,第二位可能是7|5|6|9|1|8|3|4,第三位可能是7|5|6|9|1|8|2|4,第四位可能是7|5|6|9|1|8|2|3

推荐数字: 4752

请输入4位1-9的不重复数字:4752

0A3B,您还有3次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:140个,剩余:8个

{'7325', '2476', '5428', '2479', '2548', '5471', '5327', '2573'}

提示:第一位可能是7|5|2,第二位可能是5|4|3,第三位可能是7|4|2,第四位可能是7|5|6|9|1|8|3

推荐数字: 2476

请输入4位1-9的不重复数字:2476

1A1B,您还有2次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:6个,剩余:2个

{'5428', '2548'}

提示:第一位可能是5|2,第二位可能是5|4,第三位可能是4|2,第四位可能是8

推荐数字: 2548

请输入4位1-9的不重复数字:2548

1A3B,您还有1次机会。

输入h查看帮助,按其他键继续游戏:h

本次排除可能答案:1个,剩余:1个

{'5428'}

提示:第一位可能是5,第二位可能是4,第三位可能是2,第四位可能是8

推荐数字: 5428

请输入4位1-9的不重复数字:5428

恭喜您猜对了!

您还想再玩一局吗?输入y再玩一局,按其他键退出:

玩这游戏变的轻松好多,几乎不用动脑,根据提示的可能性,随便玩玩就能猜出答案!

还有更高级的,模拟电脑玩游戏

➜ python python3 -c "import guess;guess.guessTrainner(1)"

['6', '4', '7', '3']

第1步----尝试:7861----反馈:0A2B----排除可能答案:2184个

第2步----尝试:6947----反馈:1A2B----排除可能答案:786个

第3步----尝试:6729----反馈:1A1B----排除可能答案:43个

第4步----尝试:6374----反馈:2A2B----排除可能答案:10个

第5步----尝试:6473----反馈:4A0B----排除可能答案:0个

猜数字成功,总用时:0.541268秒,总步数:5。

➜ python python3 -c "import guess;guess.guessTrainner(1)"

['5', '8', '2', '3']

第1步----尝试:9642----反馈:0A1B----排除可能答案:2304个

第2步----尝试:8795----反馈:0A2B----排除可能答案:502个

第3步----尝试:1983----反馈:1A1B----排除可能答案:171个

第4步----尝试:5184----反馈:1A1B----排除可能答案:41个

第5步----尝试:3586----反馈:0A3B----排除可能答案:5个

第6步----尝试:5823----反馈:4A0B----排除可能答案:0个

猜数字成功,总用时:0.411014秒,总步数:6。

➜ python python3 -c "import guess;guess.guessTrainner(1)"

['4', '1', '2', '6']

第1步----尝试:7569----反馈:0A1B----排除可能答案:2304个

第2步----尝试:5842----反馈:0A2B----排除可能答案:502个

第3步----尝试:9421----反馈:1A2B----排除可能答案:199个

第4步----尝试:1624----反馈:1A3B----排除可能答案:18个

第5步----尝试:4126----反馈:4A0B----排除可能答案:0个

猜数字成功,总用时:0.082934秒,总步数:5。

➜ python python3 -c "import guess;guess.guessTrainner(1)"

['7', '6', '4', '2']

第1步----尝试:1258----反馈:0A1B----排除可能答案:2304个

第2步----尝试:9316----反馈:0A1B----排除可能答案:598个

第3步----尝试:7489----反馈:1A1B----排除可能答案:104个

第4步----尝试:2467----反馈:0A4B----排除可能答案:16个

第5步----尝试:7624----反馈:2A2B----排除可能答案:1个

第6步----尝试:7642----反馈:4A0B----排除可能答案:0个

猜数字成功,总用时:0.080719秒,总步数:6。

➜ python python3 -c "import guess;guess.guessTrainner(1)"

['2', '5', '1', '4']

第1步----尝试:2173----反馈:1A1B----排除可能答案:2544个

第2步----尝试:2345----反馈:1A2B----排除可能答案:455个

第3步----尝试:2754----反馈:2A1B----排除可能答案:23个

第4步----尝试:2451----反馈:1A3B----排除可能答案:1个

第5步----尝试:2514----反馈:4A0B----排除可能答案:0个

猜数字成功,总用时:0.105326秒,总步数:5。

python数字推盘游戏怎么显示步数_python初学---猜数字游戏(游戏与AI,原创)相关推荐

  1. python数字推盘游戏怎么显示步数_Python游戏开发:《最强大脑》同款游戏【数字华容道】...

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  2. python数字推盘游戏怎么显示步数_Python游戏开发:数字华容道

    今年年初,新一季的<最强大脑>开播了,第一集选拔的时候大家做了一个数字游戏,名叫<数字华容道>,当时何猷君以二十几秒的成绩夺得该项目的冠军,看了这个游戏之后我决定要写一个< ...

  3. python数字推盘游戏怎么显示步数_python机器人行走步数问题的解决

    本文实例为大家分享了python机器人行走步数问题,供大家参考,具体内容如下 #! /usr/bin/env python3 # -*- coding: utf-8 -*- # fileName : ...

  4. python猜数字游戏编程入门_Python实现猜数字游戏

    Python实现猜数字游戏 游戏规则: 随机产生1到100之间的整数 共有6次猜测机会,每次猜测如果不正确会提示大于或小于目标值,6次机会用完退出程序 6次机会,包含第6次机会如果猜中,提示用户猜中 ...

  5. c语言编程题猜数字游戏6题,c语言编程—猜数字游戏.doc

    c语言编程-猜数字游戏 计算机实习报告 面向过程编程 用C语言求解实际问题 一.问题描述 游戏类第15个任务--猜数字游戏 计算机从0-9这10个数字中任意选择n个不重复数字(n≤10)组成一个5位数 ...

  6. c语言课程设计猜数字游戏报告,C语言课程设计-猜数字游戏报告.doc

    C语言课程设计-猜数字游戏报告 摘要 该软件在Windows系统上为玩家提供猜数字游戏的基本功能,游戏用户可以选择开始游.排行榜查看.帮助等主要功能.当用户选择开始游戏时,系统会提示用户排行榜上猜数字 ...

  7. c语言课程设计猜数字游戏报告,C语言课程设计猜数字游戏报告

    C语言课程设计猜数字游戏报告 C 语言课程设计----猜数字1摘 要该 软 件 在 Windows 系 统 上 为 玩 家 提 供 猜 数 字 游 戏的 基 本 功 能 , 游 戏 用 户 可 以 选 ...

  8. python拼图游戏代码的理解_Python编写的数字拼图游戏(含爬山算法人机对战功能)...

    数字拼图游戏与拼图游戏原理一致,把打乱了的数字或图片经移动,拼成给定的目标数字或图片,其中总有一个空的地方,让相邻(上下左右)的方块移动,直至达到目标. 游戏代码由浙江温州永嘉县教师发展中心应根球老师 ...

  9. python编写猜大小游戏_python编写猜数字小游戏

    本文实例为大家分享了python编写猜数字小游戏的具体代码,供大家参考,具体内容如下 import random secret = random.randint(1,30) guess = 0 tri ...

最新文章

  1. 为了研究因果关系,原来科学家在这么多方向上都有尝试(附链接)
  2. idea如何打war包?(部署tomcat后具有class文件)
  3. Sprites实现翻页按钮,圆角,宽度不固定
  4. 双非高校浙工大,一年2项研究上Nature,校友纷纷打Call:欠一个211名头
  5. CYQ.Data 轻量数据层之路 使用篇五曲 MProc 存储过程与SQL(十六)
  6. 【Linux】linux中删除指定文件外所有其他文件(夹)的问题
  7. AlwaysUp使用方法
  8. 苏州银行签约神策数据,致力打造科技引领的新时代普惠银行
  9. GDCM:打印dicom文件的LookupTable的测试程序
  10. php 数组的定义方法,PHP中数组定义的几种方法
  11. 【bzoj3514】 Codechef MARCH14 GERALD07加强版
  12. linux 安装redis2.8.3,Linux及Windows安装Redis(详细)
  13. 蓝桥杯 PREV-5历届试题 错误票据
  14. css布局-瀑布流的实现
  15. 如何正确使用RS485半双工芯片
  16. 12. 查询表product——查询库存商品中,最高单价、最低单价分别是多少
  17. python+pands+matplotlib分析Excel表格
  18. 更新操作先删除缓存后更新DB,还是先更新DB后删除缓存问题???
  19. java之jdk14安装和环境设置以及eclipse创建工程出现红叉
  20. 如何下载Direct3D9Ex

热门文章

  1. Onblur的点击事件
  2. “白条”黑产追踪:京东账号遭大量泄露,黑市价高至每个千元
  3. 松下AJ-HPX298摄像机MXF视频删除数据恢复损坏修复技术分析
  4. Java基础语法——运算符与表达式
  5. 基于Python实现相机标定正畸并生成鸟瞰图
  6. 华为od机试题9 真题
  7. [Mybatis-Plus] 调用自带方法 报错 Invalid bound statement
  8. 3 OpenCV 车牌识别-2 颜色定位
  9. 山东大学计算机考博难度,2018年山东大学中国史个人考博经验谈
  10. MyBatis自动配置(MyBatisAutoConfiguration)