• XSS.stack #1 – первый литературный журнал от юзеров форума

Хэкерская игра в стиле 90-00х в консольном исполнении (PyQT6)

rand

CooL-Lamer
Эксперт
Регистрация
24.05.2023
Сообщения
581
Реакции
1 152
Депозит
0.07 Ł и др.
Написал: rand
Специально для: xss.pro
Всем привет, тут недавно захотелось вспомнить молодость и игры в стиле 90, вот на петухоне порция говнокода, мож кому и зайдет такое. =)

Немного скринов в студию:

1.jpg

1734761142669.jpeg

1734761149087.jpeg


Для запуска требуется: Python 3.10
Bash:
pip install PyQt6

Код:
Python:
import sys
import random
from PyQt6.QtWidgets import (QApplication, QWidget, QLabel, QPushButton, QVBoxLayout,
                             QLineEdit, QTextEdit, QGridLayout, QProgressBar)
from PyQt6.QtCore import Qt, QTimer
from PyQt6.QtGui import QFont, QColor


# Определение класса HackerGame
class HackerGame(QWidget):
    COLORS = {
        "success": "#00ff00",
        "error": "#ff0000",
        "info": "#ffffff",
        "warning": "#ffff00",
        "event": "#ff8c00",
    }

    def __init__(self):
        super().__init__()
        self.software_level = 1
        self.target_ip = self.generate_ip()
        self.password = self.generate_password()
        self.hacks_remaining = 3
        self.bitcoin_balance = 1000
        self.btc_price = 1000  # Начальная цена BTC

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.passive_income)
        self.timer.start(5000)

        self.market_timer = QTimer(self)
        self.market_timer.timeout.connect(self.update_market)
        self.market_timer.start(10000)

        self.btc_price_timer = QTimer(self)
        self.btc_price_timer.timeout.connect(self.update_btc_price)
        self.btc_price_timer.start(60000)


        if hasattr(self, "passive_income"):
            self.timer = QTimer(self)
            self.timer.timeout.connect(self.passive_income)
            self.timer.start(5000)
        else:
            raise AttributeError("Метод passive_income не определен.")

            # Второй таймер
            self.market_timer = QTimer(self)
            self.market_timer.timeout.connect(self.update_market)
            self.market_timer.start(10000)

            self.initUI()

        # Новые параметры
        self.reputation = 0
        self.skills = {
            "взлом": 1,
            "криптография": 1,
            "сетевая защита": 1,
            "социальная инженерия": 1
        }
        self.equipment = {
            "процессор": {"уровень": 1, "название": "Intel 386"},
            "память": {"уровень": 1, "название": "1 MB RAM"},
            "сеть": {"уровень": 1, "название": "Модем 14.4k"}
        }
        self.achievements = set()
        self.current_mission = None
        self.mission_progress = 0

        # Торговая площадка
        self.market = {
            "софт": {
                "брутфорс": {"цена": 1000, "уровень": 1},
                "антивирус": {"цена": 800, "уровень": 1},
                "файрвол": {"цена": 1200, "уровень": 1}
            },
            "железо": {
                "процессор": {"цена": 2000, "базовый_множитель": 1.5},
                "память": {"цена": 1500, "базовый_множитель": 1.3},
                "сеть": {"цена": 1800, "базовый_множитель": 1.4}
            }
        }

        # Список доступных миссий
        self.available_missions = [
            {
                "название": "Взлом банкомата",
                "сложность": 1,
                "награда": 500,
                "репутация": 10,
                "требования": {"взлом": 2}
            },
            {
                "название": "Взлом соцсети",
                "сложность": 2,
                "награда": 1000,
                "репутация": 20,
                "требования": {"социальная инженерия": 2}
            },
            {
                "название": "Корпоративный шпионаж",
                "сложность": 3,
                "награда": 2000,
                "репутация": 30,
                "требования": {"криптография": 3}
            }
        ]

        self.timer = QTimer(self)
        self.timer.timeout.connect(self.passive_income)
        self.timer.start(5000)

        self.market_timer = QTimer(self)
        self.market_timer.timeout.connect(self.update_market)
        self.market_timer.start(10000)

        self.initUI()

    def initUI(self):
        self.setStyleSheet("""
            QWidget {
                background-color: black;
                color: #00ff00;
                font-family: 'Courier';
            }
            QTextEdit, QLineEdit {
                border: 1px solid #00ff00;
                padding: 5px;
            }
            QProgressBar {
                border: 1px solid #00ff00;
                text-align: center;
            }
            QProgressBar::chunk {
                background-color: #00ff00;
            }
        """)

        layout = QVBoxLayout()

        # Статус бар
        status_layout = QGridLayout()
        self.status_labels = {
            "bitcoin": QLabel(f"BTC: {self.bitcoin_balance}"),
            "reputation": QLabel(f"REP: {self.reputation}"),
            "level": QLabel(f"LVL: {self.software_level}")
        }

        for i, (key, label) in enumerate(self.status_labels.items()):
            status_layout.addWidget(label, 0, i)

        layout.addLayout(status_layout)

        # Основной вывод
        self.output = QTextEdit()
        self.output.setReadOnly(True)
        layout.addWidget(self.output)

        # Прогресс текущей миссии
        self.mission_progress_bar = QProgressBar()
        self.mission_progress_bar.setVisible(False)
        layout.addWidget(self.mission_progress_bar)

        # Ввод команд
        self.command_input = QLineEdit()
        self.command_input.returnPressed.connect(self.process_command)
        layout.addWidget(self.command_input)

        self.setLayout(layout)
        self.setWindowTitle("H4CK3R 2.0")
        self.setMinimumSize(800, 600)

        self.print_welcome_message()
        self.show()


    def print_welcome_message(self):
        welcome = """
╔══════════════════════════════════════════╗
║           WELCOME TO H4CK3R 2.0          ║
║------------------------------------------║
║  Доступные команды:                      ║
║  > hack [пароль] - попытка взлома        ║
║  > market - торговая площадка            ║
║  > upgrade [навык] - прокачка навыка     ║
║  > missions - список доступных миссий     ║
║  > start [номер] - начать миссию         ║
║  > status - показать статус              ║
║  > help - показать это сообщение         ║
╚══════════════════════════════════════════╝
"""
        self.print_message(welcome)
        self.print_message(f"Целевой IP: {self.target_ip}")

    def passive_income(self):
        base_income = self.software_level * 10
        skill_bonus = sum(self.skills.values()) * 5
        equipment_bonus = sum(item["уровень"] * 10 for item in self.equipment.values())

        total_income = base_income + skill_bonus + equipment_bonus
        self.bitcoin_balance += total_income
        self.update_status()

        if random.random() < 0.1:  # 10% шанс случайного события
            self.random_event()

    def random_event(self):
        events = [
            ("Вы нашли уязвимость в системе! +500 BTC", lambda: self.add_bitcoin(500)),
            ("Антивирус засек вашу активность! -200 BTC", lambda: self.add_bitcoin(-200)),
            ("Хакерское сообщество оценило ваши навыки! +10 REP", lambda: self.add_reputation(10)),
            ("Случайный сбой в системе! Временное ускорение майнинга!", lambda: self.temporary_boost())
        ]
        event, action = random.choice(events)
        self.print_message(f"[СОБЫТИЕ] {event}")
        action()

    def update_btc_price(self):
        change = random.uniform(-0.05, 0.05)
        self.btc_price = int(self.btc_price * (1 + change))
        self.update_status()

    def update_market(self):
        # Обновление цен на рынке
        for category in self.market.values():
            for item in category.values():
                item["цена"] = int(item["цена"] * random.uniform(0.8, 1.2))

    def process_command(self):
        command = self.command_input.text().lower().split()
        self.command_input.clear()

        if not command:
            return

        commands = {
            "hack": self.hack,
            "market": self.show_market,
            "upgrade": self.upgrade_skill,
            "missions": self.show_missions,
            "start": self.start_mission,
            "status": self.show_status,
            "buy": self.buy_item,
            "help": self.print_welcome_message
        }

        cmd = command[0]
        args = command[1:] if len(command) > 1 else []

        if cmd in commands:
            commands[cmd](*args)
        else:
            self.print_message("Неизвестная команда. Введите 'help' для справки.")

    def hack(self, guess=None):
        if not guess:
            self.print_message("Использование: hack [пароль]")
            return

        hack_power = (self.skills["взлом"] *
                      self.equipment["процессор"]["уровень"] *
                      random.uniform(0.8, 1.2))

        if guess == self.password:
            bitcoin_earned = int(1000 * hack_power)
            reputation_gained = int(10 * hack_power)

            self.bitcoin_balance += bitcoin_earned
            self.reputation += reputation_gained

            self.print_message(f"""
╔══════════════════════════════╗
║      ВЗЛОМ УСПЕШЕН!!!       ║
║-----------------------------|
║ +{bitcoin_earned} BTC                  ║
║ +{reputation_gained} REP                   ║
╚══════════════════════════════╝
            """)

            self.target_ip = self.generate_ip()
            self.password = self.generate_password()
            self.print_message(f"Новый целевой IP: {self.target_ip}")
            self.hacks_remaining = 3

            if random.random() < 0.2:  # 20% шанс получить достижение
                self.award_achievement()
        else:
            self.hacks_remaining -= 1
            self.print_message(f"Взлом не удался! Осталось попыток: {self.hacks_remaining}")

            if self.hacks_remaining == 0:
                self.game_over()

    def show_market(self):
        market_text = """
╔════════════════ ТОРГОВАЯ ПЛОЩАДКА ════════════════╗
║                     СОФТ                          ║
"""
        for name, item in self.market["софт"].items():
            market_text += f"║ {name:.<20} {item['цена']} BTC (Ур.{item['уровень']})║\n"

        market_text += "║                    ЖЕЛЕЗО                         ║\n"
        for name, item in self.market["железо"].items():
            market_text += f"║ {name:.<20} {item['цена']} BTC            ║\n"

        market_text += """
║ Для покупки введите: buy [категория] [название]   ║
╚════════════════════════════════════════════════════╝
"""
        self.print_message(market_text)

    def buy_item(self, category=None, item_name=None):
        if not category or not item_name:
            self.print_message("Использование: buy [софт/железо] [название]")
            return

        if category not in self.market:
            self.print_message("Неверная категория. Используйте 'софт' или 'железо'")
            return

        market_category = self.market[category]
        if item_name not in market_category:
            self.print_message(f"Товар '{item_name}' не найден в категории {category}")
            return

        item = market_category[item_name]
        if self.bitcoin_balance < item["цена"]:
            self.print_message("Недостаточно биткоинов!")
            return

        self.bitcoin_balance -= item["цена"]

        if category == "софт":
            item["уровень"] += 1
            self.print_message(f"Софт '{item_name}' обновлен до уровня {item['уровень']}")
        else:
            self.equipment[item_name]["уровень"] += 1
            self.print_message(f"Железо '{item_name}' улучшено до уровня {self.equipment[item_name]['уровень']}")

        self.update_status()

    def show_missions(self):
        missions_text = """
╔═══════════════ ДОСТУПНЫЕ МИССИИ ═══════════════╗
"""
        for i, mission in enumerate(self.available_missions):
            missions_text += f"""
║ [{i + 1}] {mission['название']}
║     Сложность: {'█' * mission['сложность']}{'░' * (5 - mission['сложность'])}
║     Награда: {mission['награда']} BTC, {mission['репутация']} REP
║     Требования: {', '.join(f'{k}:{v}' for k, v in mission['требования'].items())}
"""
        missions_text += """
║ Для начала миссии введите: start [номер]        ║
╚══════════════════════════════════════════════════╝
"""
        self.print_message(missions_text)

    def start_mission(self, mission_num=None):
        if not mission_num or not mission_num.isdigit():
            self.print_message("Использование: start [номер миссии]")
            return

        mission_idx = int(mission_num) - 1
        if mission_idx < 0 or mission_idx >= len(self.available_missions):
            self.print_message("Неверный номер миссии")
            return

        mission = self.available_missions[mission_idx]

        # Проверка требований
        for skill, level in mission["требования"].items():
            if self.skills[skill] < level:
                self.print_message(f"Недостаточный уровень навыка {skill}!")
                return

        self.current_mission = mission
        self.mission_progress = 0
        self.mission_progress_bar.setVisible(True)
        self.mission_progress_bar.setValue(0)

        # Запускаем таймер выполнения миссии
        self.mission_timer = QTimer(self)
        self.mission_timer.timeout.connect(self.update_mission)
        self.mission_timer.start(1000)

        self.print_message(f"Начата миссия: {mission['название']}")

    def update_mission(self):
        if not self.current_mission:
            return

        self.mission_progress += random.randint(5, 15)
        self.mission_progress_bar.setValue(min(self.mission_progress, 100))

        if self.mission_progress >= 100:
            self.complete_mission()

    def complete_mission(self):
        mission = self.current_mission
        self.bitcoin_balance += mission["награда"]
        self.reputation += mission["репутация"]

        self.print_message(f"""
        ╔══════════════ МИССИЯ ВЫПОЛНЕНА ══════════════╗
        ║ {mission['название']}
        ║ Получено:
        ║   {mission['награда']} BTC
        ║   {mission['репутация']} REP
        ║ Бонус за скорость: +{self.calculate_speed_bonus()} BTC
        ╚═══════════════════════════════════════════════╝
                """)

        self.mission_timer.stop()
        self.mission_progress_bar.setVisible(False)
        self.current_mission = None
        self.update_status()

    def calculate_speed_bonus(self):
        # Бонус зависит от уровня оборудования
        base_bonus = 100
        speed_multiplier = (self.equipment['процессор']['уровень'] * 0.5 +
                            self.equipment['память']['уровень'] * 0.3 +
                            self.equipment['сеть']['уровень'] * 0.2)
        bonus = int(base_bonus * speed_multiplier)
        self.bitcoin_balance += bonus
        return bonus

    def upgrade_skill(self, skill=None):
        if not skill or skill not in self.skills:
            self.print_message("""
        Доступные навыки для прокачки:
        - взлом
        - криптография
        - сетевая_защита
        - социальная_инженерия
                    """)
            return

        cost = self.calculate_skill_upgrade_cost(skill)
        if self.bitcoin_balance < cost:
            self.print_message(f"Недостаточно биткоинов! Требуется: {cost} BTC")
            return

        self.bitcoin_balance -= cost
        self.skills[skill] += 1
        self.print_message(f"""
        ╔══════════ НАВЫК УЛУЧШЕН ══════════╗
        ║ {skill}: {self.skills[skill] - 1}{self.skills[skill]}
        ║ Потрачено: {cost} BTC
        ╚═══════════════════════════════════╝
                """)
        self.update_status()

    def calculate_skill_upgrade_cost(self, skill):
        current_level = self.skills[skill]
        return current_level * 1000

    def show_status(self):
        status_text = f"""
        ╔══════════════ СТАТУС СИСТЕМЫ ══════════════╗
        ║ Баланс: {self.bitcoin_balance} BTC         ║
        ║ Репутация: {self.reputation}               ║
        ║ Текущая цена BTC: {self.btc_price}         ║
        ║                                            ║
        ║ НАВЫКИ:                                    ║
        ╚════════════════════════════════════════════╝
        """
        for skill, level in self.skills.items():
            status_text += f"║ {skill}: {'█' * level}{'░' * (10 - level)} ({level}/10)\n"

        status_text += "\n║ ОБОРУДОВАНИЕ:\n"
        for name, item in self.equipment.items():
            status_text += f"║ {name}: {item['название']} (Ур.{item['уровень']})\n"

        if self.achievements:
            status_text += "\n║ ДОСТИЖЕНИЯ:\n"
            for achievement in self.achievements:
                status_text += f"║ ★ {achievement}\n"

        status_text += "╚═══════════════════════════════════════════╝"
        self.print_message(status_text)

    def award_achievement(self):
        possible_achievements = [
            "Первые шаги: Выполнить первый успешный взлом",
            "Профессионал: Достичь 5 уровня в любом навыке",
            "Железячник: Улучшить все оборудование до 3 уровня",
            "Богач: Накопить 10000 BTC",
            "Легенда: Достичь репутации 1000"
        ]

        # Проверяем условия для каждого достижения
        if len(self.achievements) < len(possible_achievements):
            new_achievement = random.choice(
                [a for a in possible_achievements if a not in self.achievements]
            )
            self.achievements.add(new_achievement)
            self.print_message(f"""
        ╔══════════ НОВОЕ ДОСТИЖЕНИЕ ══════════╗
        ║ ★ {new_achievement}
        ╚═══════════════════════════════════════╝
                    """)

    def add_bitcoin(self, amount):
        self.bitcoin_balance += amount
        self.update_status()

    def add_reputation(self, amount):
        self.reputation += amount
        self.update_status()

    def temporary_boost(self):
        original_interval = self.timer.interval()
        self.timer.setInterval(original_interval // 2)
        QTimer.singleShot(30000, lambda: self.timer.setInterval(original_interval))

    def update_status(self):
        self.status_labels["bitcoin"].setText(f"BTC: {self.bitcoin_balance}")
        self.status_labels["reputation"].setText(f"REP: {self.reputation}")
        self.status_labels["level"].setText(f"LVL: {self.software_level}")

    def game_over(self):
        self.print_message(f"""
        ╔═══════════ GAME OVER ═══════════╗
        ║ Финальный счёт:
        ║ BTC: {self.bitcoin_balance}
        ║ Репутация: {self.reputation}
        ║ Достижений: {len(self.achievements)}
        ╚═════════════════════════════════╝
                """)
        self.command_input.setEnabled(False)

    def print_message(self, message, color="info"):
        self.output.setTextColor(QColor(self.COLORS[color]))
        self.output.append(message)

    def generate_ip(self):
        return ".".join(map(str, [random.randint(0, 255) for _ in range(4)]))

    def generate_password(self):
        # Генерируем более сложные пароли с увеличением уровня
        length = 8 + self.software_level
        chars = "0123456789abcdef"
        if self.software_level > 3:
            chars += "ABCDEF"
        if self.software_level > 5:
            chars += "!@#$%^&*"
        return "".join(random.choice(chars) for _ in range(length))

# Запуск приложения
def main():
    app = QApplication(sys.argv)
    ex = HackerGame()
    sys.exit(app.exec())

if __name__ == '__main__':
    main()

P.S. По настроению буду обновлять и править баги в этой ветке. Да и интерфейс плывет, надо на HTML под pyqt все переделывать.
 

Вложения

  • hacker2.5.zip
    6.8 КБ · Просмотры: 14
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
Зачем PyQt для консольного интерфейса? Взял бы что-то типа textual.
 
Зачем PyQt для консольного интерфейса? Взял бы что-то типа textual.
Мне нужно изучить PyQT

Я пишу с помощью нейронки конечно же, правлю баги где нахожу в функциях, и утечки памяти (крэши), отладчиком гляжу (потом красивый интерфейс сделаю и разбавлю в стиле старой досовской игры "Коммерсанты". :D Ну и за одно с синтаксисом PyQt6 ознакамливаюсь.

Кое что поправил:
1734764006807.png
 

Вложения

  • hackers2.7.zip
    9.9 КБ · Просмотры: 11
Последнее редактирование:
Пожалуйста, обратите внимание, что пользователь заблокирован
На самом деле трудно придумать экономику в игре, и для удобства разбил бы на файлы все, а то тебя потом заебет по коду шароебится, попробуй написать хендлеры к примеру command handler чтоб каждая команда и логика была в отдельном файле для удобства к примеру
 
На самом деле трудно придумать экономику в игре, и для удобства разбил бы на файлы все, а то тебя потом заебет по коду шароебится, попробуй написать хендлеры к примеру command handler чтоб каждая команда и логика была в отдельном файле для удобства к примеру
Сталкиваюсь пока с вылетами.
Ща вроде там кое-какую функцию поправил, 30 мин без вылетов (перезапустил еще раз):
1734766333405.png
 
Последнее редактирование:
Еще если кто-то помнит в 00-х была такая крутая игра Uplink (она щас в стиме вроде даже продается):
1734802695944.jpeg


Я если честно всю жизнь мечтал что-то подобное сделать, но не осилю....думаю (Да и в планах сделать шутеечную русскую хэкер игру, по приколу чтобы было, каждый грабит корованы по-своему, а она будет консольная, люди в шуточной форме будут к командам к терминалу привыкать, так то это тоже полезно, чем сразу линукс себе накатывать на хост, после 20 летнего пребывания под виндой). В игре нашел много багов, пока смысла выкладывать нет. Но поборол вылеты. Этот тред будет вестись медленно по мере моих временных возможностей.
 
Последнее редактирование:
На самом деле трудно придумать экономику в игре, и для удобства разбил бы на файлы все, а то тебя потом заебет по коду шароебится, попробуй написать хендлеры к примеру command handler чтоб каждая команда и логика была в отдельном файле для удобства к примеру
Это по большей части черновик. Я делаю все в одном файле, и свой код читаю хорошо, и чужой нормально. Но если это говорить про петухон или паскаль. Конечно я все сделаю по красоте в финальной версии. =)
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Это по большей части черновик. Я делаю все в одном файле, и свой код читаю хорошо, и чужой нормально. Но если это говорить про петухон или паскаль. Конечно я все сделаю по красоте в финальной версии. =)
а я вот питухон отказываюсь понимать, я не могу, вот js понимаю, а питон в никакую
 
а я вот питухон отказываюсь понимать, я не могу, вот js понимаю, а питон в никакую
Я хорошо только в процедурном стиле программирую, ООП не мое. С паскаля было легко на питон перескачить. C# очень тяжело идет у меня. Поэтому и думаю попробовать Rust.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
а я вот питухон отказываюсь понимать, я не могу, вот js понимаю, а питон в никакую
Питон достаточно простой язык. Его понимать как таковой не надо. Если в процессе разбора скрипта или каких то исходников возникла проблема достаточно просто загуглить или посмотреть документацию. По тому или иному участку кода. На крайняк можешь LLM скормить этот код. Он объяснит что он делает. JavaScript язык Ситхов. Сам дартвейдер его рекомендует.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Питон достаточно простой язык. Его понимать как таковой не надо. Если в процессе разбора скрипта или каких то исходников возникла проблема достаточно просто загуглить или посмотреть документацию. По тому или иному участку кода. На крайняк можешь LLM скормить этот код. Он объяснит что он делает. JavaScript язык Ситхов. Сам дартвейдер его рекомендует.
Дело в том что я синтаксис отказываюсь понимать, я эти табуляций не переношу. А на js пишу как хочу хоть в одну строку код
 
Пожалуйста, обратите внимание, что пользователь заблокирован
А на js пишу как хочу хоть в одну строку код
Открой для себя точку с запятой в Петухоне и будет тебе счастье.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Открой для себя точку с запятой в Петухоне и будет тебе счастье.
Это каким образом? После двоеточие писать выражение еще как бы можно

Пример
Python:
a = b = 0;
def z(x, y):
    for num in range(x, y + 1):
        if num % 2 == 0: a += 1
        else: b += 1
    return a, b

Но как это сделать в одну строку ? к примеру вот эту функцию?

короткие функции еще можно
Python:
def a(x): return x*x
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Но как это сделать в одну строку ? к примеру вот эту функцию?
Оберни в строку и в exec.
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Пожалуйста, обратите внимание, что пользователь заблокирован
Оберни в строку и в exec.
Все равно нужны отступы не работает так. Даже при динамическом создании функции, как ты сказал.

Python:
code="""def n(x, y):for num in range(x, y + 1):if num % 2 == 0:a += 1;else: b += 1;return a, b"""
exec(code)
Он на цикл ругается
 
Пожалуйста, обратите внимание, что пользователь заблокирован
Все равно нужны отступы не работает так. Даже при динамическом создании функции, как ты сказал
Ты не понял, вставь \n, где у тебя были переносы строк и пробелы оставь, как были)
 
Как думаете остаться лучше на старом дизайне и без всяких костылей сначала наращивать функционал:
1734840709481.jpeg


Или продолжить работу и сначала сделать хороший дизайн в приложении, а потом уже браться за реализацию функционала:
1734840620512.png
 
Последнее редактирование:
мсье знает толк в извращениях. Простите, но смесь петуха и кути сложно по другому назвать.
Как уже сказали выше - разнеси код по файлам, открой для себя рефакторинг )
А чтобы интерфейс не плыл - есть такая штука - QSpacerItem - пружинка по другому. Если их правильно расставить, то у тебя будет конфетка. И, таки да, сильно рекомендую посмотреть в сторону QML. Фактически тот же жабаскрипт, но с кутешными плюшками. Правда я никогда не задумывался как его подружить с петухом и возможно ли это в принципе. Погуглю, потом расскажу
 
мсье знает толк в извращениях. Простите, но смесь петуха и кути сложно по другому назвать.
Как уже сказали выше - разнеси код по файлам, открой для себя рефакторинг )
А чтобы интерфейс не плыл - есть такая штука - QSpacerItem - пружинка по другому. Если их правильно расставить, то у тебя будет конфетка. И, таки да, сильно рекомендую посмотреть в сторону QML. Фактически тот же жабаскрипт, но с кутешными плюшками. Правда я никогда не задумывался как его подружить с петухом и возможно ли это в принципе. Погуглю, потом расскажу
Ха-ха-ха. Я был очень пьян, и нафантазировал этого говна перед новым годом. Мне если честно даже стыдно за этот тред, но придется допиливать.:oops:
Пацан сказал, пацан сделал.:D
 


Напишите ответ...
  • Вставить:
Прикрепить файлы
Верх