-
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
-
29
-
30
-
31
-
32
-
33
-
34
-
35
-
36
-
37
-
38
-
39
-
40
-
41
-
42
-
43
-
44
-
45
-
46
-
47
-
48
-
49
-
50
-
51
-
52
-
53
-
54
-
55
-
56
-
57
-
58
-
59
-
60
-
61
-
62
-
63
-
64
-
65
-
66
-
67
-
68
-
69
-
70
-
71
-
72
목차
목 차
1. 개 요
2. 개발 목적 및 초점
3. 개발 기간 및 구현 일정
4. 구현 이론 및 내용
5. 구현 내용, 모듈별 설명
6. 프로그램 시뮬레이션 캡쳐 화면
7. 텀 프로젝트를 마치며...
8. Appendix (Program Source Code)
1. 개 요
2. 개발 목적 및 초점
3. 개발 기간 및 구현 일정
4. 구현 이론 및 내용
5. 구현 내용, 모듈별 설명
6. 프로그램 시뮬레이션 캡쳐 화면
7. 텀 프로젝트를 마치며...
8. Appendix (Program Source Code)
본문내용
if ( GameData->user[userid].x > 1 )
if ( !CheckRabbitCrashBlock(GameData->user[userid].y, GameData->user[userid].x-1 ) &&
!CheckRabbitCrashBomb(GameData->user[userid].y-1, GameData->user[userid].x, 2) )
GameData->user[userid].x--;
GameData->user[userid].direc=2;
break;
case UAFLAG_MOVE_RIGHT:
// 오른쪽으로 이동한다.
if ( GameData->user[userid].x < 64 )
if ( !CheckRabbitCrashBlock(GameData->user[userid].y, GameData->user[userid].x+1 ) &&
!CheckRabbitCrashBomb(GameData->user[userid].y-1, GameData->user[userid].x, 3) )
GameData->user[userid].x++;
GameData->user[userid].direc=3;
//printf("Player[%d] move right!\n", userid);
break;
case UAFLAG_SHOT:
// 총알을 생성한다.
if ( !shotdelay[userid] )
{
CreateBullet(userid);
// 다음 발사 까지의 지연 시간 설정
shotdelay[userid]=3;
}
break;
case UAFLAG_BOMB:
// 폭탄을 생성한다.
if ( !bombdelay[userid] )
{
if ( CreateBomb(userid) )
{
// 다음 발사 까지의 지연 시간 설정
bombdelay[userid]=30;
}
}
break;
case UAFLAG_MSG:
// 유저 이름을 포함한 채팅 내용을 쓴다.
UserMsg(actbuf+i+2, actbuf[i+1], userid);
// 문자열의 길이를 가리키는 1바이트와 실제 문자열의 길이 만큼 이동
i+=actbuf[i+1]+1;
break;
}
}
}
}
// 유저의 행동 버퍼에 들어 있는 내용들의 처리
void UserActBufProc(void)
{
register int i;
char actbuf[USERACTBUFSIZE];
static int lastpos[MAXUSER];
int readsize;
for(i=0; i
{
readsize=rbread(actbuf, GameData->user[i].actbuf, USERACTBUFSIZE, GameData->user[i].actbufpos, lastpos+i);
UserAction(actbuf, readsize, i);
}
}
// 맵 데이터를 읽어들인다.
int GetMapData(void)
{
FILE *fp;
int i, j, k;
if ( ( fp = fopen("1.map", "rt") ) == NULL )
return -1;
for(i=0; i < MAPSIZEY; i++)
{
for(j=0; j < MAPSIZEX; j++)
fscanf(fp, "%d", &GameData->mapdata[i][j]);
}
}
// 종료에 관한 시그널이 발생했을때의 처리
void signalHandler(int signo)
{
//공유메모리 삭제
if(shmctl(ShMemID, IPC_RMID, 0) == -1)
{
printf("cannot remove shared memory.\n");
exit(1);
}
exit(0);
}
int main()
{
// shared momory의 생성을 시도 하고 만약 존재 한다면 공유 메모리 ID만 얻어온다.
if ( ( ShMemID = shmget((key_t)SHMEMKEY, sizeof(GAMEDATA), IPC_CREAT | IPC_EXCL | 0666) ) == -1 )
{
perror("Server is already run!\n");
return 0;
}
// shared momory의 주소값을 받아온다
if( ( GameData = (GAMEDATA*)shmat(ShMemID, (void*)0, 0) ) == (GAMEDATA*)-1 )
{
perror("Shared Memory Error!\n");
return 0;
}
// 공유 메모리 초기화
InitGameData();
// 맵 데이터를 읽어들인다.
GetMapData();
//SIGINT에 대한 signal Handler를 선언한다.
signal(SIGINT, signalHandler);
signal(SIGHUP, signalHandler);
while(1)
{
UserActBufProc();
BulletProc();
BombProc();
usleep(25000);
}
return 0;
}
makefile
OBJ= rotatebuffer.o client.o input.o kbproc.o output.o
CR_Client: rotatebuffer.o client.o input.o kbproc.o output.o
gcc -lcurses -o CR_Client $(OBJ)
rotatebuffer.o: rotatebuffer.h rotatebuffer.c
gcc -c -g rotatebuffer.c
client.o: client.c client.h data.h
gcc -c -g client.c
input.o: input.c client.h data.h kbproc.h
gcc -c -g input.c
kbproc.o: kbproc.c kbproc.h
gcc -c -g kbproc.c
output.o: output.c data.h client.h
gcc -c -g output.c
CR_Server: server.o rotatebuffer.o
gcc -o CR_Server server.o rotatebuffer.o
server.o: server.c rotatebuffer.h
gcc -c -g server.c
clean:
rm -f $(OBJ) CR_Server CR_Client
if ( !CheckRabbitCrashBlock(GameData->user[userid].y, GameData->user[userid].x-1 ) &&
!CheckRabbitCrashBomb(GameData->user[userid].y-1, GameData->user[userid].x, 2) )
GameData->user[userid].x--;
GameData->user[userid].direc=2;
break;
case UAFLAG_MOVE_RIGHT:
// 오른쪽으로 이동한다.
if ( GameData->user[userid].x < 64 )
if ( !CheckRabbitCrashBlock(GameData->user[userid].y, GameData->user[userid].x+1 ) &&
!CheckRabbitCrashBomb(GameData->user[userid].y-1, GameData->user[userid].x, 3) )
GameData->user[userid].x++;
GameData->user[userid].direc=3;
//printf("Player[%d] move right!\n", userid);
break;
case UAFLAG_SHOT:
// 총알을 생성한다.
if ( !shotdelay[userid] )
{
CreateBullet(userid);
// 다음 발사 까지의 지연 시간 설정
shotdelay[userid]=3;
}
break;
case UAFLAG_BOMB:
// 폭탄을 생성한다.
if ( !bombdelay[userid] )
{
if ( CreateBomb(userid) )
{
// 다음 발사 까지의 지연 시간 설정
bombdelay[userid]=30;
}
}
break;
case UAFLAG_MSG:
// 유저 이름을 포함한 채팅 내용을 쓴다.
UserMsg(actbuf+i+2, actbuf[i+1], userid);
// 문자열의 길이를 가리키는 1바이트와 실제 문자열의 길이 만큼 이동
i+=actbuf[i+1]+1;
break;
}
}
}
}
// 유저의 행동 버퍼에 들어 있는 내용들의 처리
void UserActBufProc(void)
{
register int i;
char actbuf[USERACTBUFSIZE];
static int lastpos[MAXUSER];
int readsize;
for(i=0; i
readsize=rbread(actbuf, GameData->user[i].actbuf, USERACTBUFSIZE, GameData->user[i].actbufpos, lastpos+i);
UserAction(actbuf, readsize, i);
}
}
// 맵 데이터를 읽어들인다.
int GetMapData(void)
{
FILE *fp;
int i, j, k;
if ( ( fp = fopen("1.map", "rt") ) == NULL )
return -1;
for(i=0; i < MAPSIZEY; i++)
{
for(j=0; j < MAPSIZEX; j++)
fscanf(fp, "%d", &GameData->mapdata[i][j]);
}
}
// 종료에 관한 시그널이 발생했을때의 처리
void signalHandler(int signo)
{
//공유메모리 삭제
if(shmctl(ShMemID, IPC_RMID, 0) == -1)
{
printf("cannot remove shared memory.\n");
exit(1);
}
exit(0);
}
int main()
{
// shared momory의 생성을 시도 하고 만약 존재 한다면 공유 메모리 ID만 얻어온다.
if ( ( ShMemID = shmget((key_t)SHMEMKEY, sizeof(GAMEDATA), IPC_CREAT | IPC_EXCL | 0666) ) == -1 )
{
perror("Server is already run!\n");
return 0;
}
// shared momory의 주소값을 받아온다
if( ( GameData = (GAMEDATA*)shmat(ShMemID, (void*)0, 0) ) == (GAMEDATA*)-1 )
{
perror("Shared Memory Error!\n");
return 0;
}
// 공유 메모리 초기화
InitGameData();
// 맵 데이터를 읽어들인다.
GetMapData();
//SIGINT에 대한 signal Handler를 선언한다.
signal(SIGINT, signalHandler);
signal(SIGHUP, signalHandler);
while(1)
{
UserActBufProc();
BulletProc();
BombProc();
usleep(25000);
}
return 0;
}
makefile
OBJ= rotatebuffer.o client.o input.o kbproc.o output.o
CR_Client: rotatebuffer.o client.o input.o kbproc.o output.o
gcc -lcurses -o CR_Client $(OBJ)
rotatebuffer.o: rotatebuffer.h rotatebuffer.c
gcc -c -g rotatebuffer.c
client.o: client.c client.h data.h
gcc -c -g client.c
input.o: input.c client.h data.h kbproc.h
gcc -c -g input.c
kbproc.o: kbproc.c kbproc.h
gcc -c -g kbproc.c
output.o: output.c data.h client.h
gcc -c -g output.c
CR_Server: server.o rotatebuffer.o
gcc -o CR_Server server.o rotatebuffer.o
server.o: server.c rotatebuffer.h
gcc -c -g server.c
clean:
rm -f $(OBJ) CR_Server CR_Client
소개글