일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | ||||||
2 | 3 | 4 | 5 | 6 | 7 | 8 |
9 | 10 | 11 | 12 | 13 | 14 | 15 |
16 | 17 | 18 | 19 | 20 | 21 | 22 |
23 | 24 | 25 | 26 | 27 | 28 |
- virtual function table
- dynamic_cast
- 더 지니어스 양면포커
- pointer to member data
- std::cout
- vector size
- diamond inheritance
- std::vector
- member function pointer
- vector capacity
- c++ multi chatting room
- return by reference
- virtual function
- operator overloading
- delete function
- virtual inheritance
- suffix return type
- std::ostream
- C++
- conversion constructor
- new&delete
- discord bot
- this call
- std::endl
- base from member
- increment operator
- placement new
- virtual destructor
- c++ basic practice
- constructor
- Today
- Total
목록Toy Project/Two Faced Poker (10)
I'm FanJae.

1. 주요 구현 로직 - 카드 비교 로직- CALL, RAISE 상황에 따른 처리2. Server 처리- 카드 비교 로직GameType Room_Manager::compareCard(const SOCKET socket, BetType bet_type){ BetType bet_type_info[2] = { BetType::NONE, BetType::NONE }; int user_card_info[2] = { 0 }; int vs_card_info[2] = { 0 }; for (auto& pair : users) { auto& user = pair.second; if (pair.first == getUserNumberFromSocket(socket)) { bet_type_info[0] = user..
1. 주요 구현 로직 (Server)- 게임 시작- 칩 정보 업데이트 및 기본 베팅 처리- 카드 배분- 베팅 처리2. Server 처리 (게임 시작 Event)2-1. 게임 시작if (roomManager->All_User_Start_Ready_State()){ send_message = GAME_CLIENT_EVENT + START + DONE; roomManager->broadcast_Message(send_message, socket, TargetType::ALL); gameInit(socket, InitType::INIT); send_message = GAME_CLIENT_EVENT + GAME_INIT; roomManager->broadcast_Message(send_message, socket..
1. 주요 구현 로직 (Client)- 게임 시작- 칩 정보 업데이트 및 기본 베팅 처리- 카드 배분- 베팅 처리2. Client 처리 (게임 시작 Event)2-1. 게임 시작 private void ChattingRoom_Form_KeyDown(object sender, KeyEventArgs e) { if (this.isGamePlaying == false && IsSocketConnected(socket)) { if (e.KeyCode == Keys.F5 && My_Ready.Text == "") // F5를 눌렀을때 { string request = Constants.ROOM_EVENT + Constants.USER_READY_S..
1. 연관 포스트https://fanjae.tistory.com/129 [Two Faced Poker] 5. Server 리팩토링 I. 대공사1. Server 리팩토링을 결심한 이유① Client_Event_Handler와 Game_Manager간의 독립적인 클래스라고 하기에 다소 모호한 설계 구조 개선- 기존 내가 만들었던 Client_Event_Handler는 거의 대부분의 Event를 처리하fanjae.tistory.com- 이 포스트에서 서버에 대한 대공사를 진행했다. 클라이언트 쪽도 이에 맞게 적당히 수정을 진행하였다.2. 클라이언트 수정 사항 ① PacketHandler 추가public static string ReceivePakcet(Socket clientSocket){ string..
1. Server 리팩토링을 결심한 이유① Client_Event_Handler와 Game_Manager간의 독립적인 클래스라고 하기에 다소 모호한 설계 구조 개선- 기존 내가 만들었던 Client_Event_Handler는 거의 대부분의 Event를 처리하고 있다.- Message 수신 자체는 Client_Event_Handler가 담당하더라도 다른 Manager들이 이를 처리하도록 개선하였다.② 서버가 상태 값을 가지고 있지 않음으로써 발생하는 문제 해소.- 준비 / 완료등을 Client 가 보는 기준에서 처리하는 것은 옳지 않다고 생각해서.. 바꿔보고자 한다.- Client에서 보낸 메시지를 검증을 하더라도 이 부분은 서버가 반드시 가지고 있어야 한다.③ Packet의 Header 정보 부재- TC..

1. 결과물- 상대방이 접속하면 ID와 준비 여부가 나오도록 처리했다.- 생각보다 이 과정에서 고전을 많이했다. (준비중)2. 서버 처리① Getter() 추가static std::map> chatRooms;static std::map Room_count;const std::map>& GetChatRooms() { return chatRooms;}const std::map& GetRoomCounts() { return Room_count;}- GameManager에서 사용할 용도로 getter를 만들기로 했다.- static 특성을 그대로 유지하기 위해서이다. ② 방에 유저가 입장했을 때, 기존 유저가 새로 들어온 유저의 ID 값을 얻어오기for (SOCKET target_socket : chatRoom..

1. 방 로직 개선 1-1. 방의 인원수 제한 처리① 생성 - 앞서 포스트에서 다뤘던 것처럼 현재 방에서는 방의 인원수 제한 처리가 필요했다.- 관전자를 추가할까 고민하였으나, 우선은 관전자가 없는 형태로 처리할 것이다. chatRooms[message].insert(socket);Room_count[message] = 0;std::shared_ptr roomGameManager = std::make_shared(roomName);gameManagers[roomName] = roomGameManager;send_message = roomName;- 방을 생성할 때 Room_count를 초기화 한다.- 현재 서버의 Logic에 의해서 방을 생성시 입장도 동시에 일어나기 때문에 입장하는 부분에서 Room_..

1. Server 로직 개선 1-1. 서버 입장 및 퇴장시 ID 정보 처리.- 입장 처리if (chatRooms.find(roomName) != chatRooms.end()){ send_message = roomName; chatRooms[message].insert(socket); for (SOCKET target_socket : chatRooms[this->roomName]) { if (socket != target_socket) { join_message = this->ID + " Joined."; send(target_socket, join_message.c_str(), join_message.length(), 0); } }}else{ send_message = NOT_EXIST_RO..

1. Client 및 Server 정보- 기본적인 서버는 이전에 구현했던 서버와 코드를 활용하였다.- Github(Server)- Github(Client)2. 서버 정보 (게임 관련 필요 정보) 2-1. 게임에 필요한 기본적인 정보 추가(foundation.h)// 유저 이름과 승리 횟수 표기class User{private: std::string name; int winCount; int chips;public: User(std::string name, int winCount) : name(name), winCount(winCount), chips(0) { } std::string getName() const { return name; } int getwinCount() const { retur..
1. 프로젝트 선택 이유- 이전부터 이 게임을 한번 구현해보고 싶었는데 마침 User vs User로 붙는 형태로 제작한 사람이 없었다.- 따라서, 기존에 진행했던 Multi Room Chatting Server를 잘 활용해서 이 프로젝트에서 이용해 보려고 한다. 2. 개발 환경- 언어 : C++ (Server), C#(Client)- 운영체제 : Windows 3. 서버 아키텍처- 클라이언트-서버 모델- 프로토콜 : TCP/IP- 서버는 멀티 스레드 방식으로 다중 클라이언트의 요청을 처리한다. 4. 라이브러리C#(UI) : Windows FormsC++ : std::thread ※ 양면 포커의 룰은 더 지니어스:블랙가넷/4화를 기준으로 만들 예정이다.링크 : 규칙 관련 링크(나무위키)