Тема была: «Реализовать ИИ, который сможет самостоятельно играть в головоломку, используя алгоритм слепого поиска и алгоритм эвристического поиска».
/>Требуемый язык программирования — Python. Если я и мои друзья будем использовать другие языки, оценка нашего проекта снизится вдвое.
В качестве игры мы выбираем Minesweeper, а для слепого поиска — DFS.
Это наш код для DFS. :
Код: Выделить всё
from memory_profiler import profile
import tkinter as tk
from tkinter.messagebox import showinfo, showerror
import time
class solution:
def __init__(self, matrix, last_flag = None):
self.size = len(matrix)
self.matrix = matrix
self.last_flag = last_flag
self.list_flag = []
list_cl = []
for i in range(self.size):
for j in range(self.size):
if matrix[i][j] == -1 or matrix[i][j] == -2:
list_cl += [(i,j)]
self.list_close = list_cl
def print_matrix(self):
for row in self.matrix:
for element in row:
print(element, end=' ')
print()
def place_flag(self):
rf,cf = (0,0)
if self.last_flag == None:
rf,cf = self.list_close[0]
else:
for i in range(len(self.list_close)-1):
if self.last_flag == self.list_close[i]:
rf,cf = self.list_close[i+1]
break
self.matrix[rf][cf] = -2
self.list_flag += [(rf,cf)]
self.last_flag = (rf,cf)
def replace_flag(self):
if self.last_flag == self.list_close[-1]:
r,c = self.last_flag
self.matrix[r][c] = -1
self.list_flag = self.list_flag[:-1]
self.last_flag = self.list_flag[-1]
self.replace_flag()
else:
r,c = self.last_flag
self.matrix[r][c] = -1
self.list_flag = self.list_flag[:-1]
for i in range(len(self.list_close)-1):
if self.last_flag == self.list_close[i]:
rf,cf = self.list_close[i+1]
self.matrix[rf][cf] = -2
self.last_flag = (rf,cf)
self.list_flag += [(rf,cf)]
def next_stage(self):
if self.last_flag == None:
is_flag_valid = True
else:
is_flag_valid = self.check_valid_flag(self.last_flag)
if is_flag_valid == True:
self.place_flag()
else:
self.replace_flag()
def get_arround_cell(self, cell):
r,c = cell
list_temp = [(r-1,c),(r+1,c),(r,c-1),(r,c+1),(r-1,c+1),(r-1,c-1),(r+1,c+1),(r+1,c-1),]
list = [i for i in list_temp if i[1]>=0 and i[0]>=0 and i[1]=0:
if self.compare_value_with_num_flag(cell) > 0:
return False
return True
def check_end(self):
for i in range(self.size):
for j in range(self.size):
if self.matrix[i][j] >=0:
val = self.compare_value_with_num_flag((i,j))
if val == -1 or val == 1:
return False
return True
def create_matrix(self):
rows = len(self.matrix)
cols = len(self.matrix[0])
new_matrix = []
for i in range(0,self.size):
new_matrix += [[]]
for j in range(0,self.size):
if self.matrix[i][j] == -1 :
new_matrix[i] += " "
elif self.matrix[i][j] == -2:
new_matrix[i] += '🚩'
else:
new_matrix[i] += str(self.matrix[i][j])
for i in range(rows):
for j in range(cols):
label = tk.Label(window, text=str(new_matrix[i][j]), borderwidth=1, relief="solid", width=8, height=3)
label.grid(row=i, column=j)
update_button = tk.Button(window, text="Next Step", command=self.update_matrix)
update_button.grid(row=self.size + 1, columnspan=self.size)
end_button = tk.Button(window, text="End", command=self.end)
end_button.grid(row=self.size + 2, columnspan=self.size)
def end(self):
isFinish = False
while isFinish == False:
self.next_stage()
isFinish = self.check_end()
self.end_matrix()
def update_matrix(self):
self.next_stage()
finish = self.check_end()
if finish == True:
self.end_matrix()
return
for widget in window.winfo_children():
widget.grid_forget()
self.create_matrix()
def end_matrix(self):
rows = len(self.matrix)
cols = len(self.matrix[0])
new_matrix = []
for i in range(0,self.size):
new_matrix += [[]]
for j in range(0,self.size):
if self.matrix[i][j] == -1 or self.matrix[i][j] == -3:
new_matrix[i] += " "
elif self.matrix[i][j] == -2:
new_matrix[i] += '💣'
else:
new_matrix[i] += str(self.matrix[i][j])
for widget in window.winfo_children():
widget.grid_forget()
for i in range(rows):
for j in range(cols):
label = tk.Label(window, text=str(new_matrix[i][j]), borderwidth=1, relief="solid", width=8, height=3)
label.grid(row=i, column=j)
def emp_cell_0(self, cell):
list_arround = self.get_arround_cell(cell)
list_arround = [i for i in list_arround if self.matrix[i[0]][i[1]] == -1]
for i in list_arround:
self.matrix[i[0]][i[1]] = -3
def DFS(self):
global window
window = tk.Tk()
self.create_matrix()
window.mainloop()
grid1 = [
[-1, 1, 2, -1, -1, 2, -1],
[2, -1, -1, 3, 3, 3, -1],
[2, -1, 3, 2, -1, -1, 1],
[1, -1, -1, 4, -1, -1, 0],
[1, -1, -1, 4, -1, -1, -1],
[1, -1, -1, -1, -1, -1, 2],
[-1, -1, 1, -1, -1, 3, -1],
]
sl = solution(grid1, None)
sl.DFS()
Код: Выделить всё
python3
Подробнее здесь: [url]https://stackoverflow.com/questions/78361080/i-tryna-run-this-python-file-to-let-a-minesweeper-game-solves-itself-but-it-didn[/url]