Files
Litcraft_Python_B/menti_words.py
2023-07-26 16:10:47 +02:00

116 lines
3.8 KiB
Python

import cv2 as cv
import numpy as np
import pydirectinput
from utils import mse
from game_base_class import GameBase
import random
GREEN = 1
YELLOW = 2
RED = 3
BLUE = 4
ORANGE = 5
class MentiWords(GameBase):
def __init__(self, overlay):
super().__init__(overlay)
self.observation = np.zeros((9, 9), dtype=int)
self.colors = [1, 2, 3, 4, 5, 6, 7, 8, 9]
self.offset_left = 1080
self.offset_down = 870
self.sd_reset_board = cv.imread("control_elements/sodoku_reset_button.jpg", cv.IMREAD_COLOR)
self.needles = {'E': cv.imread("menti_words/e.jpg", cv.IMREAD_COLOR),
'H': cv.imread("menti_words/h.jpg", cv.IMREAD_COLOR),
'O': cv.imread("menti_words/o.jpg", cv.IMREAD_COLOR),
'R': cv.imread("menti_words/r.jpg", cv.IMREAD_COLOR),
'T': cv.imread("menti_words/t.jpg", cv.IMREAD_COLOR)
}
self.current_letters = []
self.letter_coords = {}
with open("menti_dic") as file:
self.word_list = [line.rstrip() for line in file]
def reset_lists(self):
self.current_letters = []
self.letter_coords = {}
def assess_playfield_and_make_move(self):
self.reset_lists()
self.get_current_board_state()
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
matches = self.possible_words(self.word_list, self.current_letters)
matches.sort()
new_matches = list(map(list,matches))
for letter_list in new_matches:
self.type_word_into_ui(letter_list)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
def type_word_into_ui(self, letters):
for letter in letters:
pydirectinput.moveTo(self.letter_coords[letter][0] + self.offset_left, self.letter_coords[letter][1] + self.offset_down)
pydirectinput.mouseDown()
w = random.randint(25, 50)
cv.waitKey(100 + w)
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
pydirectinput.mouseUp()
cv.waitKey(400)
def get_current_board_state(self):
screenshot = cv.imread("menti_words/screenshot.jpg")
#screenshot = self.capture_window.get_screenshot()
screenshot = screenshot[870:1240, 1080:1480]
#cv.imshow("screenshot", screenshot)
#cv.waitKey(150)
#continue
for needle_key in self.needles.keys():
# gray_needle = cv.cvtColor(self.needles[needle_key], cv.COLOR_BGR2GRAY)
# thresh_needle = cv.threshold(gray_needle, 0, 255, cv.THRESH_BINARY_INV + cv.THRESH_OTSU)[1]
rectangles = self.vision_stun.find(screenshot, self.needles[needle_key], 0.85, 56)
if len(rectangles) == 0:
continue
points = self.vision_stun.get_click_points(rectangles)
self.current_letters.append(needle_key)
self.letter_coords[needle_key] = points[0]
if self.overlay.run_mode == 'stopped' or self.overlay.run_mode == 'paused':
return
def possible_words(self, lwords, charSet):
lst = []
for word in lwords:
if len(word) <= 2:
continue
flag = 1
chars = self.charCount(word)
for key in chars:
if key not in charSet:
flag = 0
else:
if charSet.count(key) != chars[key]:
flag = 0
if flag == 1:
lst.append(word)
#print(word)
return list(set(lst))
def charCount(self, word):
dict = {}
for i in word:
dict[i] = dict.get(i, 0) + 1
return dict