Python: 渐进猜数字游戏 <1> 代码、测试与猜数字

  测试人员要不要懂开发?要不要写代码?

  作为纯粹的黑盒测试人员,完全不需要懂开发,依然可以把测试做的很好。

  但代码是软件的核心。对代码的了解可以帮测试人员更加深入的了解软件,可以从代码层面设计更有针对性的设计测试用例,可以从更多的角度审视软件本身,用更多的手段测试软件,提高测试覆盖度,提升软件质量。

  因此,如果可以,测试人员应该了解代码,应当尝试去写些代码,把代码作为一种工具,使用代码开发需要的测试工具。工具不需要大、不需要完备,也许只要几行代码,实用就好,不断提升测试的效率。

  代码难学吗?难。测试难学吗?不难吗?任何一门知识,任何一项技能,任何一份工作,做下去,深入下去,都不容易。

  代码, 如何入手,环境、语法、框架、面向XX。。。。。。所有的问题都在困扰着入手的代码学习者,畏惧、犹豫,放弃。入门难,换个角度看代码,从最朴素的认识角度看代码。技巧是在不断的练习中、琢磨中不断的悟出来的,当然现在你可以读到大量的别人悟出来的、构建和改进出来的更加抽像的内容。理解起来当然难,你要理解别人的思想,你要顺着别人的抽象考虑事情,你要在你的思维方式中接纳和习惯别人的思考问题的方式。

  代码是工具,工具不在于有多么的高深,快速学习它、努力使用它。

-----------------------------------------------------------------------------------------------------------------------------------

  最早玩猜数字是在文曲星上,开始游戏后,输入数字,机器会返回xAxB的提示,通过提示猜下一次,直至全部猜对或是达到游戏限制。在机器配置低、没有大型游戏的年代,这种益智小游戏让人乐此不疲。

  挺有趣的小游戏,慢慢的就成了我学习一种新语言的入门之首选,用来了解语言的基础和特性,效果真的还不错。

  从最朴素的想法入手,不断的改进和抽象,让想法变成代码,让代码成为一种工具。

  其实软件入门、软件学习并没有那么难,从小到大,一点兴趣、一点坚持,除了思考,还要动动手。 

------------------------------------------------------------------------------------------------------------------------------------

  猜数字游戏:由电脑随机生成一个由0-9组成的四位数(不能有重复数字),猜一个数字,电脑数字给出结果:xAxB,其中A表示数字和位置都正确,B表示数字正确但位置不正确,x表示对应猜对的个数。
已标记关键词 清除标记
数字具体规则见:http://baike.baidu.com/subview/358630/11117097.htm 玩家和电脑对抗的模式,玩法为数字游戏标准玩法。 游戏流程: 执行guess.py文件开始游戏。 脚本随机生成一个没有重复的4位数字作为被数字。 玩家和电脑轮流数字。 玩家通过命令行输入数字,脚本打印出1A1B样式的测试结果。 脚本打印出电脑的数字和结果。电脑不能使用玩家的测结果。 重复此过程直至一方中。 打印出胜利者的信息,脚本结束执行。 要求: 使用python2.7版本 使用一个py文件来实现,命名为guess.py,完成上述玩法需求。 guess.py文件可以作为模块被其他脚本调用,提供如下接口: check:根据测数和预期数2个参数返回1A1B格式结果。 calculate:根据测数、该测数的1A1B格式结果,返回所有可能是正确答案的数据集。 在github上有一个比较完善的程序(python3.0)https://github.com/vpavlenko/bulls-and-cows/blob/master/solver.py 这两天我自己写好的python2.7代码: ``` #!/usr/bin/python # -*- coding:utf-8 -*- import random def random_num(): #生成4位无重复数字的随机数(首位不可为0) com_num = random.sample('123456789', 4) com_num = ''.join(com_num) return com_num def player_input(): #判断玩家输入合法性 while(True): try: global player_num player_num = str(raw_input('\nYour turn! Enter Your Guess Number:')) z = int(player_num) if(len(player_num) != 4): print('Please enter a 4 DIGIT number.') continue except ValueError: if player_num == 'quit': exit() print('Your input is not a number.') else: if(len(set(player_num)) != 4): print('Please enter a number with different digits.') continue elif player_num[0] == 0: print('Please enter a number that first number is not 0.') continue else: return def check(number, question): #根据测数和被数计算返回1A1B样式的结果"(1, 1)" number = str(number) question = str(question) global a_count global b_count a_count = 0 b_count = 0 for i in range(4): for j in range(4): if(number[i] == question[j]): if(i == j): a_count += 1 else: b_count += 1 return (a_count, b_count) def allowed_number(number): #判断数字合法性 return len(str(number)) == 4 and len(set(str(number))) == 4 all_numbers = [number for number in range(1234, 9877) if allowed_number(number)] #所有可能结果 def calculate(number, answer): #根据测数和1A1B结果计算返回所有可能结果 number = str(number) global num_series num_series = [] for possible_num in all_numbers: if not abs(cmp(check(possible_num, number), answer)): num_series.append(possible_num) return num_series def history_rec(number): #记录本轮游戏出现过的数字 global history return history.append(int(number)) def del_history(num_series, history): #删除本轮游戏中出现过的数字 for number in history: if number in num_series: num_series.remove(number) return num_series def ai_best(): #反馈个数指标评判答案最优解 global best if not (best[0]+best[1] > answer[0]+answer[1]): if not (best[0] > answer[0]): best = answer def history_area(num_series): #计算保存最可能的值域,取历史值域及新值域的交集 global area intersection = [i for i in area if i in num_series] intersection = list(set(area).intersection(set(num_series))) return intersection print''' ----------Guess The Number Game: Player VS AI---------- You can input"quit"to exit Rules: 1.Question number is a random 4 digit number without same digits (first digit can't be 0). 2.Player and AI guess the number one by one until Player Win or AI Win. 3.After every guess, program will return an answer of 1A1B like:"(1, 1)". A value is the number of digit and position are all correct. B value is just the number of digit is correct (position is wrong).''' player_num = 0 ai_num = 0 random_number = random_num() player_turn = 1 answer = (0, 0) a_count = 0 best = (0, 0) history = [] area = all_numbers while(a_count != 4): question = random_number num_series = [] #玩家的回合 if player_turn: player_input() history_rec(player_num) answer = check(player_num, question) a_count = answer[0] print "\nYour choice is", player_num print "Your answer is", answer ai_best() #电脑的回合 else: ai_num = random.choice(area) history_rec(ai_num) answer = check(ai_num, question) a_count = answer[0] print "\nAI's choice is", ai_num print "AI's answer is", answer ai_best() num_series = del_history(calculate(player_num, best), history) area = history_area(num_series) print num_series print area player_turn = not player_turn #输出胜负结果 if player_turn: print("\nYou Win!") else: print("\nAI Win!") ``` 但是运行几次老是报错 ``` Traceback (most recent call last): File "C:\Python27\guess.py", line 144, in <module> ai_num = random.choice(area) File "C:\Python27\lib\random.py", line 275, in choice return seq[int(self.random() * len(seq))] # raises IndexError if seq is empty IndexError: list index out of range ```
©️2020 CSDN 皮肤主题: 技术黑板 设计师:CSDN官方博客 返回首页