前言
最近馋世界游戏大全51,心血来潮用Python写了个猜颜色,顺便扩展了难度(颜色数和可重复性)
一、算法原理
1. 生成器部分
利用ramdom库生成随机数列,并且用字典计数来保证最大重复值
2. 检测器部分
检测包括"全部正确"和"部分正确",全部正确即位置,字符内容均相同,部分正确可以通过字典计数,生成颜色字典和输入颜色字典同一颜色的最小值之和为重合颜色数,再减去全部正确数即为部分正确数
二、代码
代码如下(复制直接玩 美滋滋):
import random
n = 6
t = 1
number = 0
gamestr = ''
guessstr = ''
break_flag = False
color = ['红','橙','黄','绿','青','蓝','紫']
color3 = ['红','橙','黄','绿','青','蓝','紫']
colordict = {'红':0,'橙':0,'黄':0,'绿':0,'青':0,'蓝':0,'紫':0}
def Getnumber():
global number
number = int(input('猜谜个数:'))
while number < 0:
print('你输入数非正整数,闹呢?请重新输入!')
number = int(input('猜谜个数:'))
return(number)
def repeatability(number):
repeatability = int(input('最多重复个数:'))
while (repeatability < 0)or(repeatability > number):
print('不合规范')
repeatability = int(input('最多重复个数:'))
def Generate():
global n
global colordict
b = random.randint(0,n)
genout = color[b]
colordict[color[b]]+=1
if colordict[color[b]] == repeatability:
color.pop(b)
n -= 1
return genout
def ALLTRUECALI(guessstr,number):
ATC=0
for i in range(0,number):
if gamestr[i] == guessstr[i]:
ATC += 1
return ATC
def HALFTRUECALI(guessstr,number,ATC):
HTC=0
color2 = ['红', '橙', '黄', '绿', '青', '蓝', '紫']
guess_dict={'红':0,'橙':0,'黄':0,'绿':0,'青':0,'蓝':0,'紫':0}
for i in range(0,number):
guess_dict[guessstr[i]] += 1
for i in range(0,7):
c = min(guess_dict[color2[i]],colordict[color2[i]])
HTC += c
HTC -= ATC
return HTC
def fault_calibrate(guessstr,ATC,HTC):
print('本次猜测,%d个全对,%d个半对'%(ATC,HTC))
def Errordetector(guessstr):
global break_flag
break_flag = False
if len(guessstr)!=len(gamestr):
break_flag = True
print('字符错误,请重新输入')
else:
for i in range(0,number):
count = 0
for j in range(0,7):
if guessstr[i] == color3[j]:
count += 1
if count != 1:
print('您输入的颜色不在范围内,请重新输入')
break_flag = True
break
return(break_flag)
def main():
number = Getnumber()
repeatability(number)
global gamestr
for i in range(0,number):
gamestr += Generate()
first = True
guessstr = ""
t = 0
while (guessstr != gamestr)or(first == True):
guessstr = input('请输入你的猜测:')
first = False
break_flag = Errordetector(guessstr)
if break_flag:
continue
t += 1
ATC = ALLTRUECALI(guessstr, number)
HTC = HALFTRUECALI(guessstr, number, ATC)
fault_calibrate(guessstr, ATC, HTC)
print('恭喜您,共耗费%d次机会猜测成功!'%(t))
if __name__=='__main__':
main()
过程BUG汇总笔记
- 变量名太乱了,导致最早调用错误
- 函数体内想要改变全局变量需要声明global
- random.randint()函数的取值是闭区间,与range()左闭右开不同
总结
初学Python,至少能玩!但是函数用的满僵的,写的也不好看,望大佬斧正 :3