代码写得很烂,有兴趣的人可以跑一跑:
# /usr/bin/env python
# -*- encoding=utf-8 -*-
import random
from itertools import permutations, combinations
class Guess3():
def __init__(self):
self.WIN = "4A0B"
self.LENGTH = 4
self.POOL = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
self.record = []
self.stair = -1
self.ai_memory = list(self.__gen_all_result_set())
self.WIN_NUMBER = self.__gen_random_number()
# 程序开始时调用,生成随机数
def __gen_random_number(self):
result = list(self.__gen_all_result_set())
ran_value = random.randrange(len(result))
result1 = list(result[ran_value])
for i in range(len(result1)):
result1[i] = str(result1[i])
return ''.join(result1)
# 返回所有组合的迭代器
def __gen_all_result_set(self):
return permutations(self.POOL, 4)
# 转换嵌套的列表为元组
def __changeListToTuple(self, l1=[]):
for i in range(len(l1)):
l1[i] = tuple(l1[i])
return l1
# 转换list中字符串元素为数字元素(没有健壮性)
def __str_to_int(self, list1):
for i in range(len(list1)):
list1[i] = eval(list1[i])
return list1
# 去除list1中的list2元素(没有健壮性)
def __gen_new_list(self, list1, list2):
for i in list2:
list1.remove(i)
return list1
# 根据输入的4位数字和答案返回对应的结果集
def gen_new_pool(self, number, index_a, index_b):
pool_orgin = [1, 2, 3, 4, 5, 6, 7, 8, 9, 0]
# 根据传入的Number,组成新的NUMBERlist,用于组合新的number
pool_number = list(number)
pool_number = self.__str_to_int(pool_number)
# 结合传入的NUMBER,与0-9组成的数组取补集
pool_orgin_running = self.__gen_new_list(pool_orgin, pool_number)
# 控制下标
index_model = [0, 1, 2, 3]
# 参与组合返回的数字
result_null = ['', '', '', '']
# 将程序生成的数组放入result中,形成二位数组。最终返回result
result = []
# 0A0B-0A4B生成的结果集与剩余的结果集进行组合时,会非法形成空集,导致Bug
if index_a == 0:
if index_b == 0:
result_list = list(permutations(pool_orgin_running, 4))
result = result_list
if index_b == 1:
result1 = []
result_pack1 = list(combinations(pool_orgin_running, 3))
result_pack2 = list(combinations(pool_number, 1))
# print("result_pack1",result_pack1)
# print("result_pack2", result_pack2)
for i in range(len(result_pack1)):
for j in range(len(result_pack2)):
temp = (list(result_pack1[i]) + list(result_pack2[j]))
temp_1 = list(permutations(temp, 4))
# print("temp:",temp)
# print("temp_1:", temp_1)
for m in range(len(temp_1)):
result1.append(list(temp_1[m]))
result = result1
if index_b == 2:
result2 = []
result_pack1 = list(combinations(pool_orgin_running, 2))
result_pack2 = list(combinations(pool_number, 2))
# print("result_pack1",result_pack1)
# print("result_pack2", result_pack2)
for i in range(len(result_pack1)):
for j in range(len(result_pack2)):
temp = (list(result_pack1[i]) + list(result_pack2[j]))
temp_1 = list(permutations(temp, 4))
# print("temp:",temp)
# print("temp_1:", temp_1)
for m in range(len(temp_1)):
result2.append(list(temp_1[m]))
result = result2
if index_b == 3:
result3 = []
result_pack1 = list(combinations(pool_orgin_running, 1))
result_pack2 = list(combinations(pool_number, 3))
# print("result_pack1",result_pack1)
# print("result_pack2", result_pack2)
for i in range(len(result_pack1)):
for j in range(len(result_pack2)):
temp = (list(result_pack1[i]) + list(result_pack2[j]))
temp_1 = list(permutations(temp, 4))
# print("temp:", temp)
# print("temp_1:", temp_1)
for m in range(len(temp_1)):
result3.append(list(temp_1[m]))
result = result3
if index_b == 4:
result4 = []
result_pack2 = list(permutations(pool_number, 4))
for m in range(len(result_pack2)):
result4.append(list(result_pack2[m]))
# print(result4)
result = result4
elif index_a == 1:
for i in range(4):
result_orgin = pool_number.copy()
result1 = result_null.copy() # ['', '', '', '']
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a1_index = index_model.copy() # [0, 1, 2, 3]
first = a1_index.pop(i)
result1[first] = result_orgin.pop(first)
# print("result1",result1)
if index_b == 0:
for m in range(6):
a1_index1 = a1_index.copy()
second = a1_index1.pop()
bl_list1 = pool_orgin_running.copy()
result2 = result1.copy()
result2[second] = bl_list1.pop(m)
for n in range(5):
a1_index2 = a1_index1.copy()
third = a1_index2.pop()
result3 = result2.copy()
bl_list2 = bl_list1.copy()
result3[third] = bl_list2.pop(n)
for h in range(4):
a1_index3 = a1_index2.copy()
fourth = a1_index3.pop()
result4 = result3.copy()
bl_list3 = bl_list2.copy()
result4[fourth] = bl_list3.pop(h)
result.append(result4)
# print(result4)
if index_b == 1:
result_orgin2 = result_orgin.copy()
for j in range(3):
index2 = a1_index.copy()
second = index2.pop(j)
result2 = result1.copy()
result2[second] = result_orgin2.pop(2-j)
# print(result2)
for k in range(2):
index3 = index2.copy()
third = index3.pop(k)
for n in range(6):
result3 = result2.copy()
result_orgin3 = pool_orgin_running.copy()
result3[third] = result_orgin3.pop(n)
# print(result3)
for m in range(5):
index4 = index3.copy()
fourth = index4.pop()
result4 = result3.copy()
result_orgin4 = result_orgin3.copy()
result4[fourth] = result_orgin4.pop(m)
if index_b == 2:
for j in range(0,3):
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a1_index2 = a1_index.copy() # [0, 1, 2]
second = a1_index2.pop(j)
# 这是需要填充的数组,最终组合成4元素数组
result2 = result1.copy()
# 这是用于取数字的数组,从这个数组取元素给需要填充的数组
# 填充数组
result_orgin2 = result_orgin.copy()
result2[second] = result_orgin2.pop(2-j)
# print(result2)
for k in range(2):
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a1_index3 = a1_index2.copy() # [0, 1]
third = a1_index3.pop(k) # [0]
result_orgin3 = result_orgin2.copy()
result3 = result2.copy()
result3[third] = result_orgin3.pop(1-k)
# print(result3)
for l in range(6):
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a1_index4 = a1_index3.copy() # [0]
fourth = a1_index4.pop()
result4 = result3.copy()
result_orgin4 = pool_orgin_running.copy()
result4[fourth] = result_orgin4.pop(l)
# print(result4)
result.append(result4)
# print(result.__len__())
if index_b == 3:
for j in range(3):
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a1_index2 = a1_index.copy() # [0, 1, 2]
second = a1_index2.pop() # [0, 1]
# 复制被填充的数组
result2 = result1.copy()
# 复制数据源
result_orgin2 = result_orgin.copy()
result2[second] = result_orgin2.pop(j)
# print(result2)
for k in range(2):
a1_index3 = a1_index2.copy() # [0, 1]
third = a1_index3.pop() # [0]
result_orgin3 = result_orgin2.copy()
result3 = result2.copy()
result3[third] = result_orgin3.pop(k)
# print(result3)
for l in range(1):
a1_index4 = a1_index3.copy() # [0, 1]
fourth = a1_index4.pop() # [0]
result_orgin4 = result_orgin3.copy()
result4 = result3.copy()
result4[fourth] = result_orgin4.pop(l)
# print(result4)
result.append(result4)
elif index_a == 2:
for i in range(4):
result_orgin = pool_number.copy()
result1 = result_null.copy() # ['', '', '', '']
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a2_index = index_model.copy() # [0, 1, 2, 3]
first = a2_index.pop(i) # [0, 1, 2]
result1[first] = result_orgin.pop(first)
# print(result1)
for j in range(3):
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a2_index2 = a2_index.copy() # [0, 1, 2]
second = a2_index2.pop(j) # [0, 1]
# 复制被填充的数组
result2 = result1.copy()
# 复制数据源
result_orgin2 = result_orgin.copy()
result2[second] = result_orgin2.pop(j)
# print(result2)
if index_b == 0:
for m in range(6):
a2_index3 = a2_index2.copy()
third = a2_index3.pop()
result_orgin3 = pool_orgin_running.copy()
result3 = result2.copy()
result3[third] = result_orgin3.pop(m)
# print(result3)
for n in range(5):
a2_index4 = a2_index3.copy()
fourth = a2_index4.pop()
result4 = result3.copy()
result_orgin4 = result_orgin3.copy()
result4[fourth] = result_orgin4.pop(n)
# print(result4)
result.append(result4)
if index_b == 1:
for m in range(2):
a2_index3 = a2_index2.copy()
third = a2_index3.pop(m)
result_orgin3 = result_orgin2.copy()
result3 = result2.copy()
result3[third] = result_orgin3.pop(1-m)
# print(result3)
for n in range(6):
a2_index4 = a2_index3.copy()
fourth = a2_index4.pop()
result4 = result3.copy()
result_orgin4 = pool_orgin_running.copy() #复制6元素数组
result4[fourth] = result_orgin4.pop(n)
# print(result4)
result.append(result4)
pass
if index_b == 2:
for m in range(2):
a2_index3 = a2_index2.copy()
third = a2_index3.pop()
result_orgin3 = result_orgin2.copy()
result3 = result2.copy()
result3[third] = result_orgin3.pop(m)
for l in range(1):
a2_index4 = a2_index3.copy()
fourth = a2_index4.pop()
result_orgin4 = result_orgin3.copy()
result4 = result3.copy()
result4[fourth] = result_orgin4.pop(l)
result.append(result4)
# print(result4)
elif index_a == 3:
for i in range(4):
result_orgin = pool_number.copy()
result1 = result_null.copy() # ['', '', '', '']
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a3_index = index_model.copy() # [0, 1, 2, 3]
first = a3_index.pop(i) #[0, 1, 2]
result1[first] = result_orgin.pop(first)
# print(result1)
for j in range(3):
# 控制下标,因为后面要从6个元素的数组中取数字给4元素数字,所以需要控制4元素数组的下标
a3_index2 = a3_index.copy() #[0, 1, 2]
second = a3_index2.pop(j) #[0, 1]
# 复制被填充的数组
result2 = result1.copy()
# 复制数据源
result_orgin2 = result_orgin.copy()
result2[second] = result_orgin2.pop(j)
# print(result2)
for k in range(2):
a3_index3 = a3_index2.copy() #[0, 1]
third = a3_index3.pop(k) #[0]
result_orgin3 = result_orgin2.copy()
result3 = result2.copy()
result3[third] = result_orgin3.pop(k)
# print(result3)
for l in range(6):
a3_index4 = a3_index3.copy()
fourth = a3_index4.pop()
result_orgin4 = pool_orgin_running.copy()
result4 = result3.copy()
result4[fourth] = result_orgin4.pop(l)
result.append(result4)
temp = []
for x in result:
if x not in temp:
temp.append(x)
else:
pass
result = temp
return result
# 判断输入的数字是否有存在重复数字组合
def __repeat(self, number):
Flag = None
temp = list(number)
for i in range(len(temp)):
for j in range(i, len(temp)):
if i != j:
if temp[i] == temp[j]:
return False
else:
Flag = True
return Flag
# 获取用户输入的数字
def __get_user_number(self):
Flag = True
count = 0
try:
while Flag:
number = input("请输入4位没有重复的数:")
temp = list(number)
if eval(number) > 9999:
print("输入的数字太大>>>>>>>>")
elif eval(number) < 1000:
print("输入的数字太小>>>>>>>>")
elif self.__repeat(number):
return number
elif number == '\r':
print("123")
except Exception:
print("输入错误!程序终止>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>")
# 根据输入的数字判断结果
def __logical(self, number):
first = 0
second = 0
for n in range(self.LENGTH):
if number[n] == self.WIN_NUMBER[n]:
first += 1
elif number[n] in self.WIN_NUMBER:
second += 1
else:
pass
result = "%sA%sB" % (first, second)
return result
# AI的大脑
def __ai_think(self, number, answer):
result = []
for i in range(len(self.ai_memory)):
self.ai_memory[i] = list(self.ai_memory[i])
# 根据答案计算可能的集合
self.temp = self.gen_new_pool(number,eval(answer[0]),eval(answer[2]))
# print("上个得到的AI集合:",self.ai_memory.__len__())
# print("上个结果的集合:",self.temp.__len__())
# 与历史结果集进行比较,生成最新结果集
self.ai_memory = [var for var in self.temp if var in self.ai_memory]
#将数字从数组组成字符串
for i in self.ai_memory:
temp = ""
for j in i:
temp += str(j)
result.append(temp)
# 去除已经猜测过的结果
for j in self.record:
if j in result:
result.remove(j)
temp2 = []
for j in result:
if j not in temp2:
temp2.append(j)
result = temp2
# print("result:", result.__len__(),result)
# 从result数组中取出一个随机元素作为作为AI计算结果返回
if result == []:
# 修复未知BUG,重置AI存储库(0A开头的结果会导致Bug,懒得修复了,该BUG经过修复后只会延长游戏时间,哈哈)
self.ai_memory = list(self.__gen_all_result_set())
# 出现0结果集的BUG时,返回一个已输入的结果作为答案
return self.record[random.randrange(len(self.record))]
else:
result = result[random.randrange(result.__len__())]
return result
# 游戏开始
def start(self):
print("作弊:", self.WIN_NUMBER)
win_flag = True
while win_flag:
print("-------------------用户回合--------------------")
user_guess_number = self.__get_user_number()
print("用户猜测的数字是:", user_guess_number)
user_guess_result = self.__logical(user_guess_number)
print("结果是:", user_guess_result)
if user_guess_number not in self.record:
self.record.append(user_guess_number)
if user_guess_result == "4A0B":
print("你赢了!!!!!")
break
print("-------------------AI回合--------------------")
ai_guess_number = self.__ai_think(user_guess_number, user_guess_result)
ai_guess_result = self.__logical(ai_guess_number)
print("AI猜测的数字是:", ai_guess_number)
print("结果是:", ai_guess_result)
if ai_guess_number not in self.record:
self.record.append(ai_guess_number)
if ai_guess_result == "4A0B":
print("你输了!!!!!")
break
else:
self.__ai_think(ai_guess_number, ai_guess_result)
a = Guess3()
a.start()