프로젝트 완료 보고서
일정표
1. 로그인 버튼
2. 로그인 후 방 생성 버튼 활성화
3. 로그인 후 방 목록 보기 버튼 활성화
4. 로그인 후 빠른 매칭 버튼 활성화
5. 게임 종료 버튼
1. 화면에 있는 정보 입력 후 방 생성 버튼 클릭 시 대기실 전환
2. 취소 버튼 누를 시 메인화면 창으로 전환
1. 플레이어 준비 버튼
2. 방장일 경우, 모든 플레이어들이 준비 버튼 누를 시 게임 시작 가능
3. 방 나가기 버튼 누를 시 방 생성창으로 전환
1. 화면에 떠 있는 방 목록를 더블 클릭 or 방 참여 버튼 누를 시 방 참여 가능
2. 새로고침 버튼 클릭시 DB 연동된 방 목록 띄움
3. 뒤로가기 버튼 클릭 시 메인화면창으로 전환
1. 채팅바에 채팅을 입력
2. 엔터나 전송 버튼 누를 시 1번에 쓴 글씨가 채팅바에 띄워짐
1. 타이핑할 단어 창에 올라온 단어를 채팅바에 입력 후 엔터시 아래 게임 로그창에 점수와 함께 정확도가 뜸
1. 게임 중 포기 버튼 클릭시 게임 포기 팝업창 뜸
1. 게임 종료 후 메인 메뉴로 버튼 클릭시 메인화면창으로 전환
2. 게임 종료 후 게임 종료 버튼 클릭 시 게임화면이 꺼짐
프로그램 실행 영상
주요 코드 설명
※ main.cpp (서버) - 서버 엔트리
int main(int argc, char *argv[]) {
QCoreApplication app(argc, argv);
// 에러 핸들러 초기화
ErrorHandler& errorHandler = ErrorHandler::getInstance();
errorHandler.setLogToFile(true);
// 게임 서버(7777)와 채팅 서버(7778) 동시 운영
TypingGameServer gameServer;
QTcpServer chatServer;
return app.exec();
}
"멀티 포트 서버 운영. 게임과 채팅을 분리해 안전성 확보. 에러 핸들링 시스템 적용"
※ server.h - 게임 서버 헤더
class TypingGameServer : public QObject {
Q_OBJECT
// 클라이언트 세션 관리
struct ClientSession {
QString nickname;
QString currentRoomId;
QString status = "waiting";
QTcpSocket* socket = nullptr;
QDateTime lastActivity;
};
// 핵심 컴포넌트들
QTcpServer* m_tcpServer;
Database& m_database;
ServerChatManager* m_chatManager;
GameLogic* m_gameLogic;
};
"서버 아키텍처 정의. 세션 관리, 데이터베이스, 채팅, 게임 로직 모듈화"
※ server.cpp - 서버 구현부
TypingGameServer::TypingGameServer(QObject *parent) {
// GameLogic 시그널 연결
connect(m_gameLogic, &GameLogic::gameStarted, this, [this](const QString& roomId, const QJsonObject& gameData) {
QJsonObject notification = createResponse("game_started", true);
notification["gameData"] = gameData;
broadcastToRoom(roomId, notification);
});
connect(m_gameLogic, &GameLogic::playerDamaged, this, [this](const QString& roomId, const QString& nickname, int damage, int remainingHP) {
// 실시간 HP 업데이트 브로드캐스트
});
}
"시그널-슬롯 기반 이벤트 시스템. 게임 상태 변화를 실시간으로 모든 클라이언트에 전파"
※ client.h - 클라이언트 헤더
class TypingGameClient : public QWidget {
Q_OBJECT
enum class GameState {
Disconnected, MainMenu, CreateRoom,
RoomList, InRoom, InGame, GameResult
};
// 데이터 구조체들
struct RoomData { /* 방 정보 */ };
struct PlayerData { /* 플레이어 정보 */ };
private slots:
void onConnected();
void handleGameStarted(const QJsonObject& message);
void updatePlayerHP(const QString& nickname, const QJsonObject& playerStatus);
};
"상태 기반 클라이언트 UI. 게임의 각 단계별로 화면 전환과 데이터 관리"
※ gameLogic.h - 게임 로직 헤더
class GameLogic : public QObject {
Q_OBJECT
struct GamePlayer {
QString nickname;
int hp = 100;
int score = 0;
double accuracy = 100.0;
bool isAlive = true;
};
struct GameSession {
QString roomId;
QString difficulty = "normal";
int totalRounds = 3;
QList<GameRound> rounds;
bool isActive = false;
};
signals:
void gameStarted(const QString& roomId, const QJsonObject& gameData);
void playerDamaged(const QString& roomId, const QString& nickname, int damage, int remainingHP);
void gameEnded(const QString& roomId, const QJsonObject& finalResults);
};
"핵심 게임 로직. HP 시스템, 라운드 관리, 점수 계산 등 규칙전담"
※ Database.h - 데이터베이스 관리
class Database {
public:
static Database& getInstance(); // 싱글톤 패턴
// 플레이어 관리
bool createPlayer(const PlayerInfo& player);
PlayerInfo getPlayer(const QString& nickname);
// 방 관리
bool createRoom(const RoomInfo& room);
QList<RoomInfo> getAvailableRooms();
// 게임 결과 저장
bool saveGameResult(const GameResult& result);
QList<GameResult> getPlayerResults(const QString& nickname);
// 매칭 시스템
QString findAvailableRoom();
};
"MySQL 데이터베이스 연동. 플레이어 정보, 방 데이터, 게임 기록을 영구 저장"
※ EorrorHandling.h - 에러 처리 시스템
enum class ErrorLevel { Info, Warning, Error, Critical };
enum class ErrorCategory { Network, Database, Game, Chat, System };
class ErrorHandler : public QObject {
Q_OBJECT
public:
static ErrorHandler& getInstance();
// 카테고리별 전용 로깅
void logNetworkError(const QString& operation, const QString& error);
void logDatabaseError(const QString& operation, const QString& error);
void logGameError(const QString& operation, const QString& error);
// 복구 시스템
bool attemptRecovery(const ErrorInfo& error);
};
#define LOG_ERROR(message) ErrorHandler::getInstance().logError(message, __FUNCTION__)
"통합 에러 관리 시스템. 파일 로깅, 자동 복구, 카테고리별 분류로 디버깅 효율성 극대화"
※ chat.h - 채팅시스템
struct ChatMessage {
QString nickname;
QString message;
QString roomId;
QDateTime timestamp;
QString messageType = "chat"; // chat, system, join, leave
};
class ChatManager : public QObject {
Q_OBJECT
public:
virtual bool sendMessage(const ChatMessage& message) = 0;
void addMessage(const ChatMessage& message);
QList<ChatMessage> getRoomMessages(const QString& roomId) const;
// 시스템 메시지 생성
ChatMessage createJoinMessage(const QString& nickname, const QString& roomId);
ChatMessage createLeaveMessage(const QString& nickname, const QString& roomId);
};
"실시간 채팅 시스템. 방별 채팅, 시스템 메시지, 입장/퇴장 알림 지원"
※ Timer.h - 시간 관리 시스템
class Timer : public QObject {
Q_OBJECT
public:
void startTimer(const QString& timerId, int durationMs);
void pauseTimer(const QString& timerId);
void resumeTimer(const QString& timerId);
signals:
void timerExpired(const QString& timerId);
void timerTick(const QString& timerId, int remainingMs);
};
class Stopwatch : public QObject {
Q_OBJECT
public:
void start(); void stop(); void lap();
int getElapsedTime() const;
QStringList getLapTimeStrings() const;
signals:
void timeChanged(int elapsedMs);
void lapRecorded(int lapTime, int totalTime);
};
"게임 타이밍 관리. 카운트다운 타이머와 스톱워치로 게임 시간 제한과 기록 측정"
'Qt > Project' 카테고리의 다른 글
Qt 개인 프로젝트 개발 계획서: 손가락 부스터 ON (2) | 2025.08.15 |
---|