Qt 개인 프로젝트 완료 보고서: 손가락 부스터 ON

2025. 8. 26. 18:02·Qt/Project

 

 

 

 

 

 

 

 

프로젝트 완료 보고서

 

 

 

일정표

 

 

 

메인화면창

 

1. 로그인 버튼

2. 로그인 후 방 생성 버튼 활성화

3. 로그인 후 방 목록 보기 버튼 활성화

4. 로그인 후 빠른 매칭 버튼 활성화

5. 게임 종료 버튼

로그인 성공창
방생성창

 

1. 화면에 있는 정보 입력 후 방 생성 버튼 클릭 시 대기실 전환

2. 취소 버튼 누를 시 메인화면 창으로 전환

대기실창

 

1. 플레이어 준비 버튼

2. 방장일 경우, 모든 플레이어들이 준비 버튼 누를 시 게임 시작 가능

3. 방 나가기 버튼 누를 시 방 생성창으로 전환

방목록창

 

1. 화면에 떠 있는 방 목록를 더블 클릭 or 방 참여 버튼 누를 시 방 참여 가능

2. 새로고침 버튼 클릭시 DB 연동된 방 목록 띄움

3. 뒤로가기 버튼 클릭 시 메인화면창으로 전환

대기실_방입장
대기실_채팅

 

1. 채팅바에 채팅을 입력

2. 엔터나 전송 버튼 누를 시 1번에 쓴 글씨가 채팅바에 띄워짐

대기실_준비
게임화면창

1. 타이핑할 단어 창에 올라온 단어를 채팅바에 입력 후 엔터시 아래 게임 로그창에 점수와 함께 정확도가 뜸

게임화면창_틀린단어입력
게임화면창_다음라운드
게임화면창_포기

1. 게임 중 포기 버튼 클릭시 게임 포기 팝업창 뜸

게임결과창

 

1. 게임 종료 후 메인 메뉴로 버튼 클릭시 메인화면창으로 전환

2. 게임 종료 후 게임 종료 버튼 클릭 시 게임화면이 꺼짐

게임결과창_이길시
게임결과창_패배시
메인화면창_게임 결과창에서 메인 메뉴로 버튼 클릭시 메인화면창으로 전환

 

프로그램 실행 영상

 

유저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);
};

"게임 타이밍 관리. 카운트다운 타이머와 스톱워치로 게임 시간 제한과 기록 측정"

 

 

Typing_Game_소스코드.zip
16.94MB

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

'Qt > Project' 카테고리의 다른 글

Qt 개인 프로젝트 개발 계획서: 손가락 부스터 ON  (2) 2025.08.15
'Qt/Project' 카테고리의 다른 글
  • Qt 개인 프로젝트 개발 계획서: 손가락 부스터 ON
eull
eull
eull 님의 블로그 입니다.
  • eull
    eull 님의 블로그
    eull
  • 전체
    오늘
    어제
    • 개발 환경 (34)
      • Qt (2)
        • API (0)
        • Project (2)
      • MYSQL_Workbench (1)
        • setting (1)
      • Linux_Ubuntu (2)
        • Task (1)
        • Setting (1)
      • C (19)
        • Concept (4)
        • Task (8)
        • Project (1)
        • Study (5)
        • Setting (1)
      • C++ (1)
        • Study (0)
        • Concept (1)
      • Python (6)
        • Task (4)
        • Project (2)
      • 일상 (1)
      • Setting (1)
      • 홍보 (1)
  • 블로그 메뉴

    • 홈
    • 태그
    • 방명록
  • 링크

  • 공지사항

  • 인기 글

  • 태그

    #광주인력개발원#대한상공회의소#상공회의소#인력개발원#청년#일경험#ESG#청년일경험&#160;#오텍캐리어#수당100만원#광주#구직단념#그린#Green#취준생#이력서#취업준비#취업맛집&#160;#취업우수기관#국비교육#대학생#ESG지원형
  • 최근 댓글

  • 최근 글

  • hELLO· Designed By정상우.v4.10.3
eull
Qt 개인 프로젝트 완료 보고서: 손가락 부스터 ON
상단으로

티스토리툴바