-프로젝트 멤버


Layer7 15기 - 전현성, 김수민, 장동건, 박상원




-USB 자료 터트리기 알고리즘

 

1. 프로그램이 실행되면 시작프로그램에 자동 등록.

2. 콘솔창을 안보이게 함.

3. 외부 디스크가 있나 체크.

3. 외부 디스크가 있으면 디스크 폴더를 모두 탐색.

4. 탐색하다가 Hwp, pptx, c, html 파일이 나오면 파일을 새로 쓰기 해서 자료를 초기화 시킴.

5. 모든 작업이 끝나면 프로그램을 껏다가 다시 실행시킴(빠르게 껏다 켜서 작업 관리자에서 프로세스 종료 못하도록)

6. 무한 반복 -> 새로운 USB가 꽂히자 마자 자료가 날라감.





-구현방법 (소스)






-레지스트리를 이용하여 시작 프로그램에 등록.

-파일 입출력 함수의 에러 반환을 활용하여 외부 디스크 체크.

-재귀 함수를 활용하여 USB내의 모든 폴더와 확장자를 탐색

-Win Api의 CreateFile 함수로 파일을 새로 쓰기하여 데이터를 지움



공부용으로 사용하시고, 

#악용하지 마세요#

##악용 시 법적책임은 본인에게 있습니다## 

virus.exe



-프로젝트 역할분담


전현성 : 함수화 및 재귀함수를 통한 파일 탐색

김수민 : 콘솔 창 안보이게, 콘솔창 다시 열기

장동건 : 파일 생성, 외부 디스크 체크

박상원 : 시작프로그램 등록



WRITTEN BY
Who1sth1s

,

-프로젝트 멤버


Layer7 15기 - 전현성, 김수민, 문호현, 박상원




-심심이란?



http://www.simsimi.com/talk.htm

사람들이 가르쳐주는 대로 대답을 하는 시스템을 가지고 있다.

원작 심심이 해보기 위 링크


-콘솔창으로 심심이 구현해보기












-구현방법 (소스)






-체계적인 함수화.

-Input과 Output을 동적할당으로 저장함으로서 메모리 절약.

-text를 이용한 데이터의 저장과 불러오기(파일 입출력)

-strstr을 통한 유사 질문 찾기구현.

-Win Api를 통한 콘솔창 디자인




-프로젝트 역할분담


전현성 : Main함수 제작, 함수수정 및 함수화, search함수 제작

김수민 : 파일 입력 및 출력, Log 함수, 아이디어

문호현 : 유사질문 찾기 및, WinApi 함수

박상원 : 콘솔창 입력 및 출력, WinApi 디자인


WRITTEN BY
Who1sth1s

,

-2048 게임이란?


http://gabrielecirulli.github.io/2048/

백번 말하는것 보다 한번 해보는것이 훨 났다.


-콘솔창으로 2048 구현하기








-구현방법 (소스)


 구현할 때 가장 고민한 것이 방향키를 눌러서 같은 수 들을 합쳐줄 때, 방향이 총 4가지가 있는데 어떻게 이것을 처리할 것인가 고민을 하다가 배열을 가상으로 돌리는 방법을 사용해서 해결했다. 

 배열을 해당하는 방향으로 돌렸을 때 열과 행 그리고 방향을 인자로 주면 해당하는 배열에 해당하는 주소를 반환하는 합수를 만들었다.





#include stdio.h
#include time.h
#include conio.h
#include windows.h
#define LEFT 75
#define RIGHT 77
#define UP 72
#define DOWN 80
 
void gotoxy(int x, int y);
void game_start(int map[][17]);
void game_print(int map[][17]);
void number_print(int arr[][4], int score);
void create(int arr[][4]);
int create_check(int arr[][4]);
int dmove(int arr[][4], int d, int *score);
int *arr_tc(int arr[][4],int i,int j,int d);
void game_over(int *score);
 
void main() {
	gotoxy(10, 5); printf("2048 시작하기");
	gotoxy(12, 6); printf("PRESS ANY KEY"); getch();
	int map[17][17];
	game_start(map);//map초기화
	while (true) {//게임 종료시 다시 시작
		int score = 100, input;
		int arr[4][4] = { 0, 2, 2 ,};
		system("cls");//map을 새로그림
		game_print(map);//map을 draw함
		while (true) {//조작
			if (kbhit()) {
				if (getch() == 224) {//특수키
					switch (getch()) {//방향키를 입력받음
					case LEFT:  input = 1; break;
					case UP:    input = 2; break;
					case RIGHT: input = 3; break;
					case DOWN:  input = 4; break;
					}
//더이상 움직일 수없고 배열이 꽉참 -> 게임 오버 -> 게임 재시작
					if (dmove(arr, input, &score)) break;
				}
				number_print(arr, score);//프린트 갱신
			}
		}
	}
}
 
 
 //프린트할 위치
void gotoxy(int x, int y) {
	COORD Pos = { x * 2, y };
	SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), Pos);
}
 
//맵을 초기화함
void game_start(int map[][17]) {
	int arr_temp[17][17] = {
		{ 11, 1, 1, 1, 22, 1, 1, 1, 22, 1, 1, 1, 22, 1, 1, 1, 12 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 21, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 23 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 21, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 23 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 21, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 3, 1, 1, 1, 23 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2, 5, 4, 4, 2 },
		{ 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2 },
		{ 14, 1, 1, 1, 24, 1, 1, 1, 24, 1, 1, 1, 24, 1, 1, 1, 13 }
	};
	int i, j;
	for (i = 0; i < 17; i++)
	for (j = 0; j < 17; j++)
		map[i][j] = arr_temp[i][j];
}
 
//맵을 프린트함
void game_print(int map[][17]){
	int i = 0, j = 0;
	printf("\n    score : %d\n\n", 100);
	for (int i = 0; i < 17; i++){
		printf("      ");
		for (int j = 0; j < 17; j++){
			switch (map[i][j]) {
			case 0: printf("  "); break;
			case 1: printf("─"); break;
			case 2: printf("│"); break;
			case 3: printf("┼"); break;
			case 5: printf("      ");break;
			case 11: printf("┌"); break;
			case 12: printf("┐"); break;
			case 13: printf("┘"); break;
			case 14: printf("└"); break;
			case 21: printf("├"); break;
			case 22: printf("┬"); break;
			case 23: printf("┤"); break;
			case 24: printf("┴"); break;
			}
		}
		printf("\n");
	}
}
 
//숫자를 프린트함
 void number_print(int arr[][4], int score){
	 int i,j;
	 gotoxy(6, 1);
	 printf("%d", score);
 
	 for(i=0;i<4;i++){
		 for(j=0;j<4;j++){
			gotoxy(4+j*4, 6+i*4);
			if (arr[i][j] != 0) {
				printf("%5d ", arr[i][j]);
			}
			else {
			printf("      ");
			}
		 }
	 }
 }
 
//새로운 숫자 생성
void create(int arr[][4]) {
	int locate, number;
	srand(unsigned(time(NULL)));//rand함수 랜덤설정
	if (rand() % 10 < 8) number = 2;//80퍼로 2생성
	else number = 4;// 20퍼로 4생성
	do{
		locate = rand() % 16;
	} while (arr[locate / 4][locate % 4] != 0);//빈칸나올때까직 랜덤
	arr[locate / 4][locate % 4] = number;
}
 
//create가 가능한지 체크
int create_check(int arr[][4]) {
	int i, cnt = 0;
	for (i = 0; i < 16; i++) {
		if (arr[i / 4][i % 4] != 0)
			cnt++;
	}
	if (cnt == 16) return 0;//배열이 꽉참 -> create불가
	else return 1;//creeate가능
}
 
//방향키이동
int dmove(int arr[][4], int d, int *score){
	int i,j, s, check = 0;
	for (i = 0; i < 4; i++) {
		for (j = 0; j < 4; j++) {
			if (*arr_tc(arr, i, j, d) != 0) {
				for (s = j + 1; s < 4; s++) {//뒤와 합치기
					if (*arr_tc(arr, i, j, d) == *arr_tc(arr, i, s, d)) {
						*arr_tc(arr, i, j, d) *= 2;//
						*arr_tc(arr, i, s, d) = 0;
						*score += *arr_tc(arr, i, j, d);//점수 추가
						check++;
						break; 
					}
					else if (*arr_tc(arr, i, s, d) != 0) break;//뒤에 합치지 못하면 종료
				}
 
 
				for (s = j - 1; s >= 0; s--) {//앞에 이동할수 있나 체크
					if (*arr_tc(arr, i, s, d) != 0) {
						break;
					}
				}
				s++;
				if (j != s) {//앞에 이동할수 있으면 정렬
					*arr_tc(arr, i, s, d) = *arr_tc(arr, i, j, d);
					*arr_tc(arr, i, j, d) = 0;
					check++;
				}
			}
 
		}
	}
	// check == 0 -> 더 이상 움직일 수 없음 -> create 안함
	if (create_check(arr)) {
		if (check != 0) {
			create(arr);
		}
	}
	else//더이상 create 불가 시
	{
		game_over(score); 
		return 1;//다시시작
	}
	return 0;
}
 
//배열을 돌림 -> 방향키가 달라도 같은 코드로 조작 가능
int *arr_tc(int arr[][4], int i, int j, int d){
	int ti, tj;
	switch (d) {
	case 1: ti = i; tj = j;   break;
	case 2: ti = j; tj = 3 - i; break;
	case 3: ti = i; tj = 3 - j; break;
	case 4: ti = 3 - j; tj = 3 - i; break;
	}
	return &arr[ti][tj];
}
 
//게임 오버
void game_over(int *score) {
	system("cls");
	gotoxy(10, 5); printf("Game Over");
	gotoxy(10, 6); printf("Score : %d", *score);
	gotoxy(12, 7); printf("PRESS ANY KEY");
	getch();
	getch();
}



WRITTEN BY
Who1sth1s

,