本次系统的开发由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_()