大一C语言项目实践--小游戏集成开发系统(电子科大程算PBLF)

本次系统的开发由5人组成。最终将球球大作战、进阶贪吃蛇、整活版飞机大战、球球消消乐、坦克大战5款游戏集成为可执行的exe文件

用到Easyx库,PyQt,C语言数据结构(含链表)

这里展示UI部分的代码

import os
import sys
import json
import subprocess
from PyQt5.QtGui import *
from PyQt5.QtWidgets import (
    QApplication, QMainWindow, QWidget, QLabel, QLineEdit, QPushButton, QVBoxLayout, QMessageBox, QGridLayout
)
from PyQt5.QtCore import Qt

USER_DATA_FILE = "user_data.json"


def load_users():
    if os.path.exists(USER_DATA_FILE):
        with open(USER_DATA_FILE, "r") as f:
            return json.load(f)
    return {}


def save_users(users):
    with open(USER_DATA_FILE, "w") as f:
        json.dump(users, f)


# 登录窗口
class LoginWindow(QMainWindow):
    def __init__(self):
        super().__init__()
        self.setWindowTitle("登录")
        self.setGeometry(200, 200, 1600, 760)
        self.setStyleSheet("""
        QWidget {
        background-image: url('2.png');
        background-repeat: no-repeat;
        background-position: center;
    }
    """)
        self.init_ui()

    def init_ui(self):
        widget = QWidget()
        layout = QVBoxLayout()

        self.username_label = QLabel("用户名:")
        font = self.username_label.font()
        font.setPointSize(30)
        self.username_label.setFont(font)
        self.username_label.setFixedSize(200, 60)
        self.username_input = QLineEdit()
        font4 = QFont()
        font4.setPointSize(30)
        self.username_input.setFont(font4)
        self.username_input.setFixedSize(300, 50)
        layout.addStretch()
        layout.addStretch()
        layout.addWidget(self.username_label)

        layout.addWidget(self.username_input)

        self.password_label = QLabel("密码:")
        font2 = self.password_label.font()
        font2.setPointSize(30)
        self.password_label.setFont(font2)
        self.password_label.setFixedSize(150,60)
        self.password_input = QLineEdit()
        font5 = QFont()
        font5.setPointSize(30)
        self.password_input.setFont(font5)
        self.password_input.setFixedSize(300,50)
        self.password_input.setEchoMode(QLineEdit.Password)
        layout.addWidget(self.password_label)
        layout.addWidget(self.password_input)

        self.login_button = QPushButton("登录")
        font3 = self.login_button.font()
        font3.setPointSize(30)
        self.login_button.setFont(font3)
        self.login_button.setFixedSize(400,50)
        self.login_button.clicked.connect(self.login)
        layout.addWidget(self.login_button)

        self.register_button = QPushButton("注册")
        font4 = self.register_button.font()
        font4.setPointSize(30)
        self.register_button.setFont(font4)
        self.register_button.setFixedSize(400,50)
        self.register_button.clicked.connect(self.register)
        layout.addWidget(self.register_button)

        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def login(self):
        username = self.username_input.text()
        password = self.password_input.text()
        users = load_users()

        if username in users and users[username] == password:
            QMessageBox.information(self, "登录成功", f"欢迎,{username}!")
            self.open_game_selection()
        else:
            QMessageBox.critical(self, "登录失败", "用户名或密码错误!")

    def register(self):
        username = self.username_input.text()
        password = self.password_input.text()
        users = load_users()

        if username in users:
            QMessageBox.warning(self, "注册失败", "用户名已存在!")
        else:
            users[username] = password
            save_users(users)
            QMessageBox.information(self, "注册成功", "用户注册成功,请登录!")

    def open_game_selection(self):
        username = self.username_input.text()  # 获取当前登录的用户名
        self.close()
        self.game_selection_window = GameSelectionWindow(username)  # 传递用户名
        self.game_selection_window.show()


# 游戏选择窗口


class GameSelectionWindow(QMainWindow):
    def __init__(self, username):
        super().__init__()
        self.username = username
        self.setWindowTitle("游戏选择")
        self.setGeometry(200, 200, 1600, 853)  # 与登录窗口一致
        self.setStyleSheet("""
        QMainWindow {
            background-image: url('background1.jpg');  /* 设置窗口背景图片 */
            background-repeat: no-repeat;
            background-position: center;
        }
        """)
        self.setWindowFlags(Qt.FramelessWindowHint)
        self.init_ui()

    def init_ui(self):
        widget = QWidget()
        layout = QVBoxLayout()

        # 游戏按钮
        font_button = QFont()
        font_button.setPointSize(20)
        for i in range(1, 6):
            button = QPushButton(f"启动 游戏{i}")
            button.setFont(font_button)
            button.setFixedSize(250, 70)
            button.setStyleSheet("""
                QPushButton {
                    background-image: url('button2.png');  /* 设置按钮背景图片 */
                    background-repeat: no-repeat;
                    background-position: center;
                    color: white;  /* 按钮文字颜色 */
                    border-radius: 10px;
                }
                QPushButton:hover {
                    background-color: rgba(0, 0, 0, 0.2);  /* 悬停时的透明黑背景 */
                }
            """)
            button.clicked.connect(lambda checked, game_id=i: self.launch_game(game_id))
            layout.addWidget(button)

        # 添加弹性空间,确保按钮靠底部
        layout.addStretch(1)

        # 设置整体布局
        layout.setAlignment(Qt.AlignLeft | Qt.AlignBottom)  # 靠左并且靠下
        widget.setLayout(layout)
        self.setCentralWidget(widget)

    def launch_game(self, game_id):
        try:
            # 假设游戏的可执行文件命名为 game1.exe, game2.exe ...
            game_exe = f"game{game_id}.exe"
            subprocess.Popen(game_exe)
            QMessageBox.information(self, "游戏启动", f"正在启动 游戏 {game_id}...")
        except Exception as e:
            QMessageBox.critical(self, "启动失败", f"无法启动 游戏 {game_id}!\n{str(e)}")


if __name__ == '__main__':
    app = QApplication(sys.argv)
    login_window = LoginWindow()
    login_window.setWindowFlags(Qt.FramelessWindowHint)
    login_window.show()
    app.exec_()

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值