Skip to content

chaechaeis/EwhaTicTacToeProtocols

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

2 Commits
 
 
 
 
 
 

Repository files navigation

Project explanation 이 프로그램은 게임 플레이어 간의 통신을 통해 Tic-Tac-Toe 게임을 진행하는 것을 목표로 합니다. Python과 Tkinter을 사용하여 GUI 기반으로 코드가 작성되었습니다. 이 게임은 3x3 크기의 게임 보드에서 두 명의 플레이어가 번갈아가며 자신의 마크를 놓아 먼저 세 개의 마크를 가로, 세로 또는 대각선 방향으로 연속으로 놓으면 승리하는 게임입니다. 이 프로젝트는 peer-to-peer 구조를 가진 아키텍처들이 client-server 프로세스로 동작하는 메커니즘으로 작동되도록 Tic-Tac-Toe 게임 을 구현하였습니다. 또한, ‘_thread’ 모듈을 사용하여 멀티스레딩을 구현하였습니다. 한 스레드는 메시지를 수신하고 처리하고, 다른 스레드는 사용자의 입력을 받아 메시지를 전송합니다. 전체적인 진행 방식입니다. 클라이언트는 서버에 TCP connection으로 연결되어 메시지를 주고 받 습니다. 이때 TCP 소켓을 사용하여 통신합니다. 또한 클라이언트와 서버는 통신하는 메시지가 특 정 형식 즉, ETTTP를 따르는 지 확인합니다. 이를 통해 유효하지 않은 메시지의 전달을 방지합니 다. 클라이언트와 서버는 게임보드의 상태를 계속해서 업데이트하고 다음 수를 놓습니다. 플레이 어 간에 턴을 전환하여 번갈아가며 게임을 진행합니다. 각 턴마다 승리 여부를 확인하여 게임이 종료되었는 지를 확인합니다.

Code Analysis and Explanation

  1. 서버 파일 메인 함수
  • 이 코드는 서버 측의 메인 실행 코드입니다. 서버 소켓을 생성하고 클라이언트의 연결을 기다 립니다. 클라이언트가 연결되면 시작 플레이어를 결정하고, 시작 정보를 클라이언트에게 전송합니 다. 클라이언트로부터 ACK메시지를 수신하고, ACK메시지가 정확한 경우 게임을 시작합니다. 아닌 경우에는 서버 소켓을 닫고 루프를 종료합니다.
  1. 클라이언트 파일 메인 함수
  • 이 코드는 클라이언트 측의 메인 실행 코드입니다. 이 코드는 서버에 연결한 후, 서버로부터 시작 플레이어 정보를 수신받고 ACK메시지를 전송합니다. 그 후에 게임을 시작합니다.
  1. get_move
  • 이 함수는 게임에서 다른 피어로부터 move를 받는 함수입니다. 소켓을 사용하여 메시지를 받 아오고 해당 메시지가 유효한지 확인합니다. Check_msg함수를 호출하여 유효성을 확인합니다. 메 시지가 유효하지 않으면 소켓을 닫고 프로그램을 종료합니다. 메시지가 유효하면 “ACK”메시지를 생성하여 상대 피어로 전송합니다. 이는 메시지가 제대로 수신되었음을 상대 peer에게 알리는 역 할을 합니다. loc 변수에는 다음 이동 위치를 받습니다. 이 값을 동적으로 받아와서 게임 보드를 업데이트하고 턴을 상대편으로 변경합니다.
  1. send_debug
  • 이 함수는 사용자가 디버그 창에 입력한 메시지를 다른 피어에게 전송하는 함수입니다. 이 함 수는 현재 사용자의 턴인지를 확인한 후, 입력 창에서 메시지를 가져와 전송합니다. Self.my_turn 이 False인 경우에는 함수를 종료하고 아무 작업도 수행하지 않습니다. True인 경우에는 입력박스 에서 메시지를 가져옵니다. 메시지에서 “(“와 “)”의 인덱스를 찾습니다. 찾은 경우 해당 인덱스 사 이에 있는 문자열을 좌표값으로 추출합니다. 추출된 좌표 값을 이용하여 loc변수를 설정합니다. 저희는 조건문을 사용하여 n1값에 따라 loc값을 계산하도록 구현하였습니다. 계산된 loc값이 0이 면 해당 위치가 비어 있는지 확인하고, 비어 있지 않으면 소켓을 닫고 프로그램을 종료합니다. 메 시지를 상대 피어에게 소켓을 통해 전송한 후 ACK 메시지를 수신합니다. 수신한 메시지가 “ACK” 인지 확인하고 아니라면 False를 반환하고 함수를 종료합니다. 게임 보드를 업데이트한 후 턴을 변경합니다.
  1. send_move
  • 이 함수는 사용자가 버튼을 클릭해서 선택한 move를 다른 피어에게 전송하는 함수입니다. 이 함수는 선택된 버튼을 기반으로 row값과 col 값을 계산한 후, 해당 값을 메시지에 포함시켜 전송 합니다. 생성된 메시지를 소켓을 통해 상대 피어에게 전송합니다. Ack 메시지를 수신하고 메시지 가 “ACK”가 맞는 지 확인합니다. True를 반환하여 메시지가 성공적으로 전송되었음을 나타냅니다.
  1. check_result
  • 이 함수는 서로의 결과가 같은지 확인하는 함수입니다. Get 매개변수가 False인 경우는 이 사 용자가 승자인 경우로 먼저 결과를 보고해야 합니다. 사용자가 패배한 경우 상대 피어로부터 결 과를 수신합니다. 수신한 결과와 본인의 결과가 같은지 비교하여 같다면 true 틀리면 False를 반 환합니다. 사용자가 승리한 경우 사용자의 결과를 상대 피어에게 전송합니다. 상대 피어로부터 결 과를 수신받아 수신한 결과와 본인의 결과를 비교합니다. 동일하면 True를 반환하고 그렇지 않으 면 False를 반환합니다.
  1. check_msg
  • 이 함수는 수신한 메시지가 ETTTP 형식인지, 올바른 IP주소인지 확인하는 함수입니다. Msg가 "SEND ETTTP/1.0\r\n"로 시작하지 않는 경우 ETTTP 형식이 아니므로 False를 반환합니다. "Host:" 문자열을 찾은 후, IP 주소가 있는 위치(ip_start)와 IP 주소의 끝 위치(ip_end)를 찾습니다. Ip_start 는 Host:다음의 인덱스를 나타냅니다. Ip_end는 “\r\n” 을 찾은 인덱스를 나타냅니다. 만약 ip_start가 -1이거나 ip_end가 -1인 경우: IP 주소가 올바른 형식이 아니므로 False를 반환합니다. 수신한 IP주소를 msg[ip_start:ip_end].strip()을 사용하여 추출합니다. 추출된 IP주소와 수신받은 IP 주소(recv_ip)와 동일한지 확인합니다.

About

No description, website, or topics provided.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published

Languages