Начало разработки курсового проекта
This commit is contained in:
45
code_of_future/part1_basic/final_test/README.md
Normal file
45
code_of_future/part1_basic/final_test/README.md
Normal file
@@ -0,0 +1,45 @@
|
||||
Итоговый проект к модулю
|
||||
|
||||
Цель:
|
||||
Написать свою игру “кликер” и воспользоваться AHK для автоматизации действия в игре
|
||||
|
||||
Что нужно сделать:
|
||||
|
||||
|
||||
Создать файл kliker.py и реализовать в нем следующие функции:
|
||||
|
||||
Вывести начальное количество рублей.
|
||||
Добавить картинку png при нажатии на которую будет увеличиваться количество рублей.
|
||||
Добавить счетчик времени который будет считать время с начала запуска программы.
|
||||
Добавить кнопку “Сброс” которая будет сбрасываться счетчик и таймер времени.
|
||||
Изменить цвет окна.
|
||||
Кнопка “Сброс” внизу экрана, картинка для нажатия в центре, счетчик денег вверху, таймер с левой стороны.
|
||||
|
||||
|
||||
Создать файл mouse.ahk и реализовать в нем следующие функции:
|
||||
|
||||
Скрипт запускается и останавливается при нажатии на клавишу Numpad1.
|
||||
Реализовать клик мышки при включении скрипта, мышь будет кликать до повторного нажатия Numpad1.
|
||||
|
||||
|
||||
Результат:
|
||||
|
||||
Рабочий кликер с автоматическим нажатием кнопки.
|
||||
|
||||
|
||||
|
||||
Советы и рекомендации по выполнению дз:
|
||||
Для выполнения задания, используйте полученные знания и навыки из предыдущих уроков.
|
||||
|
||||
|
||||
Критерии оценивания:
|
||||
|
||||
К1 - Проект создан и запускается
|
||||
|
||||
К2 - Проект создан и не полностью выполняется хотя бы одна задача из поставленных
|
||||
|
||||
К3 - Проект создан и выполняется одна задача из поставленных, без ошибок и сбоев
|
||||
|
||||
К4 - Проект создан и выполняется большая часть задач из поставленных, с небольшими ошибкам
|
||||
|
||||
К5 - Проект создан и выполняются все задач из поставленных, без сбоев и ошибок
|
182
code_of_future/part1_basic/final_test/app.py
Normal file
182
code_of_future/part1_basic/final_test/app.py
Normal file
@@ -0,0 +1,182 @@
|
||||
import os
|
||||
import time
|
||||
from pathlib import Path
|
||||
from subprocess import Popen
|
||||
from tkinter import (
|
||||
BOTH,
|
||||
LEFT,
|
||||
RAISED,
|
||||
RIGHT,
|
||||
TOP,
|
||||
Button,
|
||||
Frame,
|
||||
Label,
|
||||
PhotoImage,
|
||||
StringVar,
|
||||
Tk,
|
||||
mainloop,
|
||||
messagebox,
|
||||
)
|
||||
|
||||
|
||||
class ClickerGame:
|
||||
"""Перед запуском проверьте и исправьте место установки AHK
|
||||
Св-во класса AHK_PATH должно содержать полный путь до запускаемого файла,
|
||||
если приложение установлено не в папки по умолчанию
|
||||
"""
|
||||
|
||||
AHK_PATH = "<Введите сюда путь до приложения AutoHotKey>"
|
||||
|
||||
def __init__(self):
|
||||
# Поиск места установки AutoHotKey
|
||||
self.is_ahk_path_set = False
|
||||
if os.path.isfile(
|
||||
app_exe := os.path.join(
|
||||
Path.home(),
|
||||
"AppData",
|
||||
"Local",
|
||||
"Programs",
|
||||
"AutoHotkey",
|
||||
"UX",
|
||||
"AutoHotkeyUX.exe",
|
||||
)
|
||||
):
|
||||
self.AHK_PATH = app_exe
|
||||
self.is_ahk_path_set = True
|
||||
elif os.path.isfile(
|
||||
app_exe := os.path.join(
|
||||
r"c:\\", "Program Files", "AutoHotkey", "UX", "AutoHotkeyUX.exe"
|
||||
)
|
||||
):
|
||||
self.AHK_PATH = app_exe
|
||||
self.is_ahk_path_set = True
|
||||
else:
|
||||
messagebox.showerror(
|
||||
"Can't find AutoHotKey",
|
||||
"""Пропишите AHK_PATH До этого, автокликер работать не будет""",
|
||||
)
|
||||
|
||||
self.__root = Tk()
|
||||
self.__root.geometry("500x400")
|
||||
self.__root.minsize(500, 400)
|
||||
self.__root.title("Clicker Game")
|
||||
self.__root.bind("<Key>", self.key)
|
||||
|
||||
self.process = None
|
||||
|
||||
self.ahk_flag = False # Флаг запущен ли скрипт кликера
|
||||
self.frame = Frame(self.__root, relief=RAISED, borderwidth=5, bg="green")
|
||||
self.frame.pack(fill=BOTH, expand=True, padx=5, pady=5)
|
||||
self.label = Label(
|
||||
self.frame, text="Clicker Game", font=("Arial", 25), bg="green"
|
||||
)
|
||||
self.label.pack(side=TOP)
|
||||
|
||||
self.score = 0
|
||||
self.message = StringVar()
|
||||
self.message.set(f"Ваш счет: {self.score}")
|
||||
self.label2 = Label(
|
||||
self.frame, textvariable=self.message, font=("Arial", 15), bg="green"
|
||||
)
|
||||
self.label2.pack(side=TOP)
|
||||
|
||||
self.timer = 0
|
||||
self.start_time = time.time()
|
||||
self.timer_message = StringVar()
|
||||
self.timer_update()
|
||||
|
||||
self.label3 = Label(
|
||||
self.frame, textvariable=self.timer_message, font=("Arial", 12), bg="green"
|
||||
)
|
||||
self.label3.pack(side=LEFT)
|
||||
|
||||
self.img = PhotoImage(file=os.path.join(os.curdir, "img.png"))
|
||||
self.clicker = Button(
|
||||
self.frame, text="clickme", image=self.img, command=self.increment
|
||||
)
|
||||
self.clicker.place(relx=0.5, rely=0.5, anchor="center")
|
||||
|
||||
self.ahk_button = Button(
|
||||
self.__root, text="Запустить AHK", command=self.switcher_ahk
|
||||
)
|
||||
self.ahk_button.pack(side=LEFT, padx=10, pady=10)
|
||||
|
||||
self.close_button = Button(self.__root, text="Выход", command=self.quit)
|
||||
self.close_button.pack(side=RIGHT, padx=10, pady=10)
|
||||
|
||||
self.ahk_button = Button(
|
||||
self.__root, text="Сброс игры", command=self.clicker_reset
|
||||
)
|
||||
self.ahk_button.pack(side=RIGHT, padx=10, pady=10)
|
||||
|
||||
mainloop()
|
||||
|
||||
def __del__(self):
|
||||
"""Завершаем поток АНК ели он запущен при
|
||||
уничтожении игры.
|
||||
Можно было и в метод quit разместить, но
|
||||
правильнее добавить деструктор обекта"""
|
||||
if self.ahk_flag:
|
||||
self.switcher_ahk()
|
||||
|
||||
def key(self, event):
|
||||
"""Отлавливаем все event в игре, в т.ч и
|
||||
нажатия клавиш клавиатуры. Обрабатываем
|
||||
интересующие нас"""
|
||||
if event.keycode == 97:
|
||||
# Переключаем статус АНК по numpad1
|
||||
self.switcher_ahk()
|
||||
|
||||
if event.keycode == 73 or event.keycode == 17:
|
||||
# Инкремент счетчика по хот кею Ctrl-i или Ctrl-ш в RU раскладке
|
||||
self.increment()
|
||||
|
||||
def increment(self, keys=None):
|
||||
if keys is not None:
|
||||
"""Данный блок необходим, чтоб среда не ругалась на неиспользуемый
|
||||
аргумент keys. При связывании горячей клавиши методом bind, сюда
|
||||
передается инфо о нажатой комбинации. Тут она мне не нужна, поэтому
|
||||
ставим тупо заглушку"""
|
||||
pass
|
||||
|
||||
self.score += 1
|
||||
self.message.set(f"Ваш счет: {self.score}")
|
||||
|
||||
def switcher_ahk(self):
|
||||
"""Переключаем состояние кликера(вкл/выкл),
|
||||
если путь к нему установлен или выводим
|
||||
сообщение с предупреждением"""
|
||||
if not self.is_ahk_path_set:
|
||||
messagebox.showerror(
|
||||
"Can't find AutoHotKey",
|
||||
"""Не могу запустить автокликер. Не указан путь к AutoHotKey""",
|
||||
)
|
||||
elif self.ahk_flag:
|
||||
self.ahk_flag = False
|
||||
self.process.kill()
|
||||
else:
|
||||
self.ahk_flag = True
|
||||
self.process = Popen([self.AHK_PATH, "clicker.ahk"])
|
||||
|
||||
def timer_update(self):
|
||||
self.timer = int(time.time() - self.start_time)
|
||||
self.timer_message.set(
|
||||
f"Время игры:\n{self.timer // 60}мин. {self.timer % 60} сек."
|
||||
)
|
||||
self.__root.after(1000, self.timer_update)
|
||||
|
||||
def clicker_reset(self):
|
||||
if self.ahk_flag:
|
||||
self.switcher_ahk()
|
||||
self.score = 0
|
||||
self.message.set(f"Ваш счет: {self.score}")
|
||||
self.timer = 0
|
||||
self.start_time = time.time()
|
||||
self.timer_update()
|
||||
|
||||
def quit(self):
|
||||
self.__root.destroy()
|
||||
|
||||
|
||||
if __name__ == "__main__":
|
||||
game = ClickerGame()
|
10
code_of_future/part1_basic/final_test/clicker.ahk
Normal file
10
code_of_future/part1_basic/final_test/clicker.ahk
Normal file
@@ -0,0 +1,10 @@
|
||||
#Requires AutoHotkey v2.0
|
||||
|
||||
SetTimer Click, 200
|
||||
|
||||
Click()
|
||||
{
|
||||
if WinExist("Clicker Game")
|
||||
WinActivate ;
|
||||
Send "^i"
|
||||
}
|
BIN
code_of_future/part1_basic/final_test/img.png
Normal file
BIN
code_of_future/part1_basic/final_test/img.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.3 KiB |
Reference in New Issue
Block a user