Presentation is loading. Please wait.

Presentation is loading. Please wait.

IF(Infinite Fork) 유닉스 시스템 / 정상훈 / 이재형

Similar presentations


Presentation on theme: "IF(Infinite Fork) 유닉스 시스템 / 정상훈 / 이재형"— Presentation transcript:

1 IF(Infinite Fork) 유닉스 시스템 200524365 / 정상훈 200824505 / 이재형
IF Project IF(Infinite Fork) 유닉스 시스템 / 정상훈 / 이재형

2 목차 과제 개요 설계 및 구현 구현물의 평가 과제 수행 기간 과제 구현물의 주요 기능 및 특징 프로그래밍 입력 및 출력 양식
실행 방법 및 결과 설계 내용 구현물의 평가

3 과제 개요 이번 학기 수업시간에 배운 IPC기법을 이용해 프로세스간 통신을 할 수 있는 3인칭 슈팅게임을 구현한다.
유닉스 API 및 Ncurses만을 사용하고, 원격 터미널 환경에서 게임과 채팅을 동시에 할 수 있는 프로그램을 구현한다. 상호간의 역할 분담 및 협동심의 중요성을 깨닫고 이에 필요한 자신의 능력을 개발한다.

4 과제 수행 기간 5월 4 ~ 5일 : 작품 계획 및 아이디어 계획 5월 6 ~ 7일 : 게임 및 채팅 Interface 구현

5 과제 수행 기간(계속)

6 과제 수행 기간(계속) 5월 8 ~ 10일 : 캐릭터 선택화면, 캐릭터 이동, 플레이어 미사일 발사 구현

7 과제 수행 기간(계속)

8 과제 수행 기간(계속)

9 과제 수행 기간(계속) 5월 11일 : 플레이어 정보 (점수, 생명, 파워) 추가, 캐릭터 UFO(Unlimit Fork Offenser) 추가

10 과제 수행 기간(계속)

11 과제 수행 기간(계속) 5월 12일 : 보스 상태 표시 및 보스 캐릭터 추가, 플레이어 폭탄 기능 추가

12 과제 수행 기간(계속)

13 과제 수행 기간(계속) 5월 13 ~ 22일 : 보스 미사일 패턴 구현, 난이도 추가

14 과제 수행 기간(계속)

15 과제 수행 기간(계속) 5월 25 일 : SigInt 발생시 Signal 처리 추가, 채팅 메시지 Race Condition 해결 위한Semaphore 추가, 파워 아이템 추가, 채팅 시 한글 안전하게 지우는 기능 구현

16 과제 수행 기간(계속)

17 과제 수행 기간(계속) 5월 26일 : GAME OVER 화면 구현 및 버그 수정, 생명 아이템 추가

18 과제 수행 기간(계속)

19 과제 수행 기간(계속) 5월 27 ~ 28일 : GAME CLEAR화면, 엔딩 크레딧 추가 및 게임 제작 마무리
5월 29일 : 최종보고서 작성 및 전체마무리

20 과제 구현물의 주요 기능 및 특징 개발 환경 서버 환경 : 전산실 유닉스 서버 (OS : Linux Fedora 10 Version) 클라이언트 실행 환경 : PuTTY 0.59 Version 컴파일러 종류 : GCC Version GUI 환경 : Windows XP SP2

21 과제 구현물의 주요 기능 및 특징 (계속) 기능 게임 방 개설 기능 아이디와 방 번호를 묻는 화면이 나온다.
방 번호 별로 난이도 설정을 한다. (EASY, NORMAL, HARD, LUNATIC) 방 번호는 0~9999 사이의 값을 입력한다.

22 과제 구현물의 주요 기능 및 특징 (계속)

23 과제 구현물의 주요 기능 및 특징 (계속) 게임 화면 출력 및 채팅 기능 게임 화면과 채팅 화면 출력하는 기능
실시간으로 화면 갱신을 위해 Thread 사용 채팅 중 경쟁 모드 발생 시 대비 Semaphore 사용

24 과제 구현물의 주요 기능 및 특징 (계속)

25 과제 구현물의 주요 기능 및 특징 (계속) 보스 구현 및 다양한 미사일 패턴 발사 기능
Thread를 생성해 미사일 좌표를 실시간으로 바꾸면 미사일이 움직이는 효과를 나타낼 수 있다.

26 과제 구현물의 주요 기능 및 특징 (계속)

27 과제 구현물의 주요 기능 및 특징 (계속)

28 과제 구현물의 주요 기능 및 특징 (계속)

29 과제 구현물의 주요 기능 및 특징 (계속) 캐릭터 선택화면과 플레이어 관련 요소 출력 기능
플레이어가 선택 가능한 캐릭터는 총 2가지 (Unix System Attacker, Unlimit Fork Offenser) 오른쪽 INFO창에 방 번호, 접속자 수, 난이도, 사용자 상태, 최고 점수 기록, 현재 점수, 생명, 파워가 표시 된다.

30 과제 구현물의 주요 기능 및 특징 (계속)

31 과제 구현물의 주요 기능 및 특징 (계속)

32 과제 구현물의 주요 기능 및 특징 (계속) 채팅 시 한글 안전하게 지우는 기능
한글 입력 시 입력된 키 조합으로 한글을 완성 시키고 완성된 2byte의 한글을 한번에 서버로 전송한다. 그런데 터미널 설정 상 Backspace키를 누르면 무조건 1byte씩 삭제가 되므로 글자가 깨지게 된다. 입력 받은 문자열의 길이와 문자열을 저장하는 버퍼의 주소만 알고 있으면 마지막 글자를 깨끗이 지울 수 있다. 마지막 문자가 확장코드면 2byte, 아니면 1byte 삭제하도록 구현했다.

33 안 녕 하 세 요 안 녕 하 세 ? 과제 구현물의 주요 기능 및 특징 (계속) 위 한 칸을 1byte라 가정
안 녕 하 세 요 위 한 칸을 1byte라 가정 Backspace 키를 누르면 1byte씩 삭제하므로 안 녕 하 세 ? 이와 같은 결과가 나온다. 마지막 문자가 확장코드인지 확인하고 2byte씩 지울지 1byte씩 지울지 결정하면 문제해결

34 과제 구현물의 주요 기능 및 특징 (계속) 특징 채팅 스크롤 기능
기존 채팅은 5줄 이상 메시지가 출력되고 나면 이전 채팅 내용 확인 불가 스크롤 기능을 추가해 화살표 키를 눌러서 5줄을 더 볼 수 있게 구현(최근 10줄 내용 확인가능)

35 과제 구현물의 주요 기능 및 특징 (계속) 스크롤 기능 추가 전 스크롤 기능 추가 후

36 과제 구현물의 주요 기능 및 특징 (계속) 캐릭터 특수 능력
USA 캐릭터는 오른쪽(왼쪽)으로 계속 이동하면 오른쪽(왼쪽) 벽을 넘어서 왼쪽(오른쪽)에서 다시 나오는 특수 능력이 있다. UFO 캐릭터는 USA 캐릭터보다 폭탄 세기가 크다.

37 과제 구현물의 주요 기능 및 특징 (계속)

38 과제 구현물의 주요 기능 및 특징 (계속) READY 기능
여타 온라인게임 처럼 같은 방에 접속한 사람들이 모두 준비가 되야 게임을 시작 할 수 있다. READY를 하기 위해서는 F5키를 누르면 된다. 모두 READY를 하고 HOST가 READY를 하면 Play로 바뀌고, 엔터키를 누르면 캐릭터 선택 화면으로 넘어간다.

39 과제 구현물의 주요 기능 및 특징 (계속) 엔터키를 누르면 캐릭터 선택 화면으로 이동

40 과제 구현물의 주요 기능 및 특징 (계속) 게임 엔딩 게임을 클리어 하면 GAME CLEAR 메시지가 출력
마지막에 엔딩 크레딧이 올라온다. 엔딩 크레딧은 게임의 재미를 위해 비밀

41 설계 및 구현 IPC 기법을 이용해 프로세스간 통신을 할 수 있는 3인 이상 3인칭 슈팅게임을 구현한다.
유닉스 API 및 Ncurses만을 사용한다. 원격 터미널 환경에서 게임과 채팅을 동시에 할 수 있는 프로그램을 구현한다.

42 설계의 흐름도

43 프로그래밍 입력 및 출력 양식 소스 파일의 구성 head.h, color.c, gamemain.c, interface.c, intro.c, main.c, menu.c, missile.c, print.c, scan.c, sem.c, sig.c, stream.c, system.c, makefile 로 구성되어 있다. 각 파일에 대한 설명은 보고서를 참조

44 프로그래밍 입력 및 출력 양식(계속) 업데이트 할 때마다 백업을 하였으며, 업데이트 내역을 기록했다.

45 프로그래밍 입력 및 출력 양식(계속) 결과물의 입력 게임 모드 일 때 채팅 모드 일 때 방향키 : 캐릭터의 이동
Z키 : 캐릭터 미사일 발사 X키 : 폭탄 사용 Enter키 : 채팅 모드로 전환 채팅 모드 일 때 방향키 ↑↓ : 채팅 창 스크롤 기능 Enter키 : 게임모드로 전환

46 프로그래밍 입력 및 출력 양식(계속) 결과물의 출력 캐릭터는 방향키대로 움직인다. Z키는 미사일을 발사, X키는 폭탄을 발사
폭탄을 사용하면 Power가 줄게 된다. Power가 10 미만이면 폭탄을 사용할 수 없으므로 [P]아이템을 획득해야 폭탄을 사용할 수 있다.

47 실행 방법 및 결과 실행 방법 터미널에서 ifproject를 실행한다. 실행을 하면 다음과 같은 화면이 출력된다.
아무키나 누르면 게임 메뉴로 이동한다.

48 실행 방법 및 결과(계속) 실행 결과

49 실행 방법 및 결과(계속) 각 메뉴의 기능은 다음과 같다.
GAME START : 게임에서 사용할 ID와 방 번호를 입력하는 곳으로 이동한다. HELP : 게임에 사용되는 키 설명 및 방 번호에 따른 난이도 설명도 포함되어 있다. RESET DATA : 최고 점수 기록을 삭제한다. 이 메뉴를 사용하지 않고 게임을 종료하면 최고 점수가 기록되는 Shared Memory가 남게 된다. 단 삭제가 안 됐을 경우에는 다음에 다시 게임에 접속하면 최고 점수가 그대로 기록되어 있다. QUIT : 게임을 종료한다.

50 실행 방법 및 결과(계속) GAME START 메뉴에 들어 갔을 때

51 실행 방법 및 결과(계속) 게임 방 접속 화면

52 실행 방법 및 결과(계속) GAME START를 누르면 ID와 방 번호 입력화면이 나온다. HELP 메뉴에서 설명한 것 처럼 방 번호가 0~9번은 EASY모드, 10~99번은 NORMAL모드, 100~999번은 HARD모드, 1000~9999번은 LUNATIC모드로 방이 생성된다. 그림 22번과 같이 입력하면 NORMAL 모드의 방이 생성된다. ID와 방 번호를 입력 했다면 게임 방에 접속하게 된다. 현재 아무도 READY를 하지 않은 상태이다.

53 실행 방법 및 결과(계속) 모두 다 READY를 한 상태다.

54 실행 방법 및 결과(계속) HOST가 F5를 누른 상태, Play로 바꼈다. 각자 엔터키를 누르면 캐릭터 선택 화면으로 이동한다.

55 실행 방법 및 결과(계속) 캐릭터 선택 화면

56 실행 방법 및 결과(계속) 캐릭터를 남들 보다 먼저 선택 했을 때

57 실행 방법 및 결과(계속) 이제 게임 시작 !

58 실행 방법 및 결과(계속) 다른 플레이어 보다 먼저 죽으면 Observer Mode

59 실행 방법 및 결과(계속) 모든 플레이어가 죽으면 GAME OVER 메시지 출력

60 실행 방법 및 결과(계속) 보스 체력이 일정치 이하거나 캐릭터가 죽을 시 파워 아이템이 나온다.

61 실행 방법 및 결과(계속) 생명 아이템은 보스를 죽이면 나오는 아이템이다.

62 실행 방법 및 결과(계속) 폭탄 사용 시 기체 주변에 이펙트가 형성, 화면에 있는 적 미사일 삭제, 보스 체력 감소, 폭탄 사용하면 Power가 10 감소

63 실행 방법 및 결과(계속) 모든 스테이지를 클리어 하면 GAME CLEAR 라는 메시지가 나오고 Ending Credit이 나온다.

64 설계 내용 게임의 설정 시나리오 : 플레이어가 USA, UFO 로 UNIX 시스템을 침투하는 내용이다. 보스의 이름은 각각 exec() , wait(), fork() 이며, 보스의 Spell 이름은 UNIX 와 관련된 것들이다. 경쟁 설정 : 기본적으로 hi-score 체제가 있다. 난이도별 여태까지의 최고점수가 저장되며, 현재 플레이하는 게임중에서의 최고 점수도 나타내주어 점수경쟁을 유도한다. 죽으면 자신의 파워가 떨어지며, 파워 아이템이 2개가 나온다. 아이템은 점수를 주기 때문에 다른플레이어가 먹을 수 있으므로 최대한 죽지 않아야 좋다. 보스를 클리어하면 점수를 주게되는데, 폭탄을 사용하면 점수를 조금만 받게 되므로, 되도록이면 폭탄을 사용하지 않고 클리어해야 자신에게는 좋다.

65 설계 내용(계속) 전체적인 메모리 활용법 모든 공유메모리는 int 형으로 잡았으며, 배열로 나누어 활용
예) 참여자의 정보를 담는 user 공유메모리 int의 크기를 6*최대 인원 수 만큼 얻음 그 크기 6은 y좌표, x좌표, 상태, 점수, 목숨, 파워가 저장된다.

66 설계 내용(계속) 즉, 1P의 x좌표를 얻고 싶다면 user[0*6+2]를 사용하면 되며, 2P의 점수를 얻고 싶다면 user[1*6+4]를 사용하면 된다. 상태 값에 따른 상태 설명 0 : 방 입장 및 대기모드 1 : READY 모드 (READY를 풀면 다시 0으로 됨) 2 : 캐릭터 선택 중 3 : 캐릭터 선택 다 하고 다른 플레이어 기다리는 중 4 : 1번 캐릭터로 게임 중 5 : 2번 캐릭터로 게임 중 6 : 본인 캐릭터가 죽어서 관전모드 7 : GAME OVER 8 : GAME CLEAR

67 설계 내용(계속) 전체적인 함수의 연계 흐름 파란글씨는 Thread Create로 호출
점선으로 표시된 부분은 직접 함수 연계가 아니라는 것

68 설계 내용(계속) 한글을 안정적으로 지우는 기능 len은 문자열의 길이 len의 감소로 문자를 지우는 역할
문자 마지막에는 NULL 문자 입력 CHECK_EXPANDCODE(x) ( (x) & 0x80) 매크로 함수를 이용해서 확장 코드를 판별

69 설계 내용(계속) 메뉴

70 설계 내용(계속) getch로 키를 입력 받는다.
방향키를 누르면 sel의 값이 바뀌며, 10(Enter키)이나 z키를 누르면 선택된다. sel 값에 따라 메뉴가 선택이 된다. 이 때 sel은 다음에 함수를 호출 할 때 값이 그대로 있어서 이전에 선택한 메뉴에 화살표가 있어야 하기 때문에 static으로 선언했다.

71 설계 내용(계속) 방만들기/입장하기 기능 아이디 / 방 번호 입력 전환코드

72 설계 내용(계속) Enter 키를 눌렀을 때의 코드

73 설계 내용(계속) 입력 받는 것은 채팅과 동일하게 하였으며, 방향키를 누르면 아이디, 방 번호 입력의 전환이 가능하다.
Enter키를 눌렀을 때 모두 입력이 된 상태이면 입장하고, 그렇지 않으면 메시지를 보여준다.

74 설계 내용(계속) 일반 다중 채팅 스크롤 바를 나타내 주는 코드
위 그림은 스크롤 바를 프린트 해주는 코드로, print_chat 함수에 있다. 아래 그림은 방향키를 누르면 스크롤 바 위치를 저장하는 chat_scr 의 값을 변경해주는 코드로 scan 함수에 있다.

75 설계 내용(계속) 화면을 실시간으로 계속 프린트해주는 기능 프린트는 thread로 실행시킨다.
print_chat() 함수와 print_game() 이 있다. print_chat()에서는 채팅내용, 스크롤 바, 방 정보, 접속자리스트, 접속자 상태를 보여준다. print_game()에서는 자신의 정보, 난이도별 전체의 1위 점수, 현재 게임의 플레이어 들 중 최고 점수, 자신의 점수, 목숨, 파워를 나타낸다.

76 설계 내용(계속) print_chat() 코드 중 일부 (왼쪽)와 print_game() 코드 중 일부(오른쪽)

77 설계 내용(계속) 왼쪽 코드는 폭탄 사용 시 나오는 이펙트를 출력한다.
1x1 칸마다 따로 출력하도록 한 이유는 캐릭터가 벽쪽에 있을 수 있기 때문에 그림이 잘리거나 깨지는 것을 방지하기 위함이다.

78 설계 내용(계속) 왼쪽 코드는 플레이어의 미사일을 출력 하는 부분 총알의 파워에 따라 그림이 바뀐다.
l → l l → lll → lAl → AlA → AAA 순으로 바뀐다.

79 설계 내용(계속) 플레이어의 캐릭터를 출력해준다.
플레이어의 상태를 담은 user[i*6+2] 의 값으로 캐릭터 종류를 판별하여 프린트 하고, 가운데 부분의 색깔은 플레이어 번호에 따라 3가지로 나뉜다. (노랑, 초록, 자주)

80 설계 내용(계속) 보스 캐릭터, 체력 막대, 스펠네임, 아이템 드롭, 보스 탄막, 크레딧을 출력하는 코드 부분은 간단하므로 생략했습니다. 자세한 내용은 보고서를 참조

81 설계 내용(계속) 채팅 메시지 입력 각각 한글자는 getch로 받으며, 일반글자를 입력시엔 메시지 뒤에 받은 글자를 붙이는 형태이다. Backspace 를 누르면 1byte 문자와 2byte 문자를 구분해 글자 하나를 뺀다. Enter키를 누르면 while구문을 빠져나가 채팅로그에 업데이트 시킨다. 치트키를 인식하는 부분이 있는데, 입력한 메시지가 치트키명령이면 cheat 값을 1로 바꾸어 채팅로그로 업데이트가 되지 않게 한다.

82 설계 내용(계속) 상하 방향키로 스크롤 바 를 이동시킨다. F5를 누르면 readywin() 함수를 호출한다.

83 설계 내용(계속)

84 설계 내용(계속) 게임중 키보드의 입력 게임 중 게임과 채팅모드의 전환 캐릭터 선택하기 미사일의 움직임
게임 시작 시 값들의 초기화 방에서 나가기 시스템 센서 Ctrl+C 인식 시그널 핸들러

85 설계 내용(계속) 아이템 드랍 및 클리어 점수 게임의 흐름(보스의 등장, 탄막발사) 또 다른 보스의 탄막 함수
자세한 내용은 보고서를 참조

86 구현물의 평가 우수한 사항 채팅 구현에 있어 Ncurses의 함수를 적절히 사용해서 채팅 내용을 스크롤 할 수 있는 기능을 만들었으며, Semaphore를 이용한 안정적인 Echo 서버를 구현했다. Multi-Thread를 적절히 사용해서 실시간으로 채팅 내용이 상대방에게 보이도록 잘 구현했다. 채팅 내용 입력에서 한글을 지울 때 발생하는 글자 깨짐 현상을 하나의 함수를 구현해 한글을 안정적으로 지우는 안정된 기능도 추가 한 것이 우수한 사항이다.

87 구현물의 평가(계속) 게임 구현에 있어 난이도 부분이 아주 우수하다. 난이도 종류를 4가지로 나누어 난이도 마다 적의 미사일 수를 많게 하거나, 더 어려운 미사일 패턴이 날아오도록 잘 구현했다. 흥미도에 있어서도 우수하다. 수많은 적 미사일을 피하는 이 게임의 묘미를 잘 살려 게임이 재미있다. 완성도에서는 우리팀이 롤 모델로 삼았던 ‘동방풍신록’ 게임과 아주 유사하게 만들어서 완성도가 높다고 할 수 있다.

88 구현물의 평가(계속) 각 플레이어당 Thread 를 모두 만들면 사람수에 따라 Thread 로 돌리는 시스템의 속도가 비례해져 버리기 때문에 fork로 생성된 서버에서 Thread 를 생성했다.

89 구현물의 평가(계속) 부족한 사항 Thread 사용이 유난히 많고, 표시하는 개체의 수가 많아서 인지 인터넷이 조금 느려지면 가끔씩 불안정하게 작동 되고, 화면 깜박임 현상이 심하다. 물론, 네트워크가 원활하면 이 부분의 문제는 없다. 그리고, 프로그램 종료 시 터미널 환경이 이상해지는 경우가 있다. Semaphore나 Mutex를 이용해 Multi-Thread 를 효율적으로 제어하지 못한점이 아쉽다. 이 점에서 게임의 완성도를 떨어뜨린 부족한 사항이다.

90 구현물의 평가(계속) 개선할 사항 채팅에서만 Semaphore나 Mutex를 쓸게 아니라 경쟁관계에 있는 Multi-Thread를 제어하는 Semaphore, Mutex를 사용해서 화면 깜박임 현상을 줄이고, 프로그램 종료 시 안전하게 종료 되도록 개선해야 되겠다.

91 Q & A


Download ppt "IF(Infinite Fork) 유닉스 시스템 / 정상훈 / 이재형"

Similar presentations


Ads by Google