最近在学习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
answerSet=set()
def runGame(testAnswer):
for tt in range(10):
playGuess(testAnswer);
if tt==9:
print("您已经玩了10局了,休息一下吧。")
else:
again=input("您还想再玩一局吗?输入y再玩一局,按其他键退出:")
if again!=‘y‘:
break
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*10+B
def answerSetInit():
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))
def answerSetUpd(inputStr,AB):
answerSet1=answerSet.copy()
for answerStr in answerSet1:
if compareAnswer(inputStr,answerStr)!=AB:
answerSet.remove(answerStr)
def helpInfo():
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 playGuess(testAnswer):
print("/*******************************猜数字游戏***********************************/ \
游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!")
total=‘123456789‘
answer=random.sample(total,4)
if testAnswer>999:
answer=str(testAnswer)
answerSetInit()
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
AB=compareAnswer(guess,answer)
A=int(AB/10)
B=AB%10
if A<4:
if guessTimes<5:
print("%dA%dB,您还有%d次机会。" %(A,B,5-guessTimes))
delCount=answerSetDelNum(answerSet,guess,AB)
answerSetUpd(guess,AB)
helpFlag=input("输入h查看帮助,按其他键继续游戏:")
if helpFlag==‘h‘:
print("本次排除可能答案:%d个,剩余:%d个" %(delCount,len(answerSet)))
print(helpInfo())
if len(answerSet)<100:
print(answerSet)
else:
print("很遗憾您没有猜对,答案是%s,再玩一局吧。" %(answer))
else:
print("恭喜您猜对了!")
break
def guessTrainner():
total=‘123456789‘
answer=random.sample(total,4)
print (answer)
answerSetX=answerSetInitX(set())
answerSetFix=answerSetInitX(set());
AB1=compareAnswer(‘1234‘,answer)
print(‘第1步----‘,end="")
print(‘尝试:1234‘,end="")
print(‘----‘,end="")
print(‘反馈:%dA%dB‘ %(int(AB1/10),AB1%10),end="")
print(‘----‘,end="")
delCount1=answerSetDelNum(answerSetX,‘1234‘,AB1)
print(‘排除可能答案:%d个‘ %(delCount1))
answerSetUpdX(answerSetX, ‘1234‘, AB1)
if AB1<40:
for i in range(2,7):
inputStrMax = ‘‘
delCountMax = 0
if delCount1<2700 and i==2:
AB2 = compareAnswer(‘5678‘, answer)
print(‘第2步----‘, end="")
print(‘尝试:5678‘, end="")
print(‘----‘, end="")
print(‘反馈:%dA%dB‘ % (int(AB2 / 10), AB2 % 10), end="")
print(‘----‘, end="")
delCount2 = answerSetDelNum(answerSetX, ‘5678‘, AB2)
print(‘排除可能答案:%d‘ % (delCount2))
answerSetUpdX(answerSetX, ‘5678‘, AB2)
if AB2==40:
break
else:
continue
for inputStr in answerSetX:
delCount = 0
inputStrMax=inputStr
for answerStr in answerSetX:
AB = compareAnswer(inputStr, answerStr)
delCount+=answerSetDelNum(answerSetX,inputStr,AB)
if delCount>delCountMax:
inputStrMax=inputStr
print(‘第%d步----‘ %(i), end="")
print(‘尝试:‘ +inputStrMax, end="")
print(‘----‘, end="")
ABMax = compareAnswer(inputStrMax, answer)
print(‘反馈:%dA%dB‘ % (int(ABMax / 10), ABMax % 10), end="")
print(‘----‘, end="")
print(‘排除可能答案:%d个‘ % (answerSetDelNum(answerSetX,inputStrMax,ABMax)))
answerSetUpdX(answerSetX,inputStrMax,ABMax)
if ABMax==40:
break
def answerSetInitX(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 answerSetUpdX(answerSetX,inputStr,AB):
answerSet1=answerSetX.copy()
for answerStr in answerSet1:
if compareAnswer(inputStr,answerStr)!=AB:
answerSetX.discard(answerStr)
def answerSetDelNum(answerSetX,inputStr,AB):
i=0
for answerStr in answerSetX:
if compareAnswer(inputStr,answerStr)!=AB:
i+=1
return i
代码量翻了不少倍!玩玩看!
? python python3 -c "import guess;guess.runGame(1)"
/*******************************猜数字游戏***********************************/ 游戏规则:系统随机给出1-9的4位数字,您可以输入您猜测的4位数字,系统会比较并给予反馈,A表示数字对,且位置对,B表示数字对位置不对,如1A2B表示有1位您猜对了数字和位置,有2位您猜对数字,但位置不对。您总共有6次机会,加油哦!
请输入4位1-9的不重复数字:1234
0A1B,您还有5次机会。
输入h查看帮助,按其他键继续游戏:h
本次排除可能答案:2304个,剩余:720个
提示:第一位可能是6|7|3|4|5|2|8|9,第二位可能是6|7|3|4|5|8|9|1,第三位可能是6|7|9|4|5|8|2|1,第四位可能是6|7|3|9|5|8|2|1
请输入4位1-9的不重复数字:5678
0A3B,您还有4次机会。
输入h查看帮助,按其他键继续游戏:h
本次排除可能答案:588个,剩余:132个
提示:第一位可能是6|7|3|4|8|2,第二位可能是7|3|4|5|8|1,第三位可能是6|4|5|2|8|1,第四位可能是6|7|3|5|2|1
请输入4位1-9的不重复数字:6781
1A1B,您还有3次机会。
输入h查看帮助,按其他键继续游戏:h
本次排除可能答案:104个,剩余:28个
提示:第一位可能是6|7|3|4|8|2,第二位可能是7|3|4|5|8,第三位可能是6|4|5|8|2,第四位可能是6|7|3|5|2
{‘7385‘, ‘6457‘, ‘4586‘, ‘6547‘, ‘7582‘, ‘4765‘, ‘3756‘, ‘8752‘, ‘4756‘, ‘7485‘, ‘2756‘, ‘2587‘, ‘6825‘, ‘8753‘, ‘8745‘, ‘6852‘, ‘6853‘, ‘2586‘, ‘6845‘, ‘8725‘, ‘3765‘, ‘6527‘, ‘3586‘, ‘3587‘, ‘2765‘, ‘4587‘, ‘6357‘, ‘7583‘}
请输入4位1-9的不重复数字:8745
2A0B,您还有2次机会。
输入h查看帮助,按其他键继续游戏:h
本次排除可能答案:26个,剩余:2个
提示:第一位可能是3|2,第二位可能是7,第三位可能是6,第四位可能是5
{‘3765‘, ‘2765‘}
请输入4位1-9的不重复数字:2765
3A0B,您还有1次机会。
输入h查看帮助,按其他键继续游戏:h
本次排除可能答案:1个,剩余:1个
提示:第一位可能是3,第二位可能是7,第三位可能是6,第四位可能是5
{‘3765‘}
请输入4位1-9的不重复数字:3765
恭喜您猜对了!
您还想再玩一局吗?输入y再玩一局,按其他键退出:
玩这游戏变的轻松好多,几乎不用动脑,根据提示的可能性,随便玩玩就能猜出答案!
还有更高级的,模拟电脑玩游戏
? python python3 -c "import guess;guess.guessTrainner()"
[‘4‘, ‘2‘, ‘6‘, ‘9‘]
第1步----尝试:1234----反馈:1A1B----排除可能答案:2544个
第2步----尝试:5678----反馈:0A1B----排除可能答案:336
第3步----尝试:3594----反馈:0A2B----排除可能答案:102个
第4步----尝试:9251----反馈:1A1B----排除可能答案:30个
第5步----尝试:4289----反馈:3A0B----排除可能答案:11个
第6步----尝试:4269----反馈:4A0B----排除可能答案:0个
? python python3 -c "import guess;guess.guessTrainner()"
[‘3‘, ‘5‘, ‘9‘, ‘8‘]
第1步----尝试:1234----反馈:0A1B----排除可能答案:2304个
第2步----尝试:5678----反馈:1A1B----排除可能答案:576
第3步----尝试:4697----反馈:1A0B----排除可能答案:139个
第4步----尝试:5891----反馈:1A2B----排除可能答案:3个
第5步----尝试:3598----反馈:4A0B----排除可能答案:1个
? python python3 -c "import guess;guess.guessTrainner()"
[‘5‘, ‘7‘, ‘3‘, ‘6‘]
第1步----尝试:1234----反馈:1A0B----排除可能答案:2784个
第2步----尝试:5267----反馈:1A2B----排除可能答案:216个
第3步----尝试:6259----反馈:0A2B----排除可能答案:20个
第4步----尝试:5674----反馈:1A2B----排除可能答案:3个
第5步----尝试:5736----反馈:4A0B----排除可能答案:0个
原文:https://www.cnblogs.com/funlove/p/13215041.html